題目與適用場景
使用者上傳 ZIP 或 TAR.GZ,系統在背景解壓後進行病毒掃描、文字擷取或批次匯入。攻擊者可能上傳壓縮後很小、展開後極大的檔案,構造遞迴巢狀封存檔,或利用條目路徑寫出目標目錄。請說明上傳邊界、格式解析、資源預算、隔離、失敗狀態與清理策略。
題目重點是解壓階段的資源安全。不能把「上傳大小限制」當成全部防線;壓縮比、條目數量與展開後總量都要進入設計。
面試官在考察什麼
面試官會看你是否區分壓縮前大小與解壓後成本,是否把檔案數、目錄深度、巢狀層數、CPU、記憶體、磁碟與處理時限納入預算。OWASP 建議在解壓後計算大小並限制上傳服務;OWASP WSTG 將 zip bomb 描述為透過耗盡磁碟或記憶體造成拒絕服務。
高品質答案還應處理路徑穿越、符號連結、重複檔名、錯誤大小宣告、解析庫漏洞與取消後清理。隔離 worker、只寫暫存目錄、原子發布和可觀測性,決定能否把惡意輸入限制在單一任務內。
30 秒回答框架
「我會把封存檔當成不可信輸入。入口限制壓縮檔位元組數、類型與請求速率;worker 在受限容器與暫存目錄中串流讀取,先檢查條目路徑、符號連結、條目數、巢狀層數與解壓後總位元組預算。任何預算超限立即停止並清理。解壓結果經病毒掃描與內容類型檢查後才原子發布,原始檔與任務狀態保留稽核資訊但不直接公開。每個任務有 CPU、記憶體、磁碟與牆鐘上限,並用指標觀察拒絕率與清理是否完整。」
分步深入設計
第一步:建立輸入與任務邊界
入口限制壓縮檔大小、單一使用者並行、總額度與請求頻率。為任務分配 ID、租戶、原始物件、解析格式與狀態。原始物件存入不可執行的隔離儲存,worker 只取得短期讀取權限。
第二步:識別格式並選擇解析器
不要只看副檔名或 Content-Type;檢查魔數與允許格式集合。為 ZIP、TAR、GZIP 選擇維護中的函式庫並記錄版本。條目大小欄位可協助預檢,但不能盲目信任;實際讀取時仍必須持續計數。加密封存檔、未知壓縮方法與格式錯誤進入拒絕或人工處理。
第三步:執行多維資源預算
至少定義壓縮檔位元組數、展開位元組數、檔案數、單檔大小、目錄深度、巢狀層數、CPU、記憶體、磁碟與牆鐘預算。壓縮比只是告警訊號,不能取代展開位元組計數。
第四步:安全處理路徑與檔案系統物件
將條目名稱正規化後拒絕絕對路徑、路徑穿越與空位元組。展開目標必須是每任務獨立的暫存目錄,最終路徑要驗證仍位於該目錄。預設拒絕符號連結、硬連結與裝置檔;重複檔名按明確策略拒絕。
第五步:隔離解壓與後續掃描
worker 運行於低權限容器或沙箱,使用唯讀根檔案系統、暫存磁碟額度與最小網路權限。解壓與內容掃描分開設定預算,結果寫入新的不可執行物件,未經策略允許不能直接提供下載。
第六步:處理巢狀、遞迴與取消
業務不需要巢狀封存檔時直接拒絕。需要支援時設定最大層數、總預算與每層路徑檢查,所有遞迴共享同一預算,而不是每層重新取得額度。超時、取消、worker 崩潰與租戶刪除都觸發冪等清理。
第七步:狀態機、發布與恢復
狀態可分為 uploaded、inspecting、extracting、scanning、published、rejected 與 cleanup_failed。所有條目通過檢查並完成掃描後,任務才原子切換為 published。失敗狀態向使用者提供安全原因與下一步,內部保留結構化拒絕碼與預算消耗。
第八步:測試與可觀測性
測試高壓縮比、巢狀封存檔、路徑穿越、符號連結、重複名稱、錯誤標頭、超大條目、損壞 CRC、加密檔與中途取消。指標包括展開位元組、檔案數、最大深度、CPU、拒絕原因、清理延遲、暫存磁碟水位與 worker 重啟率。
取捨、邊界與資訊增益
預掃描條目中繼資料成本低,卻不能取代串流計數;完全串流更可靠,但可能消耗部分資源後才發現超限。拒絕巢狀最安全,支援巢狀則要共享預算與遞迴深度。
獨立 worker 能降低主服務風險,卻增加佇列延遲與運維成本。保留原始封存檔有助於重試與調查,但必須設定保留期限、存取控制與加密。
高品質示範回答
「我會把上傳和解壓分成兩個信任邊界。上傳階段限制位元組、並行與額度;非同步 worker 在低權限、無網路容器中使用維護中的解析庫,只向任務暫存目錄寫入。讀取每個條目時同時累計展開位元組與檔案數,並限制單檔大小、目錄深度、巢狀層數、CPU、記憶體、磁碟與牆鐘。
條目路徑正規化後拒絕絕對路徑、穿越、符號連結、硬連結與裝置檔。業務不需要巢狀時直接拒絕,需要時讓所有層共享一個預算。掃描通過才原子發布;超限、超時、取消與崩潰都走冪等清理。指標記錄預算消耗、拒絕原因、清理延遲與磁碟水位。」
常見錯誤
- 只限制上傳壓縮檔大小。 小檔案也能在解壓後耗盡磁碟或記憶體。
- 相信條目宣告的未壓縮大小。 宣告可能不完整或不可信。
- 把壓縮比作為唯一規則。 它只是訊號,不是所有格式的安全預算。
- 直接解壓到共享目錄。 路徑穿越、覆蓋與殘留會影響其他租戶。
- 允許符號連結或裝置檔。 條目可能把寫入導向目錄外或特殊介面。
- 每層巢狀重新發放額度。 遞迴會放大資源消耗。
- 掃描通過就公開原始內容。 惡意腳本和錯誤內容類型仍可能攻擊下載者。
- 取消後不清理暫存目錄。 殘留會形成磁碟耗盡事件。
追問與參考答案
應該先掃描還是先解壓?
需要讀取封存檔才能掃描內部檔案,但解壓本身要受預算與隔離保護。先做格式與中繼資料檢查,再於受限 worker 串流解壓,接著掃描每個結果。
壓縮比超過多少就拒絕?
不能給出跨格式通用數字。壓縮比可作告警或提前拒絕,真正硬門檻應是展開總位元組、單檔、檔案數與 CPU 預算。
如何安全支援巢狀封存檔?
設定最大深度,所有層共享總預算,每層重複路徑與符號連結檢查,並讓遞迴受同一 worker 的牆鐘與磁碟額度限制。
解析器回報的條目大小可信嗎?
它是預警資訊,不是授權依據。實際讀取必須繼續累計位元組,處理 Zip64、損壞標頭與函式庫已知限制。
超限任務應該重試嗎?
資源預算超限是確定性拒絕,不應盲目重試。只有暫時性 worker 故障才可重試,並重新建立隔離目錄與同一預算。