本卡屬 FR-177(母卡 CM-3507),第 7 棒 A7:LDAP 登入、離線操作者、來源網段白名單(Agent repo,6 檔/約 940 行)。只掃不修。工作坊會用
.claude/workshop-prompts/dispatch-<本卡號>.md當開場 prompt 直接啟動掃描,小弟不必自己打指令。
用 Claude Code 官方 claude-security plugin 掃 Guidant AI Agent(裝在客戶機器上的那支程式,repo evidence-agent)的「LDAP 登入、離線操作者、來源網段白名單」這一塊,找出資安問題並寫成 PM 與新手工程師都看得懂的報告。只找問題、不修問題,修是另外開卡的事。
主控台的另外兩條登入路:用客戶自己的 AD/LDAP 帳號登入,以及主系統事先下發的「離線操作者」名單(主系統斷線時誰還能登);加上 8444 只准哪些網段連進來的白名單。
LDAP 設定裡存著客戶 AD 的服務帳號密碼,這是客戶的資產不是我們的。白名單是 8444 的第一道門,判錯來源 IP 等於門沒關。離線操作者名單是主系統推下來的,推的那條路(A2)若能被偽造,這份名單就能被塞人。
guidant_agent/identity/adapters/ldap_source.py
guidant_agent/identity/app/offline_operators.py
guidant_agent/identity/app/allow_cidr.py
guidant_agent/identity/domain/allow_cidr.py
guidant_agent/identity/ports/source_cidr_guard.py
guidant_agent/console/api/ldap_routes.py
檔數 6、約 940 行。驗檔數:cd <工作目錄> && git ls-files -- guidant_agent/identity/adapters/ldap_source.py guidant_agent/identity/app/offline_operators.py guidant_agent/identity/app/allow_cidr.py guidant_agent/identity/domain/allow_cidr.py guidant_agent/identity/ports/source_cidr_guard.py guidant_agent/console/api/ldap_routes.py | grep '\.py$' | wc -l 應為 6。scope 外的檔不要讀(研究員會越界,越界的發現首腦驗收時會挑掉)。
首腦讀過程式碼後認為最容易出事的地方,是思考起點不是檢查清單。工具不會照這份走,掃完後 runner 要自己逐條對一遍:工具沒報的,開檔看一眼寫「人工查過:成立/不成立/為什麼」。前幾輪最嚴重的發現(FR-076 L2 的 HIGH)都是 runner 照這清單追出來的,不是工具報的。
ldap_source.py:206-207 bind 用的服務帳號密碼 cfg.get("secret"):存在哪(SecretStore?明文 JSON?)、主控台讀設定回傳時有沒有遮掉;:9 註明「拿密文當密碼去 bind 會被 AD 反鎖」,表示曾經有解密時機問題,現在怎麼解的。ldap_source.py:251-253 verify_user(account, password):帳號有沒有做 LDAP filter escape((、)、*、\\);空密碼送 bind 會變成匿名 bind 成功——有沒有在送出前擋空字串;encryption="none" 選項(:48)正式環境允許嗎。ldap_routes.py:「測試連線」端點收的是前端送來的整組設定(含密碼與 server 位址)還是只用已存的——若收整組,等於可以叫 Agent 對任意內網位址發 LDAP 連線(內網探測)並把客戶 AD 密碼送去攻擊者的假 LDAP。allow_cidr.py:170-211 make_guarded_server:判來源用的是 TCP 層 client_address(好)還是 HTTP header;:36-40 環境變數格式錯時「只放行本機」是 fail-closed(好),但 :72-78 主系統下發的 cidr 格式錯「忽略」後生效的是哪一組;domain/allow_cidr.py 的 intersect/effective:主系統下發的能不能放寬安裝時的基線(應該只能收窄)。offline_operators.py:139-182:名單怎麼驗來源(走 A2 的 JWT 之外還有沒有自己的簽章);ad_bindings 把 AD 帳號綁到本機 sub——綁定被改會不會讓 AD 的一般使用者對到管理員 scope;名單檔 RECEIVED_FILE 權限。source_cidr_guard.py 這個 port 被 files 的 8444 用(ARCHITECTURE 寫的)——除了 8444,8443 與 8000 有沒有用同一道;沒有的話是刻意還是漏。FR-075 S1(主系統 jedi-iam)LDAP 三洞(filter 注入/空密碼匿名 bind/TLS 驗證可關)併 CM-1560 修過,Agent 這份 ldap_source 是否沿用 jedi-ldap kernel 庫、有沒有繼承那次修正是本棒要答的。FR-075 結論未經本棒面板驗證、只是參照。