CVE-2019-13139:Docker build 漏洞导致命令执行
漏洞原理
使用 docker build 命令构建本地镜像时,支持使用远程 url 参数作为构建环境,并且这个远程构建环境可以是一个 git 仓库。
在 Docker 18.9.4 之前版本中,docker build 过程中对 remoteUrl 解析存在缺陷,攻击者通过注入 --upload-pack 参数,向 git clone 传递恶意命令,从而在宿主机上执行任意代码。
POC
docker build "git@g.com/a/b#--upload-pack=touch 13139.txt;:"| 部分 | 内容 | 作用 |
|---|---|---|
docker build | Docker 构建镜像的命令 | 从指定路径构建 Docker 镜像 |
"git@g.com/a/b" | Git 仓库的远程 URL(SCP 风格) | 告诉 Docker 从该地址克隆仓库作为构建上下文 |
# | URL 片段分隔符(关键点) | Docker 规定,# 之后的部分用于指定分支和子目录。整个 # 之后的内容,都会被当作 Git 的 refspec(引用规范)传递给后续的 git fetch/git clone 命令 |
--upload-pack=touch 13139.txt; | 攻击者注入的恶意参数 | 由于 Docker 未对 # 后的内容进行有效验证,--upload-pack 参数被成功注入。该参数告诉 Git,在执行 fetch 时用 touch 13139.txt 代替默认的上传包程序。由于 Git 允许 --upload-pack 后跟任意命令,攻击者得以在宿主机上执行任意代码 |
; | 命令分隔符 | 用于结束前一个命令,为后续可能的命令做准备,确保注入的命令独立执行 |
#(第二个) | Git 注释符 | 第二个 # 及其之后的内容(如 :)会被 Git 解释为注释,从而确保注入的命令语法正确,不会影响 git fetch 的正常执行流程 |
漏洞复现
