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

问题背景

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

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

解决方案

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

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

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

结果解读:

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

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

cat /proc/cmdline

查找以下参数:

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

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

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(强制访问控制) 这一层重要防护:

扩展:检查 AppArmor

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

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

参考命令: