本卡屬 FR-077(母卡 CM-1591),修 R1(CM-1592)的 F4。面板未跑成,runner 開檔核對+首腦複核屬實。MEDIUM(需租戶管理員權限)。
管理頁「測試連線」按鈕會把使用者填的網址拿去發 HTTP 請求,再把結果回給使用者。網址沒有任何限制——填內網位址、雲端 metadata endpoint(169.254.169.254)都會照打,而且回應會帶 status_code 與截斷的例外訊息,所以它是一個可讀的探測工具(能分辨「服務在但拒絕」與「完全不通」)。
首腦核對:
api/remote_agent_route.py:92-94 payload.get("base_url") 直進 service;app/service/remote_agent_service.py:55-69 check_health() 無 scheme/host/私網檢查,mode=none 或 http 時走裸 httpx.get(f"{url}/health")。ROUTE_TABLE:219 第三欄 True,確有 admin_required——這是它 MEDIUM 不是 HIGH 的原因。/health 後綴不構成限制:f"{url}/health" 字串串接,url 帶 ? 即可吸收。~/Projects/Jedicogy/module/jedi-python-package/jedi-remote-agent/jedi_remote_agent/api/remote_agent_route.py:88-94 RemoteAgentHealthCheckRoute.post:base_url 從 body 來
~/Projects/Jedicogy/module/jedi-python-package/jedi-remote-agent/jedi_remote_agent/app/service/remote_agent_service.py:47-70 check_health():無位址檢查
~/Projects/Jedicogy/module/jedi-python-package/jedi-remote-agent/jedi_remote_agent/app/service/remote_agent_service.py:189-240 reconcile()/_agent_sha256_get():同款出站,base 來自 DB 的 agent.base_url(agent 自報)
agent_uid(而非 base_url),service 用 verify_remote_agent_is_exist(uid) 取該租戶已登記的 base_url 再打。先查再寫:RemoteAgentDetailRoute 已有 get(uid) 模式可抄;error code 用既有 FILE_AGENT_NOT_FOUND。新增 agent 表單的「先測再存」情境若 FE 有用到(查 FE RemoteAgent* 元件的 health-check 呼叫),保留 base_url 入口但套②的過濾。register() 的 base_url 與 reconcile 也套):新增 common/util.py 的 assert_safe_outbound_url(url)——只允許 http/https;解析 hostname 後 socket.getaddrinfo 解析出的每個 IP 都不得是 loopback/link-local/RFC1918/multicast(ipaddress 標準庫的 is_private/is_loopback/is_link_local);解析後再檢查是防 DNS rebinding。⚠️ 先回寫本卡問決策者:agent 本來就裝在客戶內網,base_url 極可能就是 RFC1918 位址——一律擋私網會讓合法 agent 測不了。建議的判準是「擋 loopback/link-local/metadata(169.254.0.0/16)/雲端自己所在網段,不擋一般 RFC1918」,但要決策者確認。detail 不再回例外原文(str(e)[:200]),改回固定的分類字串(timeout/connection_refused/tls_error/unreachable),減少 oracle 資訊量。assert_safe_outbound_url:http://127.0.0.1、http://169.254.169.254、http://[::1]、ftp://x、file:///etc/passwd → 全拒;https://10.0.0.5:8443(依②裁決)→ 放行或拒。check_health(agent_uid):別租戶的 uid → 404(RLS);本租戶 → 打的是 DB 裡的 base_url 不是 body。127.0.0.1 那條必須紅。既有測試 jedi-remote-agent/tests/test_enrollment.py,新測試同目錄。
POST /remote-agents/health-check body {"base_url":"<http://127.0.0.1:8000>"} → 期待 400(修前回 reachable: true)。