Шон про отримання сертифікату


У попередньому пості я писав, що з фейсбука Шона зникли деякі останні пости.

Витягнув з телеграм-кана́ла Шона ще один важливий пост про «Дію» та COVID-сертифікати. Джере́ла: раз, два, три.

Тож ось він, пост про те, як отримати COVID-сертифікат через портал «Дія» (без встановлення додатку та без «Дія.Підписа») з безкоштовною ЕЦП від Приватбанку.

Прежде всего я хотел бы поблагодарить Дія и Міністерство цифрової трансформації за то, что спустя пять месяцев после публикации технической спецификации на европейские ковидные сертификаты https://bit.ly/3COaQQi я наконец-то смог получить свой QR-аусвайс без Дія.Підпис (который тут нужен как котенку дверца) и верчения головой. На эксперименты с порталом в ад Дия ушло всего четыре часа. Как поет Умка, цитируя Ахматову: я была с моим народом, там, где мой народ к несчастью был.

Начнем с самого сертификата. После сигнатуры “HC1” идет документ CBOR сжатый zlib и закодированный в Base45. Когда-то люди придумали семиуровневую модель OSI чуть менее бесполезную чем полностью (в TCP/IP четыре уровня, и все чего удалось достичь, так это того, что студенты до сих пор спорят на каком уровне находится протокол TLS. Подсказка. На четвертом). В качестве тяжкого наследия нам достался стандарт X.509 и ASN.1 со всеми своими многочисленными DER-BER-высерами, в которых невозможно не накосячить. Потому европейцы плюнули на это говно и перешли на бинарный JSON (CBOR можно перевести, как “вменяемое двоичное представление объектов”. Славим их. И тут же навесили на него COSE - CBOR Object Signing and Encryption.

Информации внутри немного. Фамилия и имя кирилицей и латиницей (в начале диевые перепутали поля, но сейчас все в порядке). Дата рождения (тут диевые перепутали форматы даты, но сейчас опять-таки все в пордке. NB! Если вы получали сертификат в августе, перепроверьте его каким-нибудь европейским приложением, чтобы не оказаться в сложной ситуации Например тут https://sanipasse.fr/). Дата последней прививки и ее тип. И подпись ECDSA (SHA-256/NIST P-256). То есть это не ссылка на говносайт, а документ, который действителен сам по себе (при наличии публичных ключей для проверки).

У стандартов NIST очень непростая судьба. После окончанчания холодной войны Агентство Национальной Безопасности перестало морозиться (именно так процесс описывает Нил Коблитц изобретатель шифрования на эллиптических кривых), и пока SIGINT-департамент пытался пропихнуть дырявый Clipper-чип, IAD (отвечают за защиту) решили поучаствовать в создании цивильных стандартов шифрования. Так как более эффективная подпись Шнорра была накрыта патентом, то они скрестили подпись Эль-Гамаля и Шнорра и получился DSA. У Шнорра подпись формируется как (k - x(H(g^k || m)), H(g^k || m)), x - секретный ключ, k - случайное число. А в DSA (g^k, (H(m) + x(g^k)) / k), деления при подписании и проверке делают процесс неприятным https://bit.ly/2Wh5EVO

К концу девяностых, когда первая криптовойна закончилась поражением правительства, разгорелся внутренний конфликт между RSA (в лице RSA Inc) и ECC (Certicom), потому что криптология - это не только занятная наука, но и лицензионные отчисления. Многие (например Microsoft) тогда просто забили на шифрование, чтобы не нарваться на экспортный контроль с одной стороны и ухватистых коммерсантов с другой. И последствия тех решений аукались и аукаются нам до сих пор.

Тем не менее, когда в 1997 NIST спорил о том каким будет следующий стандарт, обычно молчаливый представитель АНБ, вышел, позвонил по телефону и вернувшись прямо с порога сказал, что его уполномочили от лица Агентства подтвердить надежность шифрования с помощью эллиптических кривых. Сказать, что все охуели - ничего не сказать. Осталось их выбрать.

Кривая в нормальной форме Вейерштрасса задается уравнением y^2 = x^3 + ax + b и конечным полем F_p. Вместе с правилом сложения набор точек (x, y), удовлетворяющих уравнению, образует группу. Ее порядок N согласно теореме Хассе: N - (p + 1) < 2√p ≈ p, то есть для поля F_p существует порядка 2p разных кривых, задаваемых коэффициентами a и b.

Суть в том, что если мы выберем базовую точку (x0, y0) и сложим ее саму с собой k раз, то зная результат (x1, y1) = k * (x0, y0) очень сложно найти k. Проблема называется ECDLP - поиск дискретного логарифма. К тому времени люди уже знали, что среди множества кривых попадаются довольно кривые кривые, и что для аномальных и суперсингулярных кривых ECDLP решается гораздо проще, чем хотелось бы. Осталось правильно выбрать A и B. И тут снова появляется АНБ, предлагая помощь в поисках.

Чтобы показать, что у них ничего не спрятано в рукаве Джерри Солинас из АНБ предложил поступить так: выбираем начальное значение (seed) потом многократно его хешируем с помощью SHA-1 и пробуем получившиеся числа в качестве параметров кривой, пока не будут соблюдены все известные требования по безопасности. В качестве начального значения для кривой P-256 АНБ предложили не π, не e, и не “expand 32-byte k”, а вполне очевидное число c49d 3608 86e7 0493 6a66 78e1 139d 26b7 819f 7e90. Нет, ну правда, подходят к вам и говорят: придумайте число? А вы такой сразу: Элементарно, Ватсон, c49d 3608 86e7 0493 6a66 78e1 139d 26b7 819f 7e90!

Предположим, что кудесники из агентства знают, что в каком-то классе кривых ECDLP решается гораздо проще, чем в общем случае. Все что им остается сделать, начать перебирать сиды, пока нормальный процесс генерации не приведет к нужным параметрам. А что будет, если мы поменяем базовую точку? Выберем свой ключ k, и произвольный параметр x, и посчитаем новую базовую точку G’ = xG, и публичный ключ P = kG? Если кривая уязвима, то атакующий в начале найдет xG, потом представит ключ, как [xk]G, и все что ему остается - посчитать 1/x. С другой стороны, количество уязвимых кривых должно быть необычайно велико (2^209, https://bit.ly/3oemZKi)

Однако, после того, как выяснилось, что АНБ пропихнула в качестве стандарта генератор случайных чисел с бекдором, и подкупили RSA (взятка в десять миллионов) и Juniper (правительственный контракт от МО, для Juniper все закончилось совсем печально, бекдор отжали китайцы и срач в конгрессе продолжается до сих пор), появились совсем уж стандартные стандарты Brainpool (его готовил немецкий аналог АНБ - BSI), ANSSI (это французская госспецсвязь), и даже наша ДССЗЗІ (тогда еще СБУ) разродилась стандартом ДСТУ 4145-2002, который совсем уж никому нахуй не уперся. Тем не менее именно на нем построены украинские цифровые подписи, что делает их совместимыми чуть менее, чем ни с чем. Что хорошо в стандартах - всегда есть из чего выбирать. И совершенно не случайно, что в итоге многие (даже вымогатели) пользуются Curve25519 Бернштейна. Тем не мене, в EUDCC используется ECDSA NIST P-256. С этой кривулей умеют работать все.

Вернемся в Дию. Любые государственные, а особенно все-в-одном приложения я считаю безусловным злом. Я не параноик, но на меня уже поглядывало ФСБ, ФБР и СБУ, и хоть мне действительно (почти) нечего скрывать (иначе бы давно нашли) мне еще только державы, блядь, в смартфоне не хватало. Поэтому я пошел на diia [.] gov [.] ua. Пришлось включить VPN потому, что год назад меня забанили по IP в ІСЕІ. Видимо моя безотказная как маузер кавычка в адресной строке их тогда сильно напугала. Не ссыте, ІСЕІ, не ссыте, солдат ребенка не обидит.

Потом я имел несчастье убедиться в том как “Дия не хранит данные”. В начале портал запросил из банка ФИО, ИНН, полные данные паспорта, ДРФО, телефон, емейл и адрес. Видимо, только на “посмотреть”, потому что тут же начал запрашивать ту же информацию повторно. Специально для того, чтобы нигде её не хранить, полагаю. Ок. Я указал левый номер телефона, левый адрес, неактивный email, и пару раз ошибся в данных паспорта. Не хранит, так не хранит. На нет, как говорится и суда нет. После чего портал выдал ошибку и предложил пообщаться с ботом. Я обновил страницу и ошибка куда-то делась. Ошибочная какая-то ошибка. Потом такая ситуацию повторялась многократно. Дия - ошибаемся даже в ошибках.

И наконец-то я начал подбираться к заветному ковид-аусвайсу. За каким-то хером запрос на получение сертификата должен быть подписан цифровой подписью. Зайти можно с паролем и смс-кой от банка, а вот мед. справка только подписанным запросом. Именно в этом месте вы начинали вертеть головой, менять прическу, одежду и готовиться к пластической операции. Я же сходил в ПриватБанк, и вместо диевой подписи получил обычную. Естественно, вопреки всем законам и инструкциям без личного присутствия. Именно поэтому у нас “Байдены Джо” получают ЭЦП, коллекторы гоняются за условной Людмилой и инфраструктура ключей поломана безвозвратно. Что грозит шквалом мошенничества, по мере смартфонизации.

Ок, я подал запросов на сертификат четыре штуки. На обработку каждого из них уходило около часа и первые три раза система мне отвечала, что “реестр заболел”. Я считаю, что у нас целые министерства болеют, и цифровой трансформации и здравоохранения, при чем это что-то психическое. Но у меня было время подумать.

Во-первых, если я подписал электронный документ, то где моя подписанная копия документа? Может я только что контракт на галеру подписал? Во-вторых, если обращение к реестрам НСЗУ/МОЗ оказалось неуспешным, то как это влияет на уже подписанный запрос? В сертификате цифровой подписи написано, что она “non-repudiable” - неотзываемая. Что мешает использовать тот же подписанный запрос повторно?

Мешает конечно желание минцифры насильно навязать вам цифровые подписи, которые большей части из вас на самом деле не нужны. Свою приватовскую я тут же отозвал (кстати, у них появилась и капча в запросах к CA, и возможность скрыть данные сертификата, не смотря на заверения СБ, что скрепинг CA - это не баг). Это меня конечно не защитит, потому что новый сертификат получается за тридцать секунд, но по крайней мере я уверен, что его не украдут с моего компьютера, и не используют подобрав пароль.

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

Самое обидное из того, что я узнал о EUDCC-сертификатах, это то, что в Германии можно взять нашу без-QR-ную справку от семейного врача зайти вместе с ней в любую аптеку и получить тот самый QR-код. Без беспощадной трансформации и государства в страпоне. Завидую им дико. А вы?

Оновлення 6 жовтня: як і очікувалось, наступного дня пост у фейсбуці повернувся.