我帮助修复了加拿大ʼ的Covid Alert应用程序

2020-08-25 01:40:36

7月31日,加拿大的COVID警报应用程序被提供给大众使用,尽管它还不支持在大多数省份实际报告诊断。

在魁北克,我们可以运行应用程序的跟踪部分,如果诊断代码在这里可用,应用程序可以追溯报告联系情况。它使用了谷歌和苹果共同创建的追踪机制,在我看来-至少现在-加拿大人应该运行这个东西来帮助我们所有人处理新冠肺炎的问题。我不会永远运行它,但就目前而言,在我看来,它的好处超过了政府可以追踪我的风险,而且它已经在我的手机上启用了。

但是,在我决定接受这个职位并提供我自己的移动数据之前,我想确保这款应用程序做到了它所说的事情--至少在我的能力范围内是这样的。(注意:至少在没有更多上下文的情况下,共享的不是纯粹的移动数据,而是与手机在蓝牙LE无线范围内的其他人的实际物理交互。)(请注意:至少在没有更多上下文的情况下,共享的不是纯粹的移动数据,而是与手机在蓝牙LE无线范围内的其他人的实际物理互动。)。

在我真正的日常携带手机上安装这款应用之前,我决定把它放在我还在用的一部旧手机上,并做一些最基本的沟通层面的分析:它在联系谁?

2015年,我在ConFoo做了一次演讲,题目是用你自己的中间人非攻击检查HTTP(S),这正是我在这里想要做的。该工具在过去5年中得到了改进,启动Mitmproxy,即使从未在这款相对较新的笔记本电脑上使用过,也是一句俏皮话,这要归功于Nix:

这为我提供了一个基于终端的UI和代理服务器,我将旧手机指向它(通过Wifi网络设置,在HTTP代理下,指向我笔记本电脑的本地IP地址)。我需要让mitmproxy创建一个证书颁发机构,它可以用来生成和签署受信任的证书,然后通过在移动Safari中访问http://mitm.it/并执行证书接受舞蹈(这在最新版本的iOS上甚至更复杂),让我的手机信任该颁发机构。同样值得注意的是,某些端点(如Apple App Store)似乎使用证书固定,因此您需要在打开代理之前从App Store安装COVID Alert应用程序。

一旦我完成了拦截自己的流量的所有设置,我就访问了一些https://URL,并在Mitmproxy中看到了请求流。

我再次启动了Covid Alert应用程序,发现了一些奇怪的…。一些令人不安的事情:

除了预期到canada.ca的流量(我注意到它使用的是.alpha.canada.ca,但我怀疑这是因为经常报道的获得.canada.ca TLS证书需要耗费长得令人无法忍受的官僚麻烦,但这是另一回事),我的手机在运行COVID Alert时,正在与谷歌联系。

通过少量的网络搜索,我发现这是一个常用的端点,可以帮助开发人员确定设备是否位于强制门户后面(这种交互需要登录或付款,或者至少需要接受条款,然后才能更广泛地访问Web)。我认为这可能不是COVID Alert的开发者有意为之,但我仍然感到困扰的是,政府希望我们运行的一款用于跟踪人的应用告诉谷歌,我正在运行这款应用,并在这样做的过程中泄露了我的IP地址:

如果互联网协议(IP)地址可以与可识别的个人相关联,则可以将其视为个人信息。例如,在一项投诉调查中,我们确定互联网服务提供商(ISP)正在收集的某些IP地址属于个人信息,因为ISP能够通过客户的订户ID将IP地址链接到客户。

不难想象,谷歌可能有足够的加拿大人数据,这会成为一个真正的问题。

我发现这个应用程序是由加拿大数字服务公司维护的,源代码在GitHub上,但代码本身并不直接包含任何对clients3.google.com的引用。

这是一款Reaction Native应用程序,我想调用Google一定是在其中一个依赖项中,考虑到JavaScript应用程序的规范,这些依赖项被愉快地限制在很大程度上是为了自己做出反应。我不知道这些图书馆中的哪一个在向谷歌呼唤。

现在,我本可以在iOS模拟器上运行这个应用程序(我最终还是这样做了,以测试下面的补丁),但我想让我们看看我的手机实际在做什么。我不屑一顾,在我的旧手机上运行了checkkra1n,这给了我ssh访问权限,这反过来又允许我复制这个应用程序。我把警告抛诸脑后,在我的旧手机上运行了checkkra1n,这给了我ssh访问权限,这反过来又允许我复制这个应用程序。把我的应用程序包放到我的笔记本电脑上,我可以在那里做更多的分析(请注意,这个应用程序被捆绑成CovidShield是因为它之前是由Shopify的志愿者开发的,然后被CDS重新命名(至少我是这么想的))。

(为便于阅读,添加了换行符。)。注意reachabilityUrl:';https://clients3.google.com/generate_204.。找到了!进一步搜索后,我找到了一个名为action-ative-netinfo的包(它直接位于上面链接的Package.json中),以及它的默认配置,该配置将reacvicityUrl设置为Google。

要让它以同样的方式工作,我们需要一个可靠的204端点,这样应用程序就可以命中;为了保证这个应用程序不会将数据泄露到canada.ca之外,我最终提交了应用程序调用的服务器端代码的补丁。(事实证明,这毕竟是没有必要的,但我仍然很高兴我把这一点添加到了我的报告中。)。

然后,我向主应用程序存储库提交了一份关于哪里出了问题,为什么不好的报告,内容是cds-snc/covid-alert-app Issue1003,我对今天的COVID公民责任感觉很好。

加拿大数字服务公司(Canada Digital Service)的优秀员工似乎认识到了这个问题,并同意这是需要解决的问题。几次非常专业的来来回回(老实说:我对CDS几乎一无所知,我期待着像这样的政府机构会有一些变通,我感到很惊喜),我们找到了一个根本不需要调用Reachaability URL的解决方案,他们发布了一个版本的应用程序,解决了我的问题!

加载了新版本后,我再次检查了流量,可以确认新版本的应用程序除了.canada.ca之外不能到达任何地方。