域名,為什么還擋不住錯(cuò)誤外聯(lián))
應(yīng)用代碼看到一個(gè)HTTPS地址就能認(rèn)為它屬于批準(zhǔn)的網(wǎng)站嗎域名解析、重定向和代理鏈都可能改變最終目的地。10月23日OpenAI的隔離說明再次把出站路徑放到了顯眼的位置。應(yīng)用校驗(yàn)只是第一道門URL中有scheme、hostname、port、userinfo和路徑。用startswith比較字符串會(huì)把域名外觀與真實(shí)主機(jī)混在一起。應(yīng)先解析再與明確的目標(biāo)集合比較拒絕額外憑據(jù)和不需要的端口。即便URL結(jié)構(gòu)合法也還沒有檢查DNS最終解析地址。重定向后的新地址必須重新經(jīng)過同一策略連接應(yīng)由受控代理執(zhí)行并把應(yīng)用判斷與實(shí)際連接目的地關(guān)聯(lián)。否則允許列表只能約束模型寫下的字符串約束不了網(wǎng)絡(luò)。固定內(nèi)網(wǎng)域名同樣需要訪問路徑和方法限制。允許讀取知識(shí)庫(kù)不等于允許調(diào)用它的管理端點(diǎn)。這個(gè)差異應(yīng)由服務(wù)身份和后端接口落實(shí)。圖里的私網(wǎng)分支由網(wǎng)絡(luò)側(cè)策略攔住不能靠一段URL解析代碼代替。離線校驗(yàn)URL結(jié)構(gòu)以下是可離線運(yùn)行的最小示例使用Python標(biāo)準(zhǔn)庫(kù)。輸入均為教學(xué)構(gòu)造不連接業(yè)務(wù)系統(tǒng)。from urllib.parse import urlsplit def allowed(raw): try: u urlsplit(raw) port u.port except ValueError: return False return ( u.scheme https and u.hostname docs.example.invalid and u.username is None and u.password is None and port in (None, 443) and not u.fragment ) assert allowed(https://docs.example.invalid/guide) assert not allowed(https://docs.example.invalid.evil.invalid/) assert not allowed(https://docs.example.invalidevil.invalid/) assert not allowed(https://docs.example.invalid:8443/) assert not allowed(http://docs.example.invalid/) print(5 URL structure cases passed; no DNS or requests).invalid域名專用于本例腳本不做DNS查詢。真實(shí)實(shí)現(xiàn)還需地址范圍校驗(yàn)、DNS重綁定防護(hù)、重定向處理和代理拒絕記錄。不要把這五個(gè)斷言算成SSRF防護(hù)驗(yàn)證。測(cè)試必須經(jīng)過真實(shí)出口在授權(quán)的測(cè)試網(wǎng)絡(luò)里分別檢查直接IP、解析變化、跳轉(zhuǎn)和代理錯(cuò)誤記錄最終IP、TLS主機(jī)名和規(guī)則版本。內(nèi)部安全服務(wù)故障時(shí)應(yīng)拒絕請(qǐng)求而不是悄悄回退到宿主默認(rèn)網(wǎng)絡(luò)。本文沒有啟動(dòng)Cilium、Kubernetes或真實(shí)代理也沒有性能數(shù)據(jù)。域名允許列表是聲明的一部分網(wǎng)絡(luò)可達(dá)性仍需獨(dú)立驗(yàn)證。參考資料OpenAI containmentMCP security practices