On-entry container attack - CVE-2016-9962

Public Date: January 17, 2017, 10:30
已更新 January 17, 2017, 10:30 - English(英语) French Japanese Korean
Resolved 状态
Important Impact

在 docker 中发现容器进入时(on-entry)漏洞,并为其分配 CVE-2016-9962。 这个缺陷阐述了使用 ptrace 以及错误清除的文件描述符进行的具体攻击,以便在容器外获取对内容的访问。只有运行特权容器时这个攻击才有风险,且 SELinux 可缓解此风险。

这个问题于 2017 年 1 月 10 日正式披露。

背景资料

当某个通常在某个命名空间运行的进程在不同命名空间中启动或移动至不同命名空间时会出现这个漏洞。命名空间通常是作为安全机制使用,因为不同命名空间中的进程无法看到彼此,或彼此间进行操作。问题是当将某个进程移入某个命名空间后,它就会暴露于已存在于该命名空间进程的恶意操作。进入时漏洞会攻击使用 nsenter 或者 docker exec 加入的进程。成功攻击可造成恶意进程获取系统访问或其他特权。

例如:如果某个恶意进程已控制某个容器并要获取那个容器中的 root ,则该恶意进程就可以杀死所有它可以“看到”的进程。幸运的是容器命名空间可以一直探测到恶意进程或在其他容器中杀死主机进程或其他进程。但如果管理员尝试使用 nsenter 将 shell 移至有问题的容器进行调查,则该恶意进程也可以看到并操纵那个 shell(并终止它)。

有漏洞的 Linux 程序

进入时(on-entry)攻击可滥用以下合法程序。使用以下 Linux 安全机制,比如 SELinux seccomp 防止此情况。

  • ptrace
    "进程追踪" 或者 ptrace 是一个强大的 Linux 调试工具。任何有适当权限的进程均可以通过 ptrace 内核调用 ptrace 另一个进程。 ptrace 为该进程提供极低层访问,其中包括其内存、资源(比如文件描述符),并可以截获内核调用。
  • docker exec
    docker exec 是由 docker 守护进程提供的服务,允许在现有容器中启动附加进程。这个服务经常用于检查或手动更改容器。例如:要在有问题的容器中启动一个 bash shell 以便调试其行为, 您可以使用:
    docker exec -it container-name /bin/bash
  • nsenter
    nsenter 是用来在特定命名空间中移动或启动进程的工具。因为容器是构建于 Linux 命名空间,所以可以将 nsenter 作为 docker exec 的更通用版本使用。
  • 内核功能
    在 Linux 中,之前为 root 帐户赋予的特殊功能已分割为单独的功能,且有些会赋予一个以上管理权。例如: CAP_SYS_TIME 只赋予设定系统时钟的功能。而 CAP_SYS_ADMIN 则赋予管理一台机器所需的一组功能。可单独为某个进程赋予或拒绝每个内核功能。
  • seccomp
    seccomp Linux 程序允许单独访问内核调用。

红帽产品安全团队将这个更新评级为 Moderate

受影响的产品

以下红帽产品版本会受到影响:

  • Red Hat Enterprise Linux 7
  • Red Hat Openshift Container Platform
  • RHEL Atomic Host

影响

发生 CVE-2016-9962 中所述错误时因为 docker exec 中缺少安全机制。

截止至 upstream docker 1.12.6, docker exec 启动的进程均可采用该容器中的 ptrace 进行追踪,同时这些进程也会保留其文件描述符,这些描述符与该容器外的内容链接。这个功能可被使用 ptrace 功能容器中的进程滥用。如果某个恶意进程动作够迅速,它就可以 ptrace 进入的进程,并获取对该容器外内容的访问。这个问题在 docker 1.12.6 中得到了解决,方法是防止使用 `ptrace`追踪这些进程(通过 DUMPABLE 进程属性)以及让进入的进程在移动前去掉其文件描述符。

即使没有移植,大多数安装也都 没有 风险:

  • Docker 运行时默认将很多内核功能的容器分成条状,其中包括 CAP_SYS_PTRACE 。这意味着只有特别添加此功能(或者以 --privileged 切换)运行的容器会有这个风险。而且,只有那些容器 当中 的特权进程会有风险。那些容器中的非特权用户进程没有能力造成危害。因此,如果您是按照推荐的容器实践,即“未运行特权容器”且“未在容器中运行 root 进程”,就不会有问题。
  • 在启用 SELinux 的红帽系统中,即使特权容器的危险也会有所缓解。SELinux 可防止容器进程访问主机内容,即使那些容器进程要获取对实际文件描述符的访问。
  • 在大多数安装中, nsenter docker exec 为纯手动操作。OpenShift 使用 nsenter 加速端口转发,但没有人工参与,简化的 docker 就永远不会将任何进程移至某个容器或者容器间移动。

诊断漏洞

要创建您的 docker 版本是否已进行移植修复,请下载并使用 这个脚本

采取行动

强烈建议所有运行受影响内核版本的红帽客户在补丁可用后尽快更新。有关受影响软件包的详情以及推荐的缓解操作如下。

更新受影响的产品

产品 软件包 建议/更新
Red Hat Enterprise Linux 7 docker-latest, docker, runc 待定
Red Hat Openshift Container Host docker-latest, docker 待定 RHEL7 补丁
RHEL Atomic Host docker-latest, docker, runc 待定 RHEL7 补丁及衍生版本

缓解操作

可在您的容器中禁止 ptrace 及其他危险内核调用。可创建自定义 seccomp 配置文件禁止此行为(简化 docker、OpenShift 及 Kubernetes 均支持此操作)。这样就可以完全防止基于 CVE-2016-9962 的攻击。

Comments