Техническое глубокое погружение в приложение отслеживания контактов NHS COVID-19
Бета-версия отслеживания контактов NHS COVID-19 теперь является открытым исходным кодом для iOS и Android вместе с некоторой документацией . В продолжение нашего поста « Оставайся в живых » мы глубоко погрузились в исходный код. Приятно удивить, что он лицензирован в рамках MIT, что свидетельствует о приверженности NHSX прозрачности и качеству.
В течение последних двух дней несколько инженеров рассматривали приложение, чтобы выяснить, есть ли и как! - он может остаться в живых. Понимание этого потребовало более глубокого понимания соответствующей CoreBluetooth
чем у большинства разработчиков. Это не структура, в которую обычно должны вникать инженеры
Довольно рано, мы заметили и сообщили, как трюк работал на устройствах Android. Сегодня вечером мы расскажем о том, что происходит на iOS. Давайте пройдем через это.
Начальный запуск
При первом запуске приложение отправляет запрос PUT
на https://api.svc-covid19.nhs.uk/api/devices/registrations
с кодом активации, токеном push-уведомления и первой половиной введенного пользователем почтовый индекс. В ответ сервер отвечает linkingId
который хранится в настройках приложения. Приложение также запрашивает push-уведомления и разрешения Bluetooth, как и следовало ожидать. Он не запрашивает разрешения местоположения и, следовательно, не проверяет почтовый индекс пользователя. Требуются только первые несколько цифр почтового индекса.
Утверждалось, что приложение Android получает доступ к данным о местоположении, поскольку появляется запрос на доступ к API Bluetooth на устройствах Android с запросом разрешений на местоположение. Однако вчера мы опровергли это: это следствие того, как Android обрабатывает запросы на разрешения Bluetooth .
Поддерживать жизнь на Android
Предотвращение спящего приложения в фоновом режиме на Android является тривиальным, так как стандартные API поддерживают эту функцию, предоставляя инженерам низкоуровневый доступ к оборудованию Bluetooth.
Однако на iOS история не так проста. Когда приложения основаны на iOS, их функциональность значительно снижается. Это также относится и к CoreBluetooth
, инфраструктуре Apple, которая предоставляет разработчикам доступ к Bluetooth. Если не считать умного обходного пути, приложению будет значительно сложнее обнаруживать iPhone, которые могут работать в фоновом режиме. Мы протестировали несколько устройств iOS, оставленных в покое в течение нескольких часов, и отметили, что опрос проводился реже, но устройства все еще общались в одночасье.
Использование Android, чтобы разбудить iPhone
Yesterday we also reported that when backgrounded, iOS apps continue to broadcast Bluetooth advertisements, but in a different way that’s specific to Apple. We believed the NHSX / Pivotal engineers had reverse-engineered this, and added support for it to the Android app. We can confirm that this is the case, and their technical details about it can be found here. What this means is that in addition to iOS devices being able to keep the app backgrounded, Android devices can wake a “sleeping” iOS device up regardless of how long it has been backgrounded for.
Так каковы последствия этого? Что ж, это означает, что для того, чтобы приложение работало, iPhone должен находиться в пределах досягаемости Android-устройства, поэтому он может отправлять сообщения поддержки активности, чтобы оставаться на заднем плане. Это само по себе может быть нереальным решением, но ...
Использование устройств iOS для пробуждения… других устройств iOS
Во вчерашнем посте « Оставайся в живых » мы сообщали, что, по нашему мнению, приложение iOS использует «keepalive» для обхода фоновых ограничений. Изучив исходный код приложения для iOS, мы пришли к выводу, что это действительно так. Как именно они работают, хотя?
Проще говоря, keepalive - в этом контексте - это идея, которую разработчики приложения придумали: это уведомление, отправляемое между двумя устройствами iOS, на которых запущено приложение, для поддержания связи между устройствами. Интересно то, что это также позволяет приложению значительно дольше оставаться в бодрствующем состоянии, поскольку, когда устройство получает сообщение активности, iOS позволяет бодрствующему приложению выполнять дополнительную обработку.
С практической точки зрения это означает, что приложение сможет поддерживать свое живое состояние, если оно находится в непосредственной близости от других устройств. Это, в некотором смысле, является обоснованием проекта отслеживания COVID-19: даже без этой технической уловки критической массе пользователей потребуется запустить приложение отслеживания, чтобы достичь хороших результатов в области общественной безопасности.
Независимо от этого, приложение не сразу засыпает и не входит в приостановленное состояние, когда оно находится на заднем плане. Таким образом, возникает вопрос, будет ли большинство пользователей иметь достаточно устройств iOS или Android, чтобы сделать обходные пути осуществимыми. Мы считаем, что это представляется вероятным, и тем более для пользователей, которые чаще посещают населенные пункты. Bluetooth имеет приличный эффективный диапазон.
Несколько наблюдателей предположили, что способность приложения получать тихие уведомления означала, что оно использовало эти возможности для удаленного пробуждения. Тем не менее, эти возможности просто используются для информирования пользователя о том, были ли они рядом с кем-либо, кто заболел COVID-19. Приложение также использует локальные уведомления, которые определяют, когда приложение было убито системой, инструктируя пользователей повторно открыть приложение. Аналогичное уведомление используется, когда пользователь отключает Bluetooth.
Генеральный директор Reincubate Эйдан Фицпатрик говорит:
Да, это тот случай, когда грядущая платформа Apple
ExposureNotification
в iOS 13.5 устраняет необходимость в этих сообщениях поддержки активности. Однако стоит отметить, что:
- iOS 13.5 не была выпущена, и может не быть в течение нескольких недель
- До вчерашнего дня последняя бета-версия iOS 13.5 имела серьезный недостаток безопасности , предполагая, что в командах разработчиков Apple идет тяжелая работа
- После того, как он будет выпущен, большинству пользователей iOS, скорее всего, потребуются месяцы на его установку (необычно, эквивалентное принятие Android может быть более быстрым )
- Старые устройства iOS, такие как iPhone 6, не могут запускать iOS 13 и не смогут использовать технику Apple.
- Нет никаких причин, по которым приложение NHS COVID-19 в будущем не сможет автоматически переходить на использование инфраструктуры Apple - или даже на двойной запуск обоих механизмов.
Приложение будет становиться все более эффективным, так как все больше людей будут его использовать, и выгода от массового внедрения создаст эффект маховика в этом смысле. Австралийское приложение COVIDSafe столкнулось с трудностями, поскольку оно не поддерживало обнаружение фоновых iOS-устройств с Android-устройства, и у него не было этого умного механизма поддержки активности iOS-iOS.
Важно подумать, в каких обстоятельствах использовать такую технологию, как это целесообразно. Если отслеживание контактов успешно спасает жизни, какие критерии должны быть оценены относительно того, применяется ли он для будущих заболеваний? После того, как прецедент установлен, есть ли аргумент, что эта технология может быть использована для борьбы с уже существующими инфекционными заболеваниями? Можно предвидеть, что разные общества будут оценивать компромиссы по-разному.
Конфиденциальность
Хотя подробный анализ математики, лежащей в основе протокола, немного выходит за рамки этого поста, мы взглянули на гарантии конфиденциальности. Приложение строго соблюдает документ, выпущенный NCSC . Мы можем подтвердить, что никакие ключевые данные не покидают устройство пользователя, пока они не сообщат о симптомах, и только тогда анонимные ключи устройств, которые были в непосредственной близости, покинули устройство. Первая половина введенного пользователем почтового индекса отправляется в API как часть службы регистрации.
В конечном счете, код предполагает, что существует небольшая техническая угроза конфиденциальности от использования приложения до тех пор, пока пользователь не сообщит о симптомах и не свяжется с NHS для организации теста. На этом этапе их результаты испытаний будут обрабатываться NHS, хотя с приложением или без него это ничем не отличается. Однако в то время, когда несколько пользователей вступают в контакт, сообщают о симптомах и организуют тесты, используя идентификатор, предоставленный им приложением , может или не может быть возможно централизованно связать их вместе. Это внутренний вопрос, и, как заявляет NHSX в своем отчете о конфиденциальности приложений, в этом отношении код является правдой .
Защита от ложных сообщений
Поскольку внутренняя часть системы не была открыта, это невозможно подтвердить, но кажется, что никакие push-уведомления не отправляются на другие устройства, пока граждане не получат положительный результат на COVID-19. Как только пользователь сообщает о симптомах, ему дается справочный код, который можно использовать для регистрации теста. (Этот код совпадает с linkingId
мы описали в разделе регистрации.)
от Joseph
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.