新聞發(fā)布
管理系統(tǒng)GoAgent 利用 Google AppEngine (GAE) 來(lái)繞過(guò) GFW的封鎖,以免費(fèi)、快速、穩(wěn)定的特點(diǎn)深受網(wǎng)民的歡迎 但是,GoAgent的安裝和配置中存在兩點(diǎn)嚴(yán)重安全風(fēng)險(xiǎn)的問(wèn)題卻鮮為人知 這兩點(diǎn)安全風(fēng)險(xiǎn)都可能被攻擊者利用進(jìn)行“中間人攻擊(man-in-the-middle attack)” 來(lái)竊取 GoAgent用戶(hù)的網(wǎng)絡(luò)帳號(hào)密碼等敏感信息,其概括描述如下
GoAgent 在啟動(dòng)時(shí)會(huì)嘗試自動(dòng)往系統(tǒng)的可信根證書(shū)中導(dǎo)入一個(gè)名為 “GoAgent CA”的證書(shū) 由于這個(gè)證書(shū)的私鑰是公開(kāi)的,導(dǎo)致任何人都可以利用這個(gè)私鑰來(lái)偽造任意網(wǎng)站的證書(shū)進(jìn)行HTTPS 中間人攻擊 即使在不開(kāi)啟 GoAgent時(shí),這種攻擊的風(fēng)險(xiǎn)仍然存在 換而言之,一旦這個(gè)證書(shū)被導(dǎo)入,攻擊者可以用此繞過(guò)幾乎所有網(wǎng)站的 HTTPS 保護(hù) GoAgent 本身對(duì) TLS證書(shū)的認(rèn)證存在問(wèn)題,而且默認(rèn)時(shí)不對(duì)證書(shū)進(jìn)行檢查,這導(dǎo)致在使用 GoAgent時(shí)存在 HTTPS 中間人攻擊的風(fēng)險(xiǎn)
事實(shí)上曾經(jīng)有用戶(hù)在 GoAgent主頁(yè)上的問(wèn)題跟蹤列表中指出了這兩個(gè)安全問(wèn)題(見(jiàn)以下鏈接),但既沒(méi)有修復(fù)也沒(méi)有廣泛公開(kāi),多數(shù)用戶(hù),尤其是非中文用戶(hù)可能并不知情 下面是這兩個(gè)問(wèn)題的詳細(xì)解釋
https://code.google.com/p/goagent/issues/detail?id=11091
https://code.google.com/p/goagent/issues/detail?id=8031 GoAgent
導(dǎo)入公開(kāi)私鑰根證書(shū)的問(wèn)題
GoAgent 在啟動(dòng)時(shí)會(huì)嘗試在系統(tǒng)中導(dǎo)入一個(gè)根證書(shū)來(lái)避免訪問(wèn) HTTPS網(wǎng)站時(shí)的證書(shū)報(bào)警,但在默認(rèn)情況下所導(dǎo)入證書(shū)的私鑰是公開(kāi)的 因?yàn)樗借€公開(kāi),任何人可以作為“GoAgent CA” 來(lái)簽發(fā)任何網(wǎng)站的證書(shū) 即使在 GoAgent沒(méi)有啟動(dòng)甚至卸載的情況下,這個(gè)公鑰仍會(huì)遺留在系統(tǒng)中 在有些系統(tǒng)中,GoAgent所導(dǎo)入的根證書(shū)不僅被 GoAgent默認(rèn)使用的瀏覽器信任,其他的瀏覽器也可能會(huì)信任這一根證書(shū),從而受到這一問(wèn)題的影響
GoAgent 所導(dǎo)入的這一公開(kāi)私鑰根證書(shū)的指紋是
SHA1 Fingerprint=AB:70:2C:DF:18:EB:E8:B4:38:C5:28:69:CD:4A:5D:EF:48:B4:0E:33 MD5 Fingerprint=56:B1:20:86:1B:0A:B0:61:38:00:1B:C3:67:CF:0C:CC
包含這一 “GoAgent CA” 證書(shū)以其私鑰(文件中 -----BEGIN RSA PRIVATEKEY----- 位置)的文件 URL 為
https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/local/CA.crt
根據(jù)版本信息,這一證書(shū)和私鑰從 2011 年 6月甚至更早的時(shí)間以來(lái)一直保持不變
https://github.com/goagent/goagent/blob/fa9959e577395e48a477fd5495afbc2363a51baa/local/CA.key
GoAgent 主要包含兩個(gè)部分 一個(gè)在用戶(hù)計(jì)算機(jī)上運(yùn)行的本地代理程序proxy.py,以及一個(gè)在 GAE 上運(yùn)行的遠(yuǎn)程代理程序gae.py
https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/local/proxy.py
https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/server/gae/gae.py
安裝時(shí),用戶(hù)需要上傳 gae.py 到 GAE 用戶(hù)瀏覽器通過(guò)設(shè)置一個(gè)本地代理將 HTTP/HTTPS 請(qǐng)求轉(zhuǎn)發(fā)到proxy.py,再由 proxy.py 和 gae.py進(jìn)行通信
默認(rèn)情況下,GoAgent 在啟動(dòng)時(shí)試圖導(dǎo)入上述 GoAgent CA 證書(shū) 具體的代碼為proxy.py 中的 CertUtil.import_ca
https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/local/proxy.py#L337
這個(gè)函數(shù)會(huì)根據(jù)用戶(hù)操作系統(tǒng)通過(guò)不同的方式嘗試導(dǎo)入證書(shū),在某些情況下會(huì)需要管理員(root/administrator)權(quán)限 在 Windows 下,這個(gè)函數(shù)會(huì)調(diào)用CertAddEncodedCertificateToStore 這一 API 在 OS X下,會(huì)嘗試執(zhí)行系統(tǒng)命令
security find-certificate -a -c "GoAgent" | grep "GoAgent" >/dev/null || security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" "pwd/CA.crt"
在 Ubuntu 下,會(huì)拷貝證書(shū)文件到/usr/local/share/ca-certificates 然后執(zhí)行update-ca-certificates 在其他 GNU/Linux發(fā)行版中,會(huì)嘗試執(zhí)行以下命令更改 NSS 數(shù)據(jù)庫(kù)
certutil -L -d sql:$HOME/.pki/nssdb | grep "GoAgent" || certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n "GoAgent" -i "pwd/CA.crt"
由于 Firefox 采用了不同的方式存儲(chǔ)證書(shū),這一自動(dòng)安裝過(guò)程不會(huì)導(dǎo)入 GoAgentCA 證書(shū)到 Firefox 中 但是 GoAgent 的安裝指南和 FAQ中說(shuō)明了如何手動(dòng)導(dǎo)入這一證書(shū)
https://code.google.com/p/goagent/wiki/InstallGuide
https://code.google.com/p/goagent/wiki/FAQ
這一證書(shū)隨后被 proxy.py 用來(lái)作為 HTTPS中間人來(lái)避免瀏覽器在訪問(wèn) HTTPS 網(wǎng)站時(shí)出現(xiàn)報(bào)警 GoAgent的工作原理如下 首先 proxy.py 將瀏覽器的 HTTP請(qǐng)求進(jìn)行編碼并轉(zhuǎn)發(fā)給 gae.py,gae.py完成收到的請(qǐng)求然后將結(jié)果進(jìn)行編碼后返回給 proxy.py,后proxy.py 將結(jié)果轉(zhuǎn)發(fā)給瀏覽器來(lái)完成 “翻墻” 過(guò)程 由于 GAE 的限制 (免費(fèi) app 無(wú)法使用 socket 接口),對(duì)于 HTTPS請(qǐng)求,proxy.py無(wú)法進(jìn)行透明轉(zhuǎn)發(fā),只能作為中間人先和瀏覽器完成連接,然后獲得其中的明文請(qǐng)求以后在轉(zhuǎn)發(fā)給gae.py 當(dāng)收到 CONNECT請(qǐng)求(這意味著瀏覽器正在瀏覽一個(gè) HTTPS 網(wǎng)站), proxy.py首先利用 GoAgent CA簽發(fā)一個(gè)假的證書(shū)來(lái)和瀏覽器完成握手,從用戶(hù)的角度,所有的 HTTPS網(wǎng)站的證書(shū)都是由事先導(dǎo)入的 “GoAgent CA”認(rèn)證的,所以不會(huì)報(bào)警 有些瀏覽器會(huì)對(duì)少數(shù)網(wǎng)站的證書(shū)進(jìn)行特別的檢查(CertificatePinning),這種情況下 "GoAgent CA”所簽發(fā)的證書(shū)可能會(huì)觸發(fā)證書(shū)不安全的報(bào)警 GoAgent 的這種工作方式導(dǎo)致 HTTPS不再是瀏覽器到網(wǎng)站的端到端安全通信,而變成了 proxy.py 到GAE,以及 GAE 到網(wǎng)站兩段獨(dú)立的 HTTPS 連接,GAE能夠看到請(qǐng)求和應(yīng)答的明文