Black Hat USA 2025 | ECS-cape – Hijacking IAM Privileges in Amazon ECS
三句話摘要
安全研究員在 AWS ECS EC2 模式中發現「ECS Escape」漏洞,允許低權限容器冒充 ECS 代理劫持同一實例上所有其他任務的 IAM 憑證。 在 ECS EC2 模式中,IMDS 預設可存取使得任何任務都能冒充 ECS Agent、劫持同實例全部任務憑證,且攻擊在 CloudTrail 中留不下痕跡——封鎖任務對 IMDS 的存取並嚴格隔離高低權限工作負載是目前唯一可靠的防禦手段。 漏洞根源在於 IMDS 預設可存取:ECS EC2 模式中,實例上每個任務預設都能存取 IMDS,取得與 ECS Agent 相同的實例角色憑證,這讓任務具備冒充代理的前提條件。
重點整理
重點- 1
漏洞根源在於 IMDS 預設可存取:ECS EC2 模式中,實例上每個任務預設都能存取 IMDS,取得與 ECS Agent 相同的實例角色憑證,這讓任務具備冒充代理的前提條件。
- 2
ACS 協議洩漏全部任務憑證:ECS Agent 透過 ACS(Agent Communication Service)內部 WebSocket 協議與 AWS 控制平面通訊,控制平面會將同一實例上所有任務的任務角色與任務執行角色憑證一次性下發,這是攻擊的核心利用點。
- 3
CloudTrail 日誌無法偵測攻擊:劫持後使用憑證的行為在日誌中顯示為原始合法任務所發出,既無攻擊者容器的痕跡,也無憑證劫持的記錄,使防禦方幾乎無從察覺。
- 4
AWS 認定屬消費者安全責任:AWS 回應表示 ECS Agent 在消費者安全邊界內運作,容器本身不構成安全邊界,並更新文件說明同一 EC2 實例上的任務可能存取其他任務的憑證。
實用技巧與重點
乾貨- 漏洞名稱:ECS Escape(ECS Cape)
- 影響範圍:使用 EC2 啟動模式的 Amazon ECS,佔編排技術使用者約 1/3
- 發表場合:Black Hat Las Vegas 2025
- 研究者:Noah Haz,Sweet Security 軟體開發與安全研究員
- 開源工具:ECS Escape CLI,GitHub 可搜尋,以 Rust 撰寫
- 攻擊步驟(5步):
- 透過 IMDS(`169.254.169.254`)取得 EC2 實例角色臨時憑證
- 呼叫 `DiscoverPollEndpoint` API 取得 ACS WebSocket URL
- 透過容器自省 API 取得 Container Instance ARN
- 透過 IMDS + 任務元數據端點 v4 取得其餘識別符
- 建立 ACS WebSocket 連線(`send_credentials=true`),接收所有任務憑證明文
- 可劫持的憑證類型:
- 其他任務的任務角色(Task Role)
- ECS 自身的任務執行角色(Task Execution Role),可讀取 AWS Secrets Manager 中的密鑰
- 緩解措施:
- 用 IP Tables 規則封鎖任務對 IMDS 的存取(不可在實例層級封鎖,否則 ECS Agent 失效)
- 禁止任務角色擁有 `ecs:Poll` 與 `ecs:DiscoverPollEndpoint` 權限
- 禁止任務角色使用 ECS 通配符(`ecs:*`)
- 高低權限工作負載分離至不同實例或集群
- 多租戶系統每個租戶使用獨立集群或至少獨立 EC2 實例
- 最小化任務執行角色權限,不共用同一個通用執行角色
- AWS 文件變更:原文「容器永遠無法存取其他任務的憑證」→ 已改為「同一 EC2 實例上的任務可能存取其他任務的憑證」
- --
結論
結論“在 ECS EC2 模式中,IMDS 預設可存取使得任何任務都能冒充 ECS Agent、劫持同實例全部任務憑證,且攻擊在 CloudTrail 中留不下痕跡——封鎖任務對 IMDS 的存取並嚴格隔離高低權限工作負載是目前唯一可靠的防禦手段。”
完整解析
詳細Noah Haz 在 Sweet Security 負責開發 EC2 感測器時,為了監控 ECS 任務而查詢「任務元數據端點 v4」,無意間發現 ECS Agent 與 AWS 控制平面之間的 WebSocket 連線帶有 `send_credentials=true` 參數,並透過抓包確認控制平面確實透過此連線下發任務憑證。這引發了他的核心疑問:一個普通任務能否偽裝成 ECS Agent,從而截取其他任務的憑證?
研究的突破口在於 IMDS。ECS EC2 模式中,IMDS 預設對所有任務開放,而 IMDS 所回傳的正是 EC2 實例角色憑證——這與 ECS Agent 用來向 AWS 控制平面認證的憑證完全相同。因此,任何正在運行的任務都天然具備 `ecs:DiscoverPollEndpoint` 與 `ecs:Poll` 等 ECS 必要權限。有了這組憑證,攻擊者可以呼叫 `DiscoverPollEndpoint` API 取得 ACS WebSocket 的 URL,再透過容器自省 API(Container Introspection API)取得 Container Instance ARN,搭配任務元數據端點補齊所有連線識別符,最終構造出一個完全合法的 ACS WebSocket 請求。
連線建立後,AWS 控制平面誤以為是真正的 ECS Agent,開始推送同一 EC2 實例上所有正在運行任務的角色憑證,包含各任務的任務角色(Task Role)以及原本只供 ECS 本身使用的任務執行角色(Task Execution Role)。後者尤其危險,因為任務執行角色通常持有存取 AWS Secrets Manager 的權限,代表攻擊者可直接讀取原本僅供特定任務使用的資料庫密碼或 API 金鑰。在 Demo 中,研究者以零 S3 權限的 ECS Escape 任務成功刪除了另一個任務擁有完整 S3 存取權的儲存桶,並讀出 Secrets Manager 中的明文密碼,完整重現跨任務橫向移動。
更值得警惕的是,此漏洞在 CloudTrail 中幾乎完全透明:所有被劫持憑證的操作日誌都顯示來自原始合法任務,攻擊者容器的身分從未出現在日誌中。AWS 的官方回應將此定性為消費者安全責任,認為 ECS Agent 在消費者安全邊界內運作,並更新文件說明,但未承諾短期修復。研究者的建議是:以 IP Tables 規則阻斷任務對 IMDS 的存取、對高低權限工作負載嚴格分離實例,以及落實最小權限原則於所有任務角色。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

