Бета-версия приложения NHS COVID-19 для отслеживания контактов теперь имеет открытый исходный код и для iOS, и для Android, а также документацию. В продолжение нашей статьи «Staying alive» мы подробно изучили исходный код. Приятно удивляет, что он лицензирован под 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
Вчера мы также сообщали, что в фоне приложения iOS продолжают рассылать рекламные пакеты Bluetooth, но по-другому, специфичным для Apple способом. Мы полагали, что инженеры NHSX / Pivotal провели обратную разработку этого механизма и добавили его поддержку в приложение для Android. Мы можем подтвердить, что так и есть, а их технические подробности об этом можно найти здесь. Это означает, что помимо способности устройств iOS оставлять приложение в фоне, устройства Android могут разбудить «спящее» устройство iOS независимо от того, как долго оно находится в фоне.
Каковы же последствия? Это означает, что для работы приложения iPhone должен достаточно часто находиться в зоне действия устройства Android, чтобы получать от него keepalive-сигналы и оставаться в фоне. Само по себе это может не быть рабочим решением, но...
Использование устройств iOS для пробуждения... других устройств iOS
Во вчерашней статье «Staying alive» мы сообщали, что, по нашему мнению, приложение для iOS использует «keepalive» для обхода ограничений фонового режима. Изучив исходный код приложения для iOS, мы пришли к выводу, что так и есть. Но как именно это работает?
Проще говоря, keepalive в данном контексте — это придумка разработчиков приложения: уведомление, отправляемое между двумя устройствами iOS с этим приложением, чтобы поддерживать соединение между ними. Интересно, что это также позволяет приложению оставаться активным значительно дольше, ведь когда устройство получает keepalive, iOS позволяет приложению не засыпать для дополнительной обработки.
С практической точки зрения это значит, что приложение сможет сохранять активное состояние, если находится рядом с другими устройствами. В этом, по сути, и заключается смысл проекта по отслеживанию COVID-19: даже без этого технического приёма для хорошего результата в сфере общественной безопасности необходима критическая масса пользователей, запускающих приложение для отслеживания.
Независимо от этого приложение не засыпает сразу и не переходит в приостановленное состояние, когда уходит в фон. Поэтому вопрос в том, будет ли большинство пользователей находиться достаточно часто рядом с достаточным числом устройств iOS или Android, чтобы обходные приёмы работали. Мы считаем, что это вероятно, и тем более для тех, кто чаще бывает в людных местах. У Bluetooth достаточно хороший эффективный радиус действия.
Некоторые наблюдатели предполагали, что способность приложения получать беззвучные уведомления означает, что оно использует эти возможности, чтобы удалённо будить себя. Однако эти возможности используются лишь для того, чтобы сообщить пользователю, находился ли он рядом с теми, кто заразился COVID-19. Приложение также использует локальные уведомления, которые определяют, что система завершила приложение, и предлагают пользователям открыть его снова. Подобное уведомление используется и тогда, когда пользователь отключает Bluetooth.
Генеральный директор Reincubate Aidan Fitzpatrick говорит:
Да, действительно, готовящийся фреймворк Apple
ExposureNotificationв iOS 13.5 устраняет необходимость в этих keepalive. Однако стоит отметить следующее:
- iOS 13.5 не выпущена и может не выйти ещё несколько недель
- До вчерашнего дня в последней бета-версии iOS 13.5 была серьёзная уязвимость, что говорит о напряжённой работе инженерных команд Apple
- После выхода релиза, скорее всего, потребуются месяцы, прежде чем большинство пользователей iOS его установит (необычно, но на Android обновление может распространиться быстрее)
- Старые устройства iOS, например iPhone 6, не могут работать на iOS 13 и не смогут использовать подход Apple
- Нет причин, по которым приложение NHS COVID-19 не сможет в будущем автоматически перейти на фреймворк Apple или даже работать сразу на двух механизмах
Приложение будет становиться всё эффективнее по мере того, как им пользуется больше людей, и преимущество массового распространения создаст в этом смысле эффект маховика. Австралийскому приложению COVIDSafe было трудно, потому что оно не поддерживало обнаружение устройств iOS в фоне с устройства Android и в нём не было этого хитрого механизма keepalive между устройствами iOS.
Важно задуматься, в каких обстоятельствах уместно применять такие технологии. Если отслеживание контактов окажется успешным в спасении жизней, по каким критериям нужно оценивать, применять ли его при будущих заболеваниях? Когда прецедент будет создан, не появится ли довод, что эту технологию можно использовать для борьбы с уже существующими инфекционными заболеваниями? Можно предвидеть, что разные общества будут по-разному оценивать компромиссы.
Меры защиты конфиденциальности
Подробный анализ математики протокола выходит за рамки этой статьи, но меры защиты конфиденциальности мы изучили. Приложение, судя по всему, строго следует документу, опубликованному NCSC. Мы можем подтвердить, что никакие ключевые данные не покидают устройство пользователя, пока он не сообщит о симптомах, и лишь тогда с устройства уходят анонимизированные ключи устройств, находившихся рядом. Первая половина введённого пользователем почтового индекса отправляется в API в рамках службы регистрации.
В конечном счёте код говорит о том, что использование приложения несёт небольшой технический риск для конфиденциальности, пока пользователь не сообщит о симптомах и не свяжется с NHS, чтобы записаться на анализ. С этого момента его результат анализа обрабатывает NHS, но это ничем не отличается от ситуации с приложением и без него. Однако когда несколько пользователей контактируют друг с другом, сообщают о симптомах и записываются на анализы с использованием идентификатора, предоставленного приложением, централизованно связать их, возможно, получится, а возможно, нет. Это вопрос серверной части, и, как сказано в отчёте NHSX о конфиденциальности приложения, в этом отношении код — это истина.
Защита от ложных сообщений
Поскольку серверная часть системы не имеет открытого исходного кода, подтвердить это невозможно, но, судя по всему, push-уведомления на другие устройства не отправляются, пока граждане не получат положительный результат теста на COVID-19. Когда пользователь сообщает о симптомах, ему выдают контрольный код, по которому можно записаться на анализ. (Этот код оказывается тем же самым, что и linkingId, описанный нами в разделе о регистрации.)





