跳到主要内容
Reincubate

Technology, security analysis

NHS COVID-19 接触者追踪应用的技术深度剖析

Reincubate Engineering发布于 2020年5月7日更新于 2024年8月2日
本页内容
Cover image for: NHS COVID-19 接触者追踪应用的技术深度剖析

NHS COVID-19 接触者追踪测试版现已在 iOS 和 Android 上开源,同时还有一些文档。作为“保持存活”一文的后续,我们深入研究了源代码。令人惊喜的是,它采用 MIT 许可证,这表明 NHSX 致力于透明和质量。

在过去两天里,多名工程师一直在研究这款应用,想弄清它是否能够保持存活,以及如何做到。要理解这一点,需要比大多数开发者所掌握的更深入地了解相关的 CoreBluetooth 框架。这并不是工程师通常需要深入研究的框架。

很早的时候,我们就发现并报告了这个技巧在 Android 设备上是如何运作的。今晚,我们来分享 iOS 上究竟发生了什么。让我们一步步来看。

初次启动

首次启动时,应用会向 https://api.svc-covid19.nhs.uk/api/devices/registrations 发出一个 PUT 请求,其中包含激活码、推送通知令牌,以及用户输入的邮政编码的前半部分。服务器的响应是一个 linkingId,它会存储在应用的设置中。 应用还会请求推送通知和蓝牙权限,这符合预期。它不会请求位置权限,因此也不会验证用户的邮政编码。只需要邮政编码的前几位数字。

有说法称 Android 应用会访问位置数据,因为 Android 设备上请求访问蓝牙 API 的提示似乎会要求位置权限。不过,我们昨天已经驳斥了这一点:这是 Android 管理蓝牙权限请求的方式所导致的结果。

在 Android 上保持存活

在 Android 上,防止应用在后台休眠很简单,因为原生 API 支持这一功能,让工程师可以对蓝牙硬件进行底层访问。

然而,在 iOS 上情况就没有这么简单了。当应用在 iOS 上退到后台时,其功能会大幅减少。CoreBluetooth 也是如此,这是 Apple 让开发者访问蓝牙的框架。除非有巧妙的变通办法,否则这会让应用检测可能运行在后台模式的 iPhone 变得困难得多。我们用多台 iOS 设备做了测试,让它们闲置了数小时,发现轮询的频率降低了,但这些设备在夜间仍然在通信。

用 Android 唤醒 iPhone

昨天我们还报告过,iOS 应用退到后台时,仍会继续广播蓝牙广告,只是采用了一种 Apple 特有的不同方式。我们认为 NHSX / Pivotal 的工程师对此进行了逆向工程,并为 Android 应用增加了对它的支持。我们可以确认事实正是如此,他们对此的技术细节可以在这里找到。这意味着,除了 iOS 设备能够让应用保持在后台之外,Android 设备还可以唤醒一台“沉睡”的 iOS 设备,无论它已经在后台多久。

那么,这意味着什么?意味着要让应用正常工作,iPhone 必须相当频繁地处于某台 Android 设备的范围之内,这样才能发送保活信号,让自己保持在后台。仅凭这一点,可能不是一个可行的方案,但是……

用 iOS 设备唤醒……其他 iOS 设备

在昨天的“保持存活”一文中,我们报告说,我们认为 iOS 应用使用“保活信号”来绕过后台限制。在检查了 iOS 应用的源代码之后,我们得出结论,情况确实如此。不过,它们究竟是如何工作的呢?

简单来说,在这里,保活信号是应用开发者想出来的一个办法:它是运行该应用的两台 iOS 设备之间发送的一种通知,用来保持两台设备之间的连接。有趣的是,这样做还有一个效果,就是让应用能够保持唤醒状态的时间明显更长,因为当设备收到保活信号时,iOS 会允许应用保持唤醒,以进行一些额外的处理。

从实际角度看,这意味着只要应用靠近其他设备,就能保持存活状态。从某种意义上说,这正是 COVID-19 追踪项目的初衷:即使没有这个技术技巧,也需要有足够多的用户运行追踪应用,才能取得良好的公共安全成果。

无论如何,应用在退到后台时不会立即进入休眠和挂起状态。因此,问题就变成了:大多数用户周围是否有足够多的 iOS 或 Android 设备,使这些变通办法可行。我们的看法是,这似乎很有可能,对于更经常出现在人口密集地区的用户来说更是如此。蓝牙的有效范围相当可观。

一些观察人士提出,应用能够接收静默通知,意味着它在利用这些能力远程唤醒自己。然而,这些能力只是用来告知用户,他们是否曾靠近感染过 COVID-19 的人。应用还使用了本地通知,用来检测应用何时被系统终止,并提示用户重新打开应用。当用户禁用蓝牙时,也会使用类似的通知。

Reincubate 的 CEO Aidan Fitzpatrick 表示:

没错,iOS 13.5 中即将推出的 Apple ExposureNotification 框架确实让这些保活信号变得不再必要。不过,值得注意的是:

  • iOS 13.5 尚未发布,可能还要几周
  • 在昨天之前,iOS 13.5 的最新测试版存在严重的安全漏洞,说明 Apple 的工程团队正在进行大量艰巨的工作
  • 发布之后,大多数 iOS 用户可能要数月才会完成安装(不同寻常的是,Android 上的对应升级可能会更快)
  • 较旧的 iOS 设备,例如 iPhone 6,无法运行 iOS 13,也就无法使用 Apple 的方案
  • NHS COVID-19 应用没有理由不能在未来自动过渡到使用 Apple 的框架,甚至可以同时运行两种机制

随着越来越多的人使用,这款应用会变得越来越有效,从这个意义上说,大规模采用的好处会形成飞轮效应。澳大利亚的 COVIDSafe 应用举步维艰,因为它不支持从 Android 设备检测退到后台的 iOS 设备,也没有这种巧妙的 iOS 到 iOS 的保活机制。

有必要思考一下,在哪些情况下使用这样的技术是恰当的。如果接触者追踪成功地挽救了生命,那么在未来的疾病中是否应用它,应该依据哪些标准来评估?一旦开了先例,是否有理由认为这种技术可能被用来对抗已经存在的传染病?可以预见,不同的社会会以不同的方式权衡利弊。

隐私保障

虽然详细分析该协议背后的数学原理有点超出本文的范围,但我们确实查看了隐私保障措施。这款应用似乎严格遵守了 NCSC 发布的论文。我们可以确认,在用户报告症状之前,没有任何密钥数据会离开用户的设备,而且只有到那时,与其近距离接触过的设备的匿名密钥才会离开设备。用户输入的邮政编码的前半部分,会作为注册服务的一部分发送给 API。

归根结底,代码表明,在用户报告症状并联系 NHS 安排检测之前,使用这款应用几乎没有技术上的隐私风险。到那时,他们的检测结果将由 NHS 管理,不过这无论有没有这款应用都没有区别。然而,当多名用户发生接触、报告症状,并且使用应用提供给他们的标识符安排检测时,可能能够也可能无法在中央层面把他们关联起来。这是后端的问题,正如 NHSX 在其应用隐私报告中所说,在这方面,代码就是真相。

防范虚假报告

由于系统后端并未开源,无法确认这一点,但看起来在公民检测出 COVID-19 阳性之前,不会向其他设备发送任何推送通知。一旦用户报告症状,他们会得到一个可用来预约检测的参考码。(这个码恰好与我们在注册部分描述的 linkingId 相同。)


关于作者

Reincubate Engineering


评论 (1)

Joseph 2020年5月8日

The termination notification seems unreliable in my testing of the production app. Might be that the app sometimes terminates before the notification has been scheduled. They probably need to always have one scheduled a few minutes ahead and keep updating it further into the future on a timer while the app is running. That way when the app dies or is killed the notification is already scheduled.


相关内容


热门文章

King's Award for Enterprise 标志

King's Award for Enterprise:Reincubate 已四次荣获英国最高官方商业荣誉,最近一次是表彰公司过去三年的卓越增长。

我们与用户和合作伙伴的关系是我们价值观和所创造产品的核心。查看 用户评价,听听他们对我们的评价。

通过 Centre for Assessment 的 ISO 27001 认证,获 UKAS 认可

© 2008-2026 Reincubate Ltd. 保留所有权利。在英格兰和威尔士注册,公司编号 5189175,增值税号 GB151788978。Camo®、Streamlight® 和 Reincubate® 是注册商标。专利申请中。

帮助