真正有效的防护是切断勒索软件落地、执行、写入的能力链:一、根文件系统彻底只读(--read-only+tmpfs);二、宿主机对挂载的敏感二进制设chattr +i;三、seccomp/AppArmor限制危险系统调用;四、构建阶段隔离敏感二进制,避免运行时存在。

直接修改镜像层文件系统属性无法防止运行期篡改——因为镜像层(image layers)在容器启动后是只读的,但容器实际运行时挂载的是可写层(如 overlay2 的 upperdir),敏感二进制文件若被复制或解压到容器可写路径(如 /app, /tmp, 或 volume 挂载点),就脱离了镜像层保护,面临被勒索软件覆写、加密或删除的风险。
真正有效的防护不是“改镜像层属性”,而是切断勒索软件在容器内落地、执行、写入的能力链。重点在三处:文件系统挂载控制、进程权限收敛、运行时行为拦截。
一、让容器根文件系统彻底只读(ro rootfs)
这是最基础也最关键的防线。即使镜像本身含敏感二进制(如 license-checker、密钥工具),只要不给它写入路径,勒索软件就无法覆盖或替换。
docker run --read-only \ --tmpfs /run:rw,size=64m,mode=0755 \ --tmpfs /tmp:rw,size=64m,mode=1777 \ -v /proc:/proc:ro \ -v /sys:/sys:ro \ your-image
-
--read-only强制整个容器根文件系统为只读(包括所有镜像层 + init layer) - 所有需要写的路径(如
/tmp,/run,/var/run)必须显式用--tmpfs或volume挂载,并限定大小与权限 -
/proc和/sys以只读挂载,防篡改运行时状态
✅ 效果:
/usr/bin/lictool这类二进制文件无法被mv /malware /usr/bin/lictool覆盖;chmod +x /tmp/.payloader后也无法写入磁盘(因/tmp是 tmpfs 内存卷,重启即失)
二、限制敏感二进制所在路径的文件系统属性(仅适用于宿主机挂载场景)
若你必须通过 -v /host/path:/container/path:ro 方式挂载含敏感二进制的目录(例如硬件授权工具),可在宿主机提前锁定其不可变属性:
# 在宿主机上(需 root) chattr +i /host/path/lictool.bin chattr +a /host/path/logs/ # 日志类仅追加 lsattr /host/path/lictool.bin # 输出应含 i 标志
-
+i(immutable)使文件无法被修改、删除、重命名,连 root 也无法绕过(除非先chattr -i) - 此法仅对绑定挂载(bind mount)有效;对镜像内置文件无效(因镜像层不支持 chattr)
⚠️ 注意:不要对 /etc/passwd 等动态文件加 +i,否则容器初始化失败。
三、运行时强制进程无权修改关键路径(LSM + seccomp)
光靠只读挂载还不够——勒索软件可能利用漏洞提权后 mount --remount,rw /。需叠加内核级防护:
-
启用
noexec,nosuid,nodev挂载选项(尤其对 tmpfs 和 volume):docker run -v secure-bin:/bin:ro,noexec,nosuid,nodev your-image
-
使用 seccomp profile 禁用危险系统调用:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "names": ["openat", "mkdirat", "unlinkat", "renameat"], "action": "SCMP_ACT_ERRNO" } ] }阻断对任意路径的创建/删除/重命名操作,直接让勒索软件无法“落盘”或“加密文件”。
配合 AppArmor/SELinux 策略(如
deny write /usr/bin/**),进一步限制路径写入粒度。
四、避免敏感二进制落入可写上下文(构建阶段就隔离)
最根本的预防:别把敏感二进制放运行时容器里。
- 构建时用多阶段 Dockerfile,仅在 builder 阶段解压/校验 license 工具,最终镜像只保留校验结果或哈希值;
- 敏感二进制由宿主机通过
--security-opt apparmor=restricted-bin或 KMS 解密后挂载为只读 tmpfs; - 使用
docker build --secret加载并临时解密,全程不落盘。
示例(Dockerfile):
# 构建阶段:校验不打包
FROM alpine AS builder
RUN apk add --no-cache curl && \
curl -sSL https://example.com/lictool-v2.1.bin --output /tmp/lictool && \
sha256sum /tmp/lictool | grep 'a1b2c3...' || exit 1
# 运行阶段:零敏感二进制
FROM scratch
COPY --from=builder /tmp/lictool /bin/lictool # 只拷贝已验证的
# ……但更推荐:根本不拷,由外部注入不复杂但容易忽略。

















