Многие знакомые просили меня посмотреть на чешское приложение для трекинга зараженных ковидом, под названием eRouška (буквальный перевод с чешского еМаска). Вокруг этого приложения ходит много слухов. Например, что злобное правительство решило установить тотальный контроль над своими гражданами и навязывает им это приложение. Я вообще не сторонник теорий заговора, но действительно стало интересно. Приложение использует Bluetooth для коммуникации с другими устройствами, находящимися в зоне действия. Записывает эти данные в свою базу и получает обновления с сервера. Если был контакт с зараженным, присылает оповещение. Ходили слухи, что после этого оповещения сразу же сажают на карантин.  Первая версия приложения была просто ужасной, как и все приложения подобного типа, разработанные в разных странах. Приложение очень долго не могло попасть в App Store, лишь где-то через месяц у разработчиков получилось как-то его допилить. Потом выяснилось, что на устройствах Apple оно толком и не работало, только сжирало батарейку. Для регистрации на сервере нужно было ввести номер телефона и получить на него SMS-ку. Что уже позволяло Минздраву узнать, кто контактировал с зараженным. Особой популярности это приложение не получило и чешское правительство было вынуждено признать, что проект провалился.  Посмотрев на этот бардак, Google и Apple решили скооперироваться и создали свое API для написания подобных приложений. Что, кстати, породило вторую волну теорий заговора. Например, после апдейта iOS до версии 13.5 появилась страшная настройка: Exposure Notifications, да еще и с иконкой коронавируса.  5G, Билл Гейтс, чипирование – все это крутилось в головах людей и не давало покоя. А теперь и в айфончике «нас посчитали». На самом деле настройка просто активирует API для приложений трекинга и по умолчанию эта она выключена. На базе этого API и написана вторая версия приложения eRouška. Дальше пойдут технические детали и «обычным пользователям» я рекомендую сразу же спуститься вниз страницы, где приложение будет описано с точки зрения пользователя и будут интересные выводы. Ну а если вас не пугают такие слова, как AES, SHA-256 и HMAC, читаем дальше! Традиционно я посмотрел и исходный код, и обмен приложения с сервером. После чего понял, что в этом нет никакого смысла и надо просто прочитать документацию и изучить систему, разработанную Apple и Google. Практически вся работа происходит на сервере Google, через сервисы Google Play. Сервер чешского Минздрава задействуется только в том случае, если есть положительный результат теста на ковид. Извините, такого пока со мной не случалось. Но дальше будет еще интересная статистика, которую я получил в процессе анализа данных.  Система построена на базе «маяков» BLE (Bluetooth Low Energy Beacon). Изначально эта технология проектировалась для защиты предметов от утери-кражи, а также для навигации в помещениях. В 2013 году Apple представила свою технологию iBeacon, а в 2019, с релизом iOS 13, задействовала эти маяки для поиска устройств через Find My. Год назад никто не думал, что эти маяки будут использовать для борьбы с вирусом. Bluetooth устройство при этом работает в broadcast режиме, передавая в эфир определенные данные. Устройства, находящиеся рядом, могут эти данные прочитать и как-то использовать, в том числе и передать дальше. Вот такими виртуальными рукопожатиями и обмениваются устройства, отслеживая контакты с зараженными ковидом.  Конечно же, в новом приложении уже нет номера телефона и SMS-ки для активации. Все, что нужно сделать, это запустить приложение и разрешить устройству использовать API Exposure Notifications. В любой момент приложение можно поставить на паузу. Каждый день на устройстве генерируется Temporary Exposure Key (TEK) – абсолютно случайный набор из 16 байт. Но и он не передается в эфир, чтобы исключить атаку с перехватом кода и его эмуляцией на другом устройстве. В эфир передается Rolling Proximity Identifier (RPI). Этот идентификатор меняется каждые 10 минут, что делает перехват траффика бессмысленным. Сначала из TEK при помощи алгоритма HKDF генерируются два ключа.  шифрования: RPI Key и AEM Key. Ключом RPI мы шифруем текущее время, измеряемое в 10-минутных интервалах. А ключом AEM шифруем метаданные. Насколько я понял из описания системы, metadata пока не используется и является резервным параметром для будущих версий. Далее мы берем текущее время, добавляем к нему еще несколько байт padding-а и шифруем его нашим RPI ключом. Провести обратное преобразование из RPI в TEK практически невозможно, теоретически это займет много миллионов лет даже с использованием всех компьютерных мощностей на планете.  TEK остается секретным до того момента, когда нужно сообщить о том, что человек заражен ковидом. После этого, с согласия пользователя, его ключ публикуется в базе. Эта база хранится на серверах Google Play и приложение делает такие запросы для ее получения: Получаем индекс Индекс содержит список файлов, всего их 14: Скачиваем сами файлы Имя файла — это временной промежуток, равный одним суткам. Внутри зип архива находятся два файла: export.bin и export.sig. Первый файл содержит protobuf со структурой, в которую входит немного служебной информации и, собственно, список ключей TEK. Для каждого человека здесь будет до 14 ключей, так как подразумевается, что за 2 недели до положительного теста он мог быть носителем заразы. Анализ структуры показал, что каждый ключ занимает 31 байт, поэтому по размеру файла можно примерно прикинуть, сколько зараженных система обнаружила за день. Об этом чуть позже.  Итак, на устройстве у нас есть свежие базы TEK, а также огромная коллекция RPI вместе с информацией об уровне сигнала Bluetooth, по которому примерно можно определить расстояние. Эти данные, кстати, интерпретируются так, как выберет Минздрав той страны, в которой внедрена система. Например, авторы приложения eRouška утверждают, что в Чехии опасным считается контакт длительностью больше 15 минут на расстоянии меньше, чем 2 метра. В других странах это может быть по-другому. Проверка контактов осуществляется исключительно в самом приложении и эти данные никуда не передаются. Приложение просто сообщает пользователю о возможном контакте с зараженным. Для проверки приложение берет все скачанные TEK и повторяет для них ту же процедуру, которую я описывал в разделе «Как осуществляется приватность». То есть, мы берем TEK, время, метаданные и заново считаем все RPI, которые мог передать в эфир телефон зараженного. Дальше простая процедура сравнения и фильтрация по времени контакта и расстоянию. Пользователь ставит приложение и забывает про него. Все работает в фоновом режиме. До тех пор, пока не возникнет две ситуации: Система обнаружила возможный контакт с зараженным. Будет просто предупреждение от приложения. Приложение никому об этом не сообщает, кроме пользователя. Дальше уже пользователь сам решает, что ему делать. Он может пойти сдать тест, может ограничить на время контакты с другими людьми, может вообще ничего не делать. Это его социальная ответственность.  Пользователь по какой-либо причине сдал тест, и он оказался положительным. В этом случае на телефон пользователя приходит два SMS сообщения: о том, что тест положительный, и код верификации для приложения eRouška. Дальше опять же решение за пользователем. Он может просто проигнорировать этот код и ничего за это не будет. Либо может опубликовать свои анонимные ключи в базе. Для этого он просто вводит полученный код в приложение, и оно передает ключи на сервер.   Первое, что могу сказать: система сделана очень грамотно и действительно обеспечивает анонимность. Поставить приложение несложно, и оно абсолютно ни к чему не обязывает. Использование BLE маяков не приводит к существенному расходу батареи. И возможно, кому-то будет спокойнее психологически видеть, что контактов с зараженными не было. Но, с другой стороны, придется понервничать, если выяснится, что контакт был.  Согласно данным Google Play, приложение для Андроида скачали больше миллиона жителей Чехии. Для iOSтаких данных нет, но думаю, что цифра в разы меньше. Таким образом, приложение установлено у 12-15% чехов. Конечно же, я не мог не посмотреть, сколько в базе зараженных. Итак, в день, когда официальная статистика говорила о 15664 положительных тестах, в базу попало около 500 ключей пользователей. Из этого сложно сделать какой-то вывод, но видно, что далеко не все пользователи приложения публикуют свои ключи.  А теперь я немножко включу профессиональную паранойю и все же напишу немного слов в стиле «а что, если…» Мы занимаемся разработкой софта для компьютерных криминалистов, и я немного порассуждаю на тему, как теоретически можно использовать эту систему для расследований. Ну или как это могут использовать «плохие парни». В системе все хорошо до тех пор, пока в наших руках не оказалось само устройство. Или, еще лучше, два устройства от двух подозреваемых. Например, они говорят, что вообще друг друга не знают и никогда не видели. Но на устройстве есть масса информации, которая может доказать, что это не так. Как известно, iPhone хранит внутреннюю базу координат, из которой можно определить местоположение телефона в определенный момент времени. Более того, наш подозреваемый может еще пользоваться фитнес трекерами, которые определяют даже количество шагов. Но GPS координаты не настолько точны, чтобы сделать вывод, что люди находились рядом друг с другом. А вот те самые RPI, полученные через BLE beacons, скажут нам, что люди были очень близко друг к другу. Плюс, мы сами можем определить, были ли у подозреваемого контакты с зараженными ковидом, хотя для криминалистики это не такая существенная информация. Конечно же, на всех современных устройствах информация защищена от несанкционированного доступа. Но есть очень много уязвимостей, которыми успешно пользуются как эксперты-криминалисты, так и криминал. Более того, пользователь может сам оставить свое устройство открытым, достаточно не установить на него пароль доступа. И даже если он стоит, устройство может быть изъято в разлоченном виде.  Поэтому берегите свои данные. Пользуйтесь современными устройствами, ставьте стойкие пароли, не оставляйте разблокированное устройство без присмотра. Этот совет универсален и пригодится в любой ситуации. И не болейте, конечно же!  Ссылки по теме: API for Exposure Notifications Cryptography Specification Exposure Notification (Apple) eRouška