精简系统没有 getenforce/sestatus,如何检测 SELinux?

未分类 3 浏览 1 分钟阅读

问题背景

在渗透测试中,有时会遇到非常精简的 Linux 系统(如嵌入式设备、容器、BusyBox 环境),这些系统可能没有安装 SELinux 的管理工具:

  • 没有 getenforce 命令
  • 没有 sestatus 命令
  • 没有 /sys/fs/selinux 目录
  • mount 也找不到 selinux 相关信息

这种情况下,如何判断系统是否开启了 SELinux?

解决方案

方法一:读取内核状态文件

这是最直接的方法。SELinux 运行时会在 /sys/fs/selinux 挂载一个文件系统,但如果目录不存在,基本可以确定 SELinux 未启用。

# 检查 enforce 状态文件
cat /sys/fs/selinux/enforce

结果解读:

  • 输出 1Enforcing(强制模式,已启用)
  • 输出 0Permissive(宽容模式,已启用但只记录不拦截)
  • 文件不存在 → Disabled(未启用)

方法二:检查内核启动参数

如果方法一失败,可以通过内核启动参数进一步确认:

cat /proc/cmdline

查找以下参数:

  • selinux=0 → 明确禁用
  • enforcing=0 → 设为宽容模式
  • 如果没有这些参数 → 通常默认启用(取决于编译配置)

方法三:检查文件系统挂载点

即使目录不存在,也可以检查是否尝试挂载过:

ls -ld /sys/fs/selinux
mount | grep selinux

方法四:检查 SELinux 相关内核模块

如果系统编译了 SELinux 作为模块,可以检查模块是否加载:

lsmod | grep selinux

完整检测脚本

#!/bin/sh
echo "=== SELinux 状态检测 ==="

# 方法1:检查 enforce 文件
if [ -f /sys/fs/selinux/enforce ]; then
    status=$(cat /sys/fs/selinux/enforce)
    if [ "$status" = "1" ]; then
        echo "✅ Enforcing(强制模式)"
    else
        echo "⚠️ Permissive(宽容模式)"
    fi
    exit 0
fi

# 方法2:检查内核参数
if grep -q "selinux=0" /proc/cmdline; then
    echo "❌ 已通过内核参数明确禁用"
elif grep -q "enforcing=0" /proc/cmdline; then
    echo "⚠️ 已通过内核参数设为宽容模式"
else
    echo "❓ 未检测到 SELinux,可能未编译或未启用"
fi

实际测试结果

根据一次嵌入式设备测试的实际结果:

测试命令:getenforce → 无此命令
测试命令:sestatus → 无此命令
测试命令:ls /sys/fs/selinux → 目录不存在
测试命令:mount | grep selinux → 无输出

结论: 系统未开启 SELinux。

安全影响分析

如果确认系统未开启 SELinux,意味着该系统缺少了 MAC(强制访问控制) 这一层重要防护:

  • 即使通过 SUID 漏洞获得 root 权限,也没有额外的访问控制限制
  • Root 用户可以访问任意文件,包括 /etc/shadow
  • 需要依靠传统的 DAC(自主访问控制)来保护系统

扩展:检查 AppArmor

有些系统可能使用 AppArmor 作为替代方案:

ls -d /sys/kernel/security/apparmor 2>/dev/null && echo "AppArmor 已开启" || echo "AppArmor 未开启"

参考命令:

  • getenforce – 最简方式
  • cat /sys/fs/selinux/enforce – 文件方式
  • cat /proc/cmdline – 启动参数方式

0

  1. This post has no comment yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注