GoAgent 利用 Google app Engine (GAE) 来实现安全上网,以免费、快速、稳定的特点深受网民的欢迎。但是,GoAgent 的安装和配置中存在两点严重安全风险的问题却鲜为人知。这两点安全风险都可能被攻击者利用进行 “中间人攻击(man-in-the-middle attack)” 来窃取 GoAgent 用户的网络帐号密码等敏感信息,其概括描述如下:
事实上曾经有用户在 GoAgent 主页上的问题跟踪列表中指出了这两个安全问题(见以下链接),但既没有修复也没有广泛公开,多数用户,尤其是非中文用户可能并不知情。下面是这两个问题的详细解释。 https://code.google.com/p/goagent/issues/detail?id=11091 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:33MD5 Fingerprint=56:B1:20:86:1B:0A:B0:61:38:00:1B:C3:67:CF:0C:CC 包含这一 “GoAgent CA” 证书以其私钥(文件中 https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/local/CA.crt 根据版本信息,这一证书和私钥从 2011 年 6 月甚至更早的时间以来一直保持不变。 https://github.com/goagent/goagent/blob/fa9959e577395e48a477fd5495afbc2363a51baa/local/CA.key GoAgent 主要包含两个部分:一个在用户计算机上运行的本地代理程序 https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/local/proxy.py 安装时,用户需要上传 默认情况下,GoAgent 在启动时试图导入上述 GoAgent CA 证书。具体的代码为 https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/local/proxy.py#L337 这个函数会根据用户操作系统通过不同的方式尝试导入证书,在某些情况下会需要管理员(root/administrator)权限。在 Windows 下,这个函数会调用 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 下,会拷贝证书文件到 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 采用了不同的方式存储证书,这一自动安装过程不会导入 GoAgent CA 证书到 Firefox 中。但是 GoAgent 的安装指南和 FAQ 中说明了如何手动导入这一证书: https://code.google.com/p/goagent/wiki/InstallGuide 这一证书随后被
测试页面请访问 https://goagent-cert-test.bamsoftware.com/ 来进行测试。这个页面使用了一个由 GoAgent CA 签发的证书。如果你的浏览器没有受到影响,会显示报警信息;如果没有看到报警,则表明你的浏览器导入了公开的 GoAgent CA 证书,存在严重安全风险。 如何防止风险GoAgent 本身带有生成证书文件 CA.crt 的功能。只需要删除 local/CA.crt 文件就能保证 GoAgent 所导入的证书是唯一的,不会被网络上的攻击者利用来进行攻击。 下面的 “补丁(patch)” 文件会帮助你从 GoAgent 的 git 仓库中删除 0001-Remove-static-CA.crt.patch 如果你以前曾经使用过 GoAgent,务必要检查系统中任何可能的地方,删除 SHA-1 指纹为 如何删除 GoAgent CA 证书Firefox 中,打开 “preferences”,”Advanced”, “Certificates”, “View Certificates”, “Authorities”,然后在证书列表中找到 “GoAgent CA”,选中并点击 “Delete or Distrust...” 按钮,然后确认。
Ubuntu 下,删除 update-ca-certificates --fresh Windows 下,请参考以下链接: http://technet.microsoft.com/en-us/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 来保护本地 即使修改配置启用证书验证( https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/local/proxy.py#L1623 将配置改为 https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/server/gae/gae.py#L184 GoAgent 还提供了一个可选功能,通过 RC4 和一个共享密钥来对 https://github.com/goagent/goagent/blob/c4386808ea943e2ebed25f1e5264943354e3f9cb/server/gae/gae.py#L5 但是,这里的 RC4 加密只能起到一个简单的混淆作用,无法在不启用 HTTPS 的情况下利用这一功能来防止中间人攻击。GoAgent 中的 RC4 无法实现数据的机密性,因为密码本身会通过一个 如何防止风险 确认在 来源:bamsoftware,原文链接。
|