问题背景
在渗透测试中,有时会遇到非常精简的 Linux 系统(如嵌入式设备、容器、BusyBox 环境),这些系统可能没有安装 SELinux 的管理工具:
- 没有
getenforce命令 - 没有
sestatus命令 - 没有
/sys/fs/selinux目录 mount也找不到 selinux 相关信息
这种情况下,如何判断系统是否开启了 SELinux?
解决方案
方法一:读取内核状态文件
这是最直接的方法。SELinux 运行时会在 /sys/fs/selinux 挂载一个文件系统,但如果目录不存在,基本可以确定 SELinux 未启用。
# 检查 enforce 状态文件
cat /sys/fs/selinux/enforce
结果解读:
- 输出
1→ Enforcing(强制模式,已启用) - 输出
0→ Permissive(宽容模式,已启用但只记录不拦截) - 文件不存在 → 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