Запуск мобильных приложений для хранения и проверки паспорта вакцинации от правительства Квебека (VaxiCode и VaxiCode Verif) вызвал много споров на прошлой неделе. И не зря; приложение VaxiCode Verif будет использоваться всеми торговцами непродовольственными товарами с 1 сентября 2021 года.

Как и многие другие эксперты, я проанализировал содержимое QR-кода, как только получил его во время первой вакцинации в мае. На прошлой неделе я также проанализировал два приложения, разработанных правительством Квебека и компанией Akinox.

В этой статье мы подробно расскажем, как работает система паспорта вакцинации, созданная правительством Квебека, с технической точки зрения, а также о найденной нами уязвимости в VaxiCode Verif, которая позволила приложению распознавать QR-коды, выданные не правительством, как действительные. На данный момент невозможно подтвердить, что это та же уязвимость, которую нашел «Луи», о чем сообщало Radio-Canada в прошлую пятницу, поскольку никаких технических подробностей пока не было опубликовано.

Мы сообщили Akinox об уязвимости, которую нашли в воскресенье, и подтвердили, что обновление VaxiCode Verif 1.0.2 для iOS, выпущенное на днях, исправляет эту ошибку. Версия для Android еще не анализировалась, но VaxiCode и VaxiCode Verif используют фреймворк Expo, который позволяет создавать приложения для iOS и Android из одного исходного кода. Поэтому приложения на обеих платформах, вероятно, эквивалентны.

Погрузимся в содержимое паспорта вакцинации Квебека

Сначала давайте посмотрим, что содержится в QR-коде. Обычно QR-код содержит только текст. Часто это URL-адрес.

But let’s go back to the Quebec vaccine passport application. We notice that the URL contained in this QR code begins with shc:/. «shc» is actually an acronym for SMART Health Cards, a specification that defines a format for exchanging information about a person’s vaccination status. This specification was born in 2021 with the objective of being able to issue this famous vaccine passport and to be able to verify its veracity. This is the same standard that has been chosen by several American states, including California, New York and Louisiana. The development of this specification is being spearheaded by the Vaccination Credential Initiative, a coalition of public and private organizations working to enable the secure deployment of the passport around the world. Akinox, the company that developed VaxiCode and VaxiCode Verif for the Quebec government, is a member of this organization.

Спецификация описывает, как декодировать числа в URL в читаемый контент.

Информация декодируется в JSON Web Token (JWT), а точнее в JSON Web Signature (JWS), поскольку это подписанный токен. Спецификация SHC не изобретала велосипед: JWT — это существующая технология для обмена зашифрованной или подписанной цифровой информацией.

Если вы хотите узнать больше о содержимом вашего паспорта вакцинации, вы можете легко проверить его с мобильного устройства, используя онлайн-инструмент, разработанный Франсуа Пру.

Следует ли шифровать эту информацию?

Многие предлагали шифровать информацию в QR-коде. Это может показаться хорошим способом ее защиты; однако расшифровать эту информацию было бы слишком просто. Информация должна быть понятна VeriCode Verif, поэтому приложение должно содержать ключ дешифрования. Как только ключ будет извлечен, любой сможет расшифровать QR-коды. Это создаст ложное впечатление безопасности и приведет к еще большей критике со стороны общественности.

По этим причинам протокол SHC не предусматривает метода шифрования. Однако он требует цифровой подписи.

Как работает цифровая подпись

Цифровая подпись основана на асимметричной криптографии, что означает использование пары ключей. Эта пара состоит из закрытого ключа, которым владеет только издатель (здесь — правительство Квебека) для подписи данных, и открытого ключа, который проверяет, что подпись была сделана с использованием закрытого ключа.

Асимметричная криптография используется, среди прочего, для шифрования коммуникаций в Интернете. Нет известных атак, позволяющих подписывать без закрытого ключа или угадать закрытый ключ по открытому.

Это также означает, что приоритетом является защита этого закрытого ключа любой ценой. Компрометация этого ключа позволила бы генерировать криптографически действительные QR-коды. Это не тот случай с найденной нами уязвимостью: нам не понадобился закрытый ключ для подделки подтверждения вакцинации, которое VaxiCode Verif считал действительным. Скорее, проблема заключалась в реализации алгоритма проверки в VaxiCode Verif.

В чем именно заключалась уязвимость в VaxiCode Verif?

Спецификация SMART Health Cards была разработана для обеспечения возможности использования нескольких поставщиков свидетельств о вакцинации. Это отражает реальность того, что каждая страна или регион отвечает за выдачу своих собственных свидетельств. Следовательно, каждое правительство имеет свою собственную пару ключей для подписи и проверки паспортов.

The SHC specification requires the issuing entity to make its public key(s) available on the Internet. The vaccine proof contains a URL to the issuer’s website in the «iss» (short for issuer) field. A verifying application should find the issuer’s public key(s) by concatenating /.well-known/jwks.json to this URL.

Спецификация не определяет (по крайней мере, на данный момент) способ определения доверенности издателя.

Akinox has chosen to include the Quebec government’s public key in VaxiCode and VaxiCode Verif. The application uses this key when the issuer is the Quebec government (specifically if iss is https://covid19.quebec.ca/PreuveVaccinaleApi/issuer). However, the code to download third party issuer keys is still in the application, even though it is not required.

The vulnerability lies in the fact that once a public key is downloaded, it is used to validate any other passport, without checking if it matches the content of the issuer field (iss).

Вот сценарий атаки для отображения поддельного подтверждения вакцинации как действительного:

  • The attackers generate a key pair and make the public key available at https://example.org/.well-known/jwks.json
  • They generate two SMART Health Cards in the form of QR codes:
    • The first is created with arbitrary content, provided the iss is https://example.org.
    • The second one is created with the personal information of the person who wants to impersonate as vaccinated as well as the iss field pointing to the legitimate government domain, and sign it with the key generated in step 1.
  • During a verification of the vaccine passport, the attackers first present the first QR code. This validation will be rejected by VaxiCode Verif, but will force the application to download the attackers’ public key and add it to its trusted keychain.
  • The attackers will then present the second QR code, which will be validated as legitimate by VaxiCode Verif.

Версия 1.0.2, доступная с воскресенья в Apple App Store, исправляет проблему. Это обновление полностью удаляет функцию загрузки открытых ключей с URL-адреса издателя.

Что можно было бы сделать лучше?

Власти и разработчики, ответственные за развертывание подтверждения вакцинации, находятся в сложных условиях, которые трудно смягчить: время. Вся разработка и развертывание подтверждения вакцинации в Квебеке заняли несколько месяцев. Несмотря на некоторые недостатки, система работает.

Правительство Квебека могло бы упустить хорошую возможность опубликовать исходный код разработанных им приложений ради прозрачности. В конце концов, в этих приложениях нечего скрывать и нет ничего секретного. Быстрое обнаружение уязвимостей показало, что анализ большим количеством экспертов улучшает безопасность таких приложений. Публикация исходного кода и его анализ экспертами могли бы избежать скандалов, которые могут подорвать доверие общественности, поскольку все население могло бы само проверить безопасность.

Некоторые также считают, что персональные данные, содержащиеся в паспорте вакцинации Квебека, избыточны. В связи с этим можно было бы создать облегченную версию паспорта, содержащую меньше информации. Тем не менее, эта облегченная версия может быть непригодна за пределами Квебека, поскольку правила определения того, защищен ли человек, могут меняться от региона к региону (какие вакцины считаются действительными, сколько доз и т. д.).

Именно так поступила Швейцария со своим «COVID light certificate». Следует также отметить, что исходный код швейцарских приложений также доступен уже несколько месяцев.

Мы не тестировали серверы, обеспечивающие выдачу паспортов вакцинации, поскольку у нас нет ни мандата, ни разрешения от правительства Квебека или Akinox на это. В отличие от анализа приложений, предоставленных Квебеком, это составило бы атаку на удаленную систему, которая могла бы привести к риску прерывания обслуживания.

Заключение

Наш анализ сначала рассмотрел историю разработки спецификации CHS, которая была разработана на международном уровне специально для выдачи подтверждений вакцинации от COVID-19. Затем мы объяснили важность использования асимметричной криптографии для подписи данных и, в данном случае, для обеспечения действительности предоставленных подтверждений вакцинации. Однако мы обнаружили уязвимость в реализации алгоритма проверки, которая позволяла подделывать подтверждения вакцинации, отображаемые VaxiCode Verif как законные. Мы уведомили Akinox об этой уязвимости, и она была исправлена вскоре после обновления приложения, что заняло всего несколько дней. Наконец, мы указали на потенциальные преимущества большей прозрачности в отношении исходного кода этих приложений.

В результате этого анализа я считаю, что, хотя VaxiCode Verif имел некоторые проблемы при выпуске, технологии, на которых основана система, надежны. Идея использования существующих стандартов и технологий, на мой взгляд, является хорошим решением. Это обеспечивает как безопасность подписей, так и совместимость между регионами, использующими протокол SMART Health Cards. На мой взгляд, уязвимость в системе, которая бы отказала в действительном паспорте вакцинации, имела бы гораздо более серьезные последствия, чем обратная ситуация, и здесь этого не произошло.

Тот факт, что проблема была решена всего за несколько дней, показывает, что все стороны хотят безопасную систему. Всегда есть возможности для улучшения, но использование цифровой подписи, предложенной SHC, на сегодняшний день безопасно.

Читать полный анализ на WeLiveSecurity →