严重级别: 严重 (CVSS 9.8)
组件: opencontainers/runc (libcontainer)
漏洞类型: CWE-59: 在访问文件前未正确解析链接('链接跟随')
runc 的 maskPaths 函数存在一个严重漏洞。当在容器内屏蔽敏感路径(如 /proc/kcore)时,runc 使用了 os.OpenFile(path, O_PATH, 0) 但没有添加 O_NOFOLLOW 标志。这允许恶意容器进程将目标路径替换为指向敏感主机文件(例如 /etc/shadow)的符号链接,导致 runc 对主机文件而不是容器路径执行挂载操作。
附带的 exploit.go 演示了允许此绕过操作的内核行为。
在 Linux 环境(或者具备 CAP_SYS_ADMIN 权限的容器中(若测试递归操作))编译并运行:
go run exploit.go
// Vulnerable Code Pattern in runC:
// 1. Path is typically provided as a string (e.g. from config)
// 2. runC calls os.OpenFile(path, O_PATH...)
// 3. MISSING: unix.O_NOFOLLOW flag
// Result: Kernel follows symlink if attacker swapped the path.
需要补丁:
更新 libcontainer/rootfs_linux.go,在打开用于屏蔽的目标路径时包含 unix.O_NOFOLLOW。
- dstFh, err := os.OpenFile(path, unix.O_PATH|unix.O_CLOEXEC, 0)
+ dstFh, err := os.OpenFile(path, unix.O_PATH|unix.O_CLOEXEC|unix.O_NOFOLLOW, 0)
exploit.go: 使用 Go 编写的功能性概念验证代码。analysis.md: 关于竞态条件的详细技术分析。cve_draft.md: 提交用的报告模板。免责声明: 此代码仅用于安全研究和教育目的。