Открытые исходники
Недавно в открытый доступ были выложены исходники системы голосования, которая по всей видимости, и будет применяться на электронном голосовании по Конституции в Москве и Нижнем Новгороде.
Данным посланием хабражителям я хотел бы открыть обсуждение того, что получилось у разработчиков, и как нам теперь с этим жить.
Введение и просьба о помощи
Эта разработка Департамента информационных технологий (ДИТ) г.Москвы, предыдущая версия которой вероятно, уже знакома некоторым из читателей: как я понимаю, именно она применялась на выборах муниципальных депутатов в прошлом году.
В силу недостатка времени, очень кратко и поверхностно ознакомившись с предъявленными исходными текстами, а также пройдя тестовое голосование, я прошу хабр-сообщество о помощи в более глубоком анализе этого программного обеспечения с точки зрения его технических, административных, программных, сетевых и других уязвимостей, которые могут исказить волеизъявление граждан, доверивших свой голос этой системе.
Мои заметки
Что мне удалось понять к данному моменту из этих исходников, а также из других источников.
Платформа
Lumen PHP-Framework — веб-оболочка
Exonium — разновидность блокчейна
Как работает
Вот как я понимаю работу системы.
Веб-оболочка выполняет все интерфейсные функции, вплоть до формирования бюллетеня — отдельной страницы с кодом, обращающимся прямо из браузера к серверной части подсистемы блокчейна через специального легкого клиента (входит в состав exonium).
Код бюллетеня формирует транзакцию с голосом и передает ее на сервер, для включения в журнал транзакций. Транзакция зашифрована и подписана, что призвано защитить тайну голосования и неизменность голоса.
В рамках обработки транзакции, выполняется печать (зашифрованной?) квитанции регистрации голосующего и квитанции с (зашифрованным?) голосом (согласно разъяснениям, на разных принтерах в разное время, чтобы исключить деанонимизацию по времени).
Ключ шифрования формируется перед началом голосования, делится на части и раздается лицам из числа наблюдателей.
После завершения голосования, ключ собирается и вводится в систему, что позволяет расшифровать транзакции и подсчитать голоса.
Возможные уязвимости
Доверяя использованным инструментам, я бы указал на следующие вероятные уязвимости, вытекающие из архитектуры системы и особенностей ее развертывания.
Уязвимость 51%
Эта уязвимость давно и хорошо известна всем, кто даже не очень хорошо знаком с блокчейн-системами. Она заключается в том, что когда в одних руках сосредоточено управление более чем 50% узлов формирования блоков, система становится зависимой от честности владельца этих узлов. Нет никаких признаков, что у развернутой для голосования системы узлы формирования блоков распределены между независимыми вычислительными центрами. Это с высокой вероятностью означает, что развернутая система подвержена данной уязвимости.
Регистрация голосующих
Судя по коду, та часть системы, которая имеет дело с блокчейном, не осведомлена о первичных регистрационных данных голосующих. Таким образом, данные о голосующих избирателях поступает в эту часть системы извне. Имея доступ к этому API, систему по всей видимости, можно будет заполонить несуществующими избирателями.
Подтверждение личности на сайте mos.ru
Данная уязвимость имеет более обширный контекст, нежели рассматриваемая система голосования.
Сайт mos.ru, используемый в качестве источника аутентификации московского избирателя, позволяет три степени подтверждения личности: отсутствие, сверка личных данных, личный визит клиента в центр авторизации. При этом, согласно сообщениям в социальных сетях и проговорке разработчика на рабочей группе, для предстоящего голосования достаточно второй степени подтверждения личности: сверки личных данных, которая должна была быть совершена до 5го июня. Таким образом, располагая до этого момента базой личных данных, фрагмент которой обнаружил корреспондент т/к Дождь, сайт mos.ru можно было скомпрометировать.
Заключение
Прошу всех интересующихся включиться в аудит платформы голосования. Выводы, сделанные мной в условиях дефицита времени, весьма предварительны, буду очень рад всем аргументированным замечаниям.
UPD
Подкаст с разработчиками (один из них — автор коммитов в репозитории)
Автор: Всеволод Новиков