用 500 行程式碼實作 Linux 容器(2016) (★ 100 分)
文章以約 500 行 C 程式展示 Linux 容器的基本組成,目的不是產製可直接上線的容器平台,而是辨識執行不受信任程式時,哪些權限在本質上不可保留。程式利用 `clone` 建立子行程,並藉由命名空間(namespace)隔離行程識別碼、掛載點、IPC(行程間通訊)、網路與主機名稱;再以 `pivot_root` 換置根目錄、卸載舊根目錄,讓容器內行程無法直接看見主機檔案系統。作者強調,這是一份理解 Linux 隔離機制的教學實作,而非建議在正式環境採用的最小防護基準。
權能(capabilities)是文章的安全重點:Linux 的 root 權限其實可拆成多項細部權能,因此程式會移除可讀取任意檔案、建立裝置檔、載入核心模組、重開機、調整系統時間、提高排程優先權等危險權限。作者也特別處理檔案權能與 setuid:若只清除目前行程的權限,執行帶有特殊權能的檔案後仍可能重新取得權限,因此必須縮減權能邊界集合。文章同時用 seccomp(Secure Computing Mode,Linux 系統呼叫過濾機制)封鎖建立巢狀使用者命名空間、竄改終端機輸入、存取核心金鑰圈、`ptrace` 偵錯追蹤,以及可協助核心漏洞利用的 `userfaultfd` 等系統呼叫。
資源隔離則以控制群組(cgroups)與 `setrlimit` 完成:範例限制容器最多使用 1 GB 使用者記憶體與核心記憶體、最多 64 個行程、較低的 CPU 份額與磁碟 I/O 權重,並限制檔案描述元數量,以防止 fork bomb、記憶體耗盡或檔案描述元耗盡等阻斷服務。網路部分僅說明典型做法:將虛擬乙太網路的一端接到主機橋接器,另一端放入容器網路命名空間;但若多個不互信容器共用同一橋接器,仍可能遭遇 ARP 欺騙。文章也提醒,使用者命名空間雖能改善隔離,卻曾擴大核心攻擊面,因此當年的 Linux 發行版對此功能採取不同預設與限制。
Hacker News 討論普遍認同這類實作很適合理解容器,但對「容器是否能承載不受信任程式」抱持較保留態度。部分留言指出,標準 Linux 容器共用主機 Linux 核心,近年仍持續出現本機權限提升(LPE)與容器逃逸漏洞;若攻擊者模型包含惡意程式,較強的選項通常是微型虛擬機,例如 Firecracker 的 VMM(Virtual Machine Monitor,虛擬機監視器)、Kata Containers,或以使用者空間核心攔截系統呼叫的 gVisor。也有人強調安全邊界沒有絕對可靠與否,而是取決於威脅模型:容器很適合避免一般指令或開發工具破壞使用者檔案,但未必足以防禦刻意尋找核心漏洞的攻擊者;實務上應結合虛擬機、最小權限、資源限制與防禦縱深。
👥 22 則討論、評論 💬
https://news.ycombinator.com/item?id=49965118