为什么要裁剪文件系统模块
内核自带大量文件系统驱动,其中相当一部分在本机永远不会用到,例如 cramfs、hfsplus。攻击者拿到普通权限后常利用这些模块挂载精心构造的镜像来触发内核漏洞完成提权:把用不到的模块列入黑名单,等于先一步撤掉这条路径。
基本信息
| 适用平台 | Linux(各主流发行版) |
|---|---|
| 实现方式 | /etc/modprobe.d 中写 install <模块> /bin/true |
| 配套动作 | 卸载已加载模块,防止黑名单只对后续加载生效 |
| 基线 | 按实际使用裁剪,不照抄清单 |
典型使用场景
- 最小化加固:只在用途明确的服务器上裁剪,减少可被利用的内核代码路径
- CIS 基线落地:相关条目是最常被检查的模块裁剪要求之一
- 容器宿主:宿主上减少无用模块对容器逃逸类攻击同样有意义
- 介质业务流程核查:确认机器是否真的需要读光盘或 UDF 介质
黑名单写法(按实际使用裁剪)
黑名单写法(按实际使用裁剪)
# 逐个模块声明为不可加载
cat > /etc/modprobe.d/99-blacklist-fs.conf <<'EOF'
install cramfs /bin/true
install freevxfs /bin/true
install jffs2 /bin/true
install hfs /bin/true
install hfsplus /bin/true
install udf /bin/true
EOF
# 卸载已经加载的模块
modprobe -r cramfs freevxfs jffs2 hfs hfsplus udf 2>/dev/null || true
# 核查是否仍在加载
lsmod | grep -E 'cramfs|hfs|udf|jffs2' || echo '未加载'模块与场景对照
| 模块 | 典型用途 | 处置建议 |
|---|---|---|
| cramfs | 老式只读压缩文件系统 | 一般机器可禁用 |
| hfs / hfsplus | 苹果文件系统 | 无跨平台介质需求时禁用 |
| udf | 光盘与部分大容量介质 | 有光驱或介质流程的机器不要禁 |
| squashfs | snap 包与容器镜像常用 | 多数发行版不能禁,需按环境判断 |
| jffs2 / freevxfs | 嵌入式与老式文件系统 | 服务器上通常可禁用 |
CIS 清单常包含 squashfs,但 Ubuntu 的 snap 与部分容器工具依赖它:照抄标准会直接把系统弄坏,必须按发行版与实际用途裁剪。
黑名单对早期引导阶段加载的模块可能不生效:敏感环境要同步检查 initramfs 配置,避免加固被引导阶段绕过。
裁剪前先盘点真实使用情况:用 findmnt 查当前挂载类型与历史操作记录,比按清单猜测更可靠。