English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

guest
1 / ?
back to lessons

標頭即資料袋

HTTP 記錄框架將請求標頭視為一組鍵值對。記錄 API 會完整暴露這組資料。運維人員為了除錯而啟用標頭記錄:當請求失敗時,標頭能說明問題所在。系統沒有內建黑名單,也沒有在文件說明中提供憑證過濾機制。完整標頭會被寫入磁碟。

典型請求中的憑證標頭:

- Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...(JWT 或 OAuth 權杖)

- Cookie: session=abc123; auth=xyz789

- X-API-Key: sk-live-abc123...

- X-Auth-Token: ghp_abc123... (GitHub 個人存取權杖模式)

這些值會驗證請求。當寫入日誌檔後,它們就能驗證任何請求。

憑證傳遞管道

寫入日誌檔的憑證不會停留在原處。它會傳遞至:

1. Web 伺服器寫入 /var/log/nginx/access.log

2. 日誌輪轉代理程式 (logrotate) 複製到 /var/log/nginx/access.log.1

3. 日誌傳輸工具 (Fluentd、Filebeat、Logstash) 讀取並傳送到聚合器

4. 日誌聚合器(Elasticsearch、Splunk、Datadog)建立索引並儲存

5. 依預設政策保留 30–90 天

憑證同時存在於這五個位置。撤銷工作階段權杖並不會從日誌聚合器中移除該憑證。它在整個保留期間內仍可被搜尋、匯出,並供任何擁有日誌存取權限的人使用。

暴露窗口

記憶體中憑證的暴露窗口:max(工作階段持續時間, 程序存活時間)。工作階段:數小時至數天。程序:數小時至數週。

日誌中憑證的暴露窗口:max(工作階段持續時間, 日誌保留期)。工作階段:數小時至數天。保留期:30–90 天。

從記憶體竊取憑證需要攻擊者在工作階段窗口期間在場。從日誌竊取憑證只需存取日誌聚合器,即可在保留期間內追溯取得。

MOAD-0003 與 MOAD-0004

MOAD-0003(記憶體洩漏):憑證在記憶體中洩漏至錯誤的請求處理器。僅在處理程序視窗期間可存取,透過執行緒集區取得。暫時性。

MOAD-0004(日誌機密):憑證儲存在磁碟上,會在日誌輪替、日誌傳送與日誌聚合後持續存在。任何擁有日誌存取權限的人都可回溯取得,持續 30–90 天。持久性。

結構性差異:暫時性 vs 持久性。修復需在不同層級進行。

暫時性 vs 持久性

暫時性/持久性的區別決定了風險範圍、修復層級,以及事件回應需求。

為什麼 MOAD-0004 的風險高於 MOAD-0003?請比較兩者憑證存放位置與存續時間。

Credential Denylist at the Serialization Layer

修正方式:在序列化層級加入憑證拒絕清單。在任何標頭值寫入日誌輸出前,先檢查標頭名稱是否在拒絕清單中。若符合,則將其值替換為 [REDACTED]

CREDENTIAL_HEADERS = {
'authorization',
'cookie',
'x-api-key',
'x-auth-token',
'x-csrf-token',
'proxy-authorization',
}

def sanitize_headers(headers: dict) -> dict:
return {
k: '[REDACTED]' if k.lower() in CREDENTIAL_HEADERS else v
for k, v in headers.items()
}

Denylist 應放置於序列化層,而非日誌查詢層。日誌查詢層的遮蔽:憑證已寫入磁碟後才進行遮蔽;原始值仍然存在,只是顯示時被隱藏。序列化層的遮蔽:憑證永遠不會寫入磁碟。原始值不會進入日誌檔案、日誌傳輸程式或日誌聚合器。

測試 Denylist

三種測試模式:

- 正向測試:包含 Authorization: Bearer token123 的請求,產生的日誌項目應為 Authorization: [REDACTED]

- 負面案例:使用 Content-Type: application/json 的請求會產生包含原始值的日誌條目

- 不區分大小寫:AUTHORIZATION: Bearer token123 同樣會產生 [REDACTED](HTTP 標頭名稱不區分大小寫)

Denylist 需要持續維護:新的憑證標頭模式(例如自訂的 X-Service-Auth 標頭)必須明確加入。修正方式是結構性的,但無法自動維護。

套用 Denylist

某團隊為了調查生產環境事件,將 Nginx 存取日誌格式設定為包含所有請求標頭。設定如下:

log_format debug_format '$remote_addr - $request - $http_authorization - $http_cookie';
access_log /var/log/nginx/debug.log debug_format;

他們解決了事件並打算移除除錯設定,但此變更在下一次部署週期(7 天後)前尚未套用到正式環境。

找出缺陷。哪些憑證標頭可能會被暴露?描述拒絕清單(denylist)方法:它套用於何處、檢查什麼,以及產生什麼結果?