On-entry container attack - CVE-2016-9962
Updated -
- Status
- Ongoing
- Impact
- Moderate
在 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
seccompLinux 程序允许单独访问内核调用。
红帽产品安全团队将这个更新评级为 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 就永远不会将任何进程移至某个容器或者容器间移动。
诊断漏洞
采取行动
强烈建议所有运行受影响内核版本的红帽客户在补丁可用后尽快更新。有关受影响软件包的详情以及推荐的缓解操作如下。
更新受影响的产品
| 产品 | 软件包 | 建议/更新 |
|---|---|---|
| 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 的攻击。
Subscriber exclusive content
A Red Hat subscription provides unlimited access to our knowledgebase of over 48,000 articles and solutions.
Welcome! Check out the Getting Started with Red Hat page for quick tours and guides for common tasks.
