『轉』GoAgent漏洞可能导致中间人攻击

GoAgent 导入公开私钥的根证书的问题

· 测试页面

· 如何防范风险

· 如何删除 GoAgent CA 证书

GoAgent 没有进行正确的 TLS 验证,存在中间人攻击的风险

· 如何防范风险

GoAgent (https://github.com/goagent/goagent) 利 用 Google App Engine(GAE) 来代理上网的一个工具,深受网民的欢迎。但是,GoAgent 的安装和配置中存在两点严重安全风险 的问题却鲜为人知。这两点安全风险都可能被攻击者利用进行 “中间人攻击(man-in-the-middle attack)” 来窃 取 GoAgent 用户的网络帐号密码等敏感信息,其概括描述如下:

-   GoAgent 在启动时会尝试自动往系统的可信根证书中导入一个名为 “GoAgentCA” 的证书。由于这个证书的私钥是公开的,导致任何人都可以 利用这个私钥来伪造任意网站的证书,进行 HTTPS 中间人攻击。即使在不开启 GoAgent 时,这种攻击的风险仍然存在。换而言之,一旦这个证书 被导入,攻击者可以用此绕过几乎所有网站的 HTTPS 保护。

-  GoAgent 本身对 TLS 证书的认证存在问题,而且默认时不对证书进行检查,这导致在使用 GoAgent 时存在 HTTPS 中间人攻击的风险。

事实上曾经有用户在 GoAgent 主页上的问题跟踪列表中指出了这两个安全问题(见以下链接),但既没有修复也没有广泛公开,多数用户,尤其是非中文用户可能并不知情。下面是这两个问题的详细解释。

-   https://code.google.com/p/goagent/issues/detail?id=11091

   -   https://code.google.com/p/goagent/issues/detail?id=8031

GoAgent 导入公开私钥根证书的问题 

    GoAgent 在启动时会尝试在系统中导入一个根证书来避免访问 HTTPS 网站时的证书报警,但在默认情况下所导入证书的私钥是公开 的。因为私钥公开,任何人可以作为 “GoAgent CA” 来签发任何网站的证书。即使在 GoAgent 没有启动甚至卸载的情况下,这个公钥仍会 遗留在系统中。在有些系统中,GoAgent 所导入的根证书不仅被 GoAgent 默认使用的浏览器信任,其他的浏览器也可能会信任这一根证书,从而 受到这一问题的影响。

GoAgent 所导入的这一公开私钥根证书的指纹是:

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” 证书以其私钥(文件中 “—–BEGIN RSA PRIVATE KEY—–” 位置)的文件 URL 为:

https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/local/CA.crt

根据版本信息,这一证书和私钥从 2011 年 6 月甚至更早的时间以来一直保持不变。

https://github.com/goagent/goagent/blob/fa9959e577395e48a477fd5495afbc2363a51baa/local/CA.key

GoAgent 主要包含两个部分:一个在用户计算机上运行的本地代理程序proxy.py,以及一个在 GAE 上运行的远程代理程序 gae.py。

https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/local/proxy.py

https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/server/gae/gae.py

安装时,用户需要上传 gae.py 到 GAE。用户浏览器通过设置一个本地代理将HTTP/HTTPS 请求转发到 proxy.py,再由 proxy.py 和 gae.py 进行通信。

默认情况下,GoAgent 在启动时试图导入上述 GoAgent CA 证书。具体的代码为proxy.py 中的 CertUtil.import_ca:

https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/local/proxy.py#L337

这个函数会根据用户操作系统通过不同的方式尝试导入证书,在某些情况下会需要

管理员(root/administrator)权限。在 Windows 下,这个函数会调用CertAddEncodedCertificateToStore 这一 API。在 OS X 下,会尝试执行系统命令

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 下,会拷贝证书文件到 /usr/local/share/ca-certificates 然后执行 update-ca-certificates。在其他 GNU/Linux 发行版中,会尝试执行以下命令更改 NSS 数据库:

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 采用了不同的方式存储证书,这一自动安装过程不会导入 GoAgentCA 证书到 Firefox 中。但是 GoAgent 的安装指南和 FAQ 中说明了如何手动导入这一证书:

https://code.google.com/p/goagent/wiki/InstallGuide https://code.google.com/p/goagent/wiki/FAQ 。

这一证书随后被 proxy.py 用来作为 HTTPS 中间人来避免浏览器在访问 HTTPS网站时出现报警。GoAgent 的工作原理如 下:首先 proxy.py 将浏览器的 HTTP请求进行编码并转发给 gae.py,gae.py 完成收到的请求然后将结果进行编码后返回 给 proxy.py,最后 proxy.py 将结果转发给浏览器来完成 “翻墙” 过程。由于 GAE 的限制 (免费 app 无法使 用 socket 接口),对于 HTTPS 请求,proxy.py 无法进行透明转发,只能作为中间人先和浏览器完成连接,然后获得其中的明文请求以 后在转发给 gae.py。当收到 CONNECT 请求(这意味着浏览器正在浏览一个 HTTPS 网站), proxy.py 首先利 用 GoAgent CA 签发一个假的证书来和浏览器完成握手,从用户的角度,所有的 HTTPS 网站的证书都是由事先导入 的 “GoAgent CA” 认证的,所以不会报警。有些浏览器会对少数网站的证书进行特别的检查(Certificate Pinning),这种情 况下 "GoAgent CA” 所签发的证书可能会触发证书不安全的报警。GoAgent 的这种工作方式导致 HTTPS 不再是浏览器到网站的端到 端安全通信,而变成了proxy.py 到 GAE,以及 GAE到网站两段独立的 HTTPS 连接,GAE 能够看到请求和应答的明文。

测试页面

    请访问 https://goagent-cert-test.bamsoftware.com/ 来进行测试。这个页面使用了一个由 GoAgent CA 签发的证书。如果你的浏览器没有受到影响,会显示报警信息;如果没有看到报警,则表明你的浏览器导入了公开的 GoAgent CA 证书,存在严重安全风险。

如何防范风险

GoAgent 本身带有生成证书文件 CA.crt 的功能。只需要删除 local/CA.crt 文件就能保证 GoAgent 所导入的证书是唯一的,不会被网络上的攻击者利用来进行攻击。

下面的 “补丁(patch)” 文件会帮助你从 GoAgent 的 git 仓库中删除 CA.crt文件,请下载补丁文件并执行以下命令:

git am 0001-Remove-static-CA.crt.patch.

如果你不是通过 git 获得GoAgent(例如直接从 http://code.google.com/p/goagent/ 上的链接下载得到),请手动删除 local/CA.crt 文件。 https://www.bamsoftware.com/sec/0001-Remove-static-CA.crt.patch 如果你以前曾经使用过 GoAgent,务必要检查系统中任何可能的地方,删除 SHA-1指纹为

AB:70:2C:DF:18:EB:E8:B4:38:C5:28:69:CD:4A:5D:EF:48:B4:0E:33

的“GoAgent CA” 证书(建议使用浏览器访问上面的测试页面进行检查)。下面说明在常见系统中检查和删除 GoAgent CA 证书的方法。

如何删除 GoAgent CA 证书

    Firefox 中,打 开 “preferences”,”Advanced”, “Certificates”, “View Certificates”, “Authorities”, 然后在证书列表中找到 “GoAgent CA”,选中并点击 “Delete or Distrust…” 按钮,然后确认。

Ubuntu 下,删除 /usr/local/share/ca-certificates/GoAgent.crt 然后执行

update-ca-certificates --fresh

Windows 下,请参考以下链接:

http://technet.microsoft.com/enus/library/cc754841.aspx#BKMK_addlocal

中"Adding certificates to the Trusted Root Certification Authorities store for a local computer" 的 步骤,但是在 step 8 时右键选中 "GoAgent CA" 然后选择 "Delete"。

在 Mac OS X下,打开 “Keychain Access” 应用,点击锁图标并输入密码解锁。在边上的控制面板中,选 择 "System" 以及 "Certificates",选中 "GoAgent CA" 然后按 “Delete” 键,点 击 "Delete" 按钮并输入你的密码确认。

GoAgent 没有进行正确的 TLS 验证,存在中间人攻击的风险

默认情况下,GoAgent 会通过 HTTPS 来保护本地 proxy.py 和 GAE 服务器上的 gae.py 之间的通 信 (在配置文件 proxy.ini 中相关的设置默认为gae.mode=https)。但是同样在默认情况下,GoAgent 不会要求 对 GAE 服务器的证书进行验证(gae.validate=0),这导致本地 proxy.py 和 App Engine服务器之间的通信存 在 HTTPS 中间人攻击的风险。此外, gae.validate 配置项同样控制 App Engine 上的 gae.py 是否对网站服务器的 证书进行验证,默认配置下这一配置为 0 导致 gae.py 也不会对网站证书进行验证,使得 gae.py和网站之间的通信同样存在 HTTPS 中 间人攻击的风险。

即使修改配置启用证书验证(gae.validate=1),GoAgent 对 App Engine 服务器证书的验证也并不严格: 在 proxypy 中只是对证书的 organizationName 进行了粗略的检查(是否为 “Google ” 开头),而没有对主机名 (hostname)进行匹配。 https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/local/proxy.py#L1623

将配置改为 gae.validate=1 同时会启用 gae.py 段对网站服务器证书的验证,这部分的事先没有明显的问题。

https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/server/gae/gae.py#L184

GoAgent 还提供了一个可选功能,通过 RC4 和一个共享密钥来对 proxy.py 和gae.py 之间的数据进行进一步的混淆。启用 这一功能需要在 proxy.ini 中设置gae.password,以及 gae.options=rc4,并在 gae.py 中设置 __password__ 变量。 https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/server/gae/gae.py#L5

但是,这里的 RC4 加密只能起到一个简单的混淆作用,无法在不启用 HTTPS 的情况下利用这一功能来防止中间人攻击。 GoAgent 中的 RC4 无法实现数据的机密性,因为密码本身会通过一个 G-password 头在 proxy.py 和 gae.py 中传 送,而且在两段通信中会使用同样的密码流(keystream),导致攻击者很容易通过密文的 XOR操作来获得 XOR 过的明文(见流密码的重用问 题,Stream Cipher Key Reuse),进而得到明文。在这里 RC4 只能起到防止其他 GoAgent 用户共享服务端流量的目的, 无法提供更多的保护来防止网络攻击。

如何防范风险

    确认在 proxy.ini 中设置了 gae.mode=https (默认),并且启用了证书验证 gae.validate=1(非 默认)。这样的设定基本上能够防止 proxy.py 和GAE 服务器,以及 GAE 服务器和网站服务器之间的 HTTPS 中间人攻击。由于 proxy.py 中没有对证书的主机名进行严格匹配,proxy.py 和 GAE 服务器 的通信仍存在(相对较小的)风险,如果有人能够申请 到 organizationName 字段以“Google ” 开头的证书,仍然能够成功进行HTTPS 中间人攻击。

參考:http://www.freebuf.com/vuls/35936.html

转: GoAgent 3.0.6 已发现的安全漏洞(缺陷) - 美博园

基于GAE的GoAgent代理的安全提醒 - 美博园

网 友 留 言

2条评论 in “『轉』GoAgent漏洞可能导致中间人攻击”
  1. 美博园 says:

    删除 local/CA.crt,下次是會自动生存。不用管它。

  2. jap says:

    删除了 local/CA.crt,下次打开又自动生存。把空白文本改为CA.crt变无效正书,GoAgent就不能用了。

这里是你留言评论的地方

9 + 6 =
Copyright © 2007 - 2018 , Design by 美博园. 版权所有. 若有版权问题请留言通知本站管理员. 【回到顶部】