本卡屬 FR-195(Agent 資安修正),第 2 批 F7。修 FR-186 掃描的 S6 F1(3/3 票,FR-177 #226 修法的旁路)、C3 F1、C6 F1(皆 3/3 票),嚴重度:中。

這張卡做什麼(白話)

三個地方會把對方給的資料整份讀進記憶體、讀完才檢查大小,對方故意給很大的東西,Agent 整個行程就被系統砍掉(心跳、掃描、主控台全停)。①tar 壓縮包的長檔名/PAX 擴充標頭宣告多大,Python 的 tarfile 就一次讀多大——FR-177 擋了「很多小檔」,沒擋「一個標頭宣告超大」。②nmap 在客戶執行主機上產生的報告,Agent 用 SFTP 整份讀回來才比對 60 MB 上限。③SSH 遠端指令的輸出整段累積在記憶體,沒有上限。

問題在哪(行號首腦 2026-11-11 對主線 b8b1158 重核過,仍然有效)

改哪些檔

guidant_agent/shared/archive_safety.py
guidant_agent/scan/adapters/connectors/nmap.py
guidant_agent/scan/adapters/connectors/base.py
test/test_fr177_resource_limits.py
test/test_nmap_connector.py

怎麼做

行為變更

正常使用不受影響。超過上限的壓縮包、nmap 報告會得到明確的錯誤訊息;SSH 指令輸出超過 8 MB 的部分不保留。

要補的測試

test/test_fr177_resource_limits.py 已有 test_tar_quota_raises_while_iterating,照同樣寫法加一支:手工組一個 .tar.gz,內含一個 PAX 擴充標頭宣告 512 MB 長度(實際資料不用真的那麼大,壓縮後只有幾 KB),extract_archive 要 raise 且測試在一兩秒內結束。nmap 與 _drain 各一支簡單斷言。

跑測試的方法(首腦實測過,照抄)

🔴 不要 poetry install、不要動共用環境、不要改 pyproject.toml。Agent 主線釘 jedi-agent-protocol==0.6.1,這版還沒推上 Nexus,共用環境裡是 0.6.0,直接跑會 ImportError(KIND_SCAN_RESULT)。用下面的 PYTHONPATH 指到套件 repo 主資料夾就是對的版本。首腦 2026-11-11 在主線 b8b1158(FR-193 rootless 已合回)用這行跑全量:2554 passed、1 skipped、0 failed,約 3 分鐘;工作區裡跑守衛:109 passed,12 秒。