Враньё на блокчейне: чем на самом деле оказалось «электронное голосование»?

Вместо предисловия:

«…я не знаю, как радио работает. Какой смысл? Мне расскажут, что это рука бога, я поверю. Я не знаю, как работает электричество… Я не знаю, что такое код…Я не знаю, как работает мой айфон, я ему доверяю.»

Алексей Венедиктов, главный евангелист системы интернет-голосования в Мосгордуму, главный редактор «Эха Москвы» (источник).

***

Мы долго шли и вот наконец пришли. Ура, будущее здесь — неповоротливая государственная машина теперь устами дедушки с смешной седой причёской сыплет словами вроде «блокчейн» да про какие-то там ключи, декларируется «отсутствие теоретической возможности повлиять на процедуру выборов» (источник). Наконец случилось чудо и устранена главная уязвимость в механизме демократии! Процесс выборов теперь легитимен так, как никогда до этого в истории — за голоса граждан отвечает бездушный код, а не мутные господа из многочисленных избирательных комиссий. Проведены 4 тестирования и пилотный запуск на выборах 8 сентября, в планах — её имплементация в выборы на более высоких уровнях… Казалось бы, что тут может пойти не так? Можете спросить у Юнемана.

Давайте заглянем немного глубже описания, приведённого вот здесь, и попробуем понять, что же всё-таки не так с системой Электронного голосования (ЭГ). Именно с системой, созданной в недрах Департамента информационных технологий (ДИТ) Правительства Москвы, а не с подобными системами в целом (т.к. подобный обзор потребует отдельной масштабной статьи).

Итак, перед нами система, построенная на основе технологии блокчейн. На странице с описанием ЭГ (ссылка выше) описанию достоинств применения в выборах данной технологии посвящен целый раздел FAQ «Почему голосование с использованием блокчейн-технологии — это безопасно и честно?». Например, оттуда: «Блокчейн технологии обеспечивают безопасность при электронном голосовании за счёт свойств самой технологии. Голоса избирателей будут храниться в зашифрованном виде, и их нельзя будет удалить или изменить. Блокчейн-сеть децентрализована, то есть не имеет единого сервера, который контролирует работу сети и отвечает за хранение данных.»

Рассмотрим, как в системе ЭГ применили эту самую волшебную блокчейн-таблетку (с обзором очень помогли парни из basicblockradio.com, у них отличные материалы и полный подробный предвыборный разбор системы ЭГ на 2 с лишним часа).

Сразу оговорюсь, что в открытом доступе нет подробного ТЗ к системе ЭГ и её технического описания. Дальнейшие рассуждения основаны на данных независимых авторов из открытых источников, анализа кода системы на Github (последние изменения в котором были сделаны 7 сентября в 14:18) и на собственных рассуждениях.

Итак, в чём же главное свойство блокчейн систем? Можно сказать, что в строгом многократном шифровании данных, что обеспечивает их стойкость к попыткам злоумышленника их изменить. В целом, да. Но чем достигается подобное? Любой блокчейн, например Bitcoin или Etherium, состоит из так называемых нод (узлов). Ноды связываются между собой через интернет, имеют на борту необходимое ПО и могут обрабатывать данные, содержащиеся в т.н. блокчейне. Блокчейн — это действительно цепочка информационных блоков, каждый из которых содержит в себе информацию, которую туда записывают пользователи (держатели нод). Блокчейн «на пальцах» легко представить, как облачный сервис для хранения данных, вроде Яндекс.Диск или Google.Drive, в котором хранятся Excel-таблицы с записанными в их ячейки данными о действиях пользователей. Каждый узел блокчейн сети имеет свою собственную копию «облака», одинаковую у всех. Всё это многократно шифруется, проверяется и прочее. Главное то, что у всех одинаковые версии данных, и между узлами сети (а значит и пользователями) сформирован т.н. «консенсус». Т.е. все пользователи абсолютно доверяют текущей версии распределённых данных.

Сеть выступает как универсальный арбитр — даже если какой-то из пользователей (или группа пользователей) задумают что-то в данных изменить (например, отменить перевод денежных средств или передать голоса другому кандидату) — другие ноды, имея «на борту» правильные копии данных, всегда смогут распознать злонамеренные действия. Добавим к этому и крайнюю сложность проведения подобных злонамеренных действий (спасибо математике алгоритмов).

Итак, из приведённого выше понятно, что для того, чтобы блокчейн система действительно была «универсальным арбитром», и у пользователей было максимальное к ней доверие — каждый из них должен иметь возможность анализировать данные, содержащиеся в блокчейне, и участвовать в обработке транзакций сети. Иными словами, блокчейн система должна быть публичной. Тем более, когда есть подозрения в конфликте интересов её пользователей.

Теперь, держа это в голове, посмотрим на систему ЭГ. Где расположены ноды этой системы? В ДИТ. На чьей инфраструктуре эти ноды развёрнуты, и чьи сотрудники имеют прямой к ним доступ? ДИТ. Есть ли возможность простому москвичу развернуть у себя ноду ЭГ и участвовать в обработке транзакций? Нет. Есть ли сервисы для публичного анализа блокчейна? Нет. Есть ли возможность контролировать регистрацию в системе ботов в качестве «мертвых душ» во время открытой регистрации и после её закрытия? И тут ответ отрицательный. Никакого общественного контроля в текущей версии системы просто нет — она изначально, архитектурно отсутствует. В итоге мы имеем отличный инструмент для манипулирования голосами под соусом красивых слов и инфографики.

Понимая минимальное значение слова «блокчейн», мы с ходу, не вникая в технические детали, понимаем, что используй его, что не используй – эффект один.

Теперь вникнем в технические детали. На странице проекта ЭГ на Github (ссылка выше) представлен исходный код части системы, в частности, смарт-контракты (программы, записанные в блокчейн и исполняемые сетью), отвечающие за процесс голосования и сохранения данных в блокчейн. Эти программы написаны на языке Solidity, небольшие по объёму и их может относительно легко прочитать любой, кто знаком с программированием. Просматривая репозиторий с кодом, сразу приходит мысль: почему ДИТ выложил лишь часть системы? В добавок, без описания и комментариев в самом коде. Это несколько странно, потому как подобный подход не типичен для проектов подобного уровня. Конечно, спасибо, что выложили хоть что-то, но… Хотелось бы побольше профессионализма.

Процесс электронного голосования происходит следующим образом. Гражданин заходит в личный кабинет на mos.ru, заранее регистрируется в системе. После этого в ЛК открывается возможность электронно голосовать. Никаких криптотокенов, крипто-ключей или сертификатов пользователю не выдаётся. В день выборов пользователь заходит на страницу голосования. После нажатия кнопки на mos.ru происходит обращение к коду смарт-контракта системы ЭГ, отвечающего за процесс голосования. Смарт-контракт проверяет, действительно ли пользователь зарегистрирован в системе и может голосовать, после чего перенаправляет его на web-страничку с бюллетенем для голосования. После того, как все галочки в бюллетене проставлены и нажата большая красная кнопка «ОК», данные голосования шифруются открытым ключом пользователя (который ему выдаёт система ЭГ) и записываются в блокчейн.

Кстати, с шифрованием открытым ключом на этом этапе, связано несколько забавных моментов. Данные голосования шифруются трёхкратным прогоном через алгоритм Эль-Гамаля. За шифрование отвечает код сторонней javascript библиотеки, написанной за 14 майских дней 2016 года каким-то венгром-ноунеймом. Изначально ДИТ использовал для этого шифрования короткие ключи длиной 256 бит, что является непростительным легкомыслием в 2019 году (best practiсe здесь — не меньше 1024, а лучше — 2048 бит). Этот момент и продемонстрировал ДИТ 17 июля 2019 года французский криптограф Пьеррик Годри, который в рамках открытого тестирования системы смог расшифровать данные голосования, хранящиеся в блокчейне (описание процесса можно посмотреть здесь или подробно здесь). ДИТ проблему признал и перешёл на 1024 битные ключи. Позднее, белорусский исследователь Александр Головнев обнаружил ещё одну уязвимость в шифровании данных на этом этапе (описание здесь, подробно здесь). ДИТ проблему пофиксил, но в публичном поле её так и не признал.

Итак, избиратель отдал свой зашифрованный голос блокчейну. На данном этапе голоса недоступны третьим лицам – тем самым выполняется требование законодательства о неразглашении данных голосования до его окончания. Забавно, что вместе с голосом в блокчейн заносится id избирателя. Это позволяет впоследствии однозначно связать избирателя и его голос. Вижу здесь огромные риски поствыборного давления на избирателей.

Идём дальше. После официального завершения голосования, голоса необходимо посчитать. Для этого зашифрованные голоса избирателей надо как-то расшифровать и уже после — посчитать. Расшифровка производится с помощью т.н. секретных ключей, производные от которых открытые ключи передавались пользователям. За расшифровку отвечает специальная функция смарт-контракта. И тут — самое интересное. Расшифрование происходит следующим образом:

  1. функция смарт-контракта получает сигнал об окончании выборов;
  2. она выгружает данные голосов и id избирателей;
  3. где-то в недрах системы ЭГ происходит расшифровка;
  4. расшифрованные данные выгружаются обратно в блокчейн.

Как вам? Целостность данных и их достоверность на этом этапе остаются целиком на совести ЭГ и его админов. Они никак не контролируются смарт-контрактом и, по сути, записываются в блокчейн заново. Далее эти «голоса» считаются комиссией вручную. Т.е. никаких функций подсчёта в смарт-контракте нет.

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

Резюмируя, скажу, что идея отдать голосование на откуп машине мне крайне импонирует. Вот только реализация подобного должна быть совершенно другой. Хотелось бы видеть публичное, общественно обсуждаемое ТЗ на разработку такой системы. Публичный блокчейн, возможность поднимать ноды и участвовать в работе сети. Задокументированный, открытый, полный код системы. Публичный аудит всей системы и смарт-контрактов, в частности, от ведущих исследователей, энтузиастов и компаний — это то, на что стоит потратиться. Больше данных и комментариев по работе системы в публичном доступе. Грамотный технический специалист, ответственный за систему (а не радиоведущий, забывший школьный курс физики).

Также возникает вопрос к выборным лицам и их командам – почему не были проанализированы все уязвимости технологии, и не был поднят шум о текущем положении дел? ДИТ заложил мину, и она, по всей видимости, забрала победу у Юнемана (а, возможно, и не только у него). На каком этапе работы системы эта мина сработала и связаны ли с этим воскресные сбои — вопрос отдельный.