CVE-2018-15664漏洞分析报告

  近日来自SUSE的安全专家Aleksa Sarai公布了编号为CVE-2018-15664的docker相关高危安全漏洞,该漏洞的CVSS评分为8.7,影响面涵盖所有docker发行版本,攻击者可利用该漏洞逃逸出容器读取或篡改host或其他任意容器内的文件,当前docker官方已经给出了临时方案以降低攻击面并将于下个release版本发布。

漏洞描述

  该漏洞的根因是使用FollowSymlinkInScope函数时触发TOCTTOU(time-of-check-to-time-of-use) 文件系统的竞争条件缺陷引起的。这段函数代码在docker源码中使用较多,最为直接的就是docker cp命令。根据Sarai的描述:FollowSymlinkInScope的作用是解析容器中运行进程的文件路径,而攻击者可以利用解析校验完成后和操作执行间的空隙修改cp文件为一个符号链接对应的目标文件,这样理论上该攻击者可能会以root身份访问到host上或其他容器内的任意文件。
  根据官方说明,攻击者首先要拥有docker cp命令的使用权限和目标容器的访问权限,且攻击只可能发生在拷贝过程中解析文件完成到执行copy动作的毫秒级窗口内。攻击具备一定的难度和相当的专业背景,因此docker容器的相关使用者也不必过于惊慌,下面我们介绍此次漏洞的相关修复进展。

修复措施:

  所幸”docker cp”命令是此次漏洞影响范围内唯一暴露的对外接口,docker社区也很快给出了临时性的修复方案,在该方案中,官方建议用户在使用docker cp命令前执行docker pause命令,并在结束cp命令后执行docker unpause。在下个月的release版本中,pause和unpause命令会被自动加入到cp命令的运行过程中,通过冻结容器的方式阻断copy过程中对容器文件数据的篡改。
  同时,Sarai也指出了该漏洞的根本修复方法在于修改chrootarchive中的归档逻辑,需要使用root作为容器的rootfs(而不是父目录,因为其可能已经被攻击者控制)。因为chrootarchive属于docker底层源码,改动会影响如Tar/Untar等多个相关接口,因此至今还没有根本性的修复,不过当前相关修复已经有了pr提交,相信社区也已有了相应的补丁计划。另外Sarai也提出了在内核层面的修改方案,当然这样的底层修改短期内应该不会被应用到docker对该漏洞的修复中去。

短期如何防范:

  此次漏洞的攻击前提是攻击者拥有docker cp命令的使用权限,阿里云容器服务集群默认开启了基于RBAC的访问控制,非法用户是没有cp命令在容器内的访问权限的。对于可能非法获得cp命令访问权限的攻击者,我们给出如下几个建议:

1) 控制docker cp命令的使用
2) 在使用docker cp命令的前后执行docker pause和docker unpause
3) 合理利用如AppArmor等工具限制容器内对host上敏感目录的访问权限并监控相关审计

上一篇:Android2.2 API 中文文档系列(6) —— ImageView


下一篇:[Java Concurrent] 多线程合作 wait / notifyAll 的简单案例