CVE-2019-11246
背景:同一功能点的三次安全事件
kubectl cp 的工作流程是:在容器内运行 tar 打包文件,传输到本地后由 kubectl 解压。如果容器内的 tar 被攻击者控制,它就能构造任意 tar 包内容。围绕这一信任模型,依次出现了三个漏洞:
- 第一次:CVE-2018-1002100*
攻击者在 tar 条目中使用../../路径,直接跳出目标目录。修复方式是在解压前调用clean函数,剥离路径中的../序列。 - 第二次:CVE-2019-1002101*
攻击者发现clean只检查字符串,不解析符号链接。于是构造一个符号链接link指向~/.ssh,再放入文件link/authorized_keys。路径字符串中没有../,通过检查;但文件系统在写入时跟随符号链接,最终写入了~/.ssh/authorized_keys。修复方式是在创建符号链接时,检查其目标路径是否在允许的目标目录内。 - 第三次:CVE-2019-11246*
由 Atredis Partners 的 Charles Holmes 在 CNCF 资助的安全审计中发现。他意识到,CVE-2019-1002101 的符号链接目标检查是单层的、静态的,而文件系统的路径解析是动态的、可组合的。利用这一落差,攻击者可以构造两个符号链接的组合,使最终的文件写入路径逃逸出目标目录。
漏洞原理
CVE-2019-11246 是 kubectl cp 中 CVE-2019-1002101 修复不完整导致的绕过。标准形态很简单:恶意容器的 tar 包中包含一条指向敏感目录的绝对路径符号链接(如 link → /home/user/.ssh),以及一个普通文件条目(如 link/authorized_keys)。解压时,之前的修复未能正确阻止绝对路径符号链接的创建,文件系统随后跟随该链接,将文件写入 /home/user/.ssh/authorized_keys
漏洞复现
生成恶意 tar + tar 劫持脚本

创建恶意 pod

注入 + 劫持

触发并验证逃逸
