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

Решение о проведении четвертого тестирования было принято из-за того, что во время предыдущего тестирования возник сбой при запуске процедуры расшифровки голосов, который привел к четырехчасовой задержке начала подсчета голосов, и ряда других неудач.

Четвертое тестирование было организовано непосредственно в тех округах (1, 10 и 30), где 8 сентября запланирован эксперимент. Москвичи голосовали за то, что, на их взгляд, в первую очередь следует развивать в районах: парковочные пространства или парки и зеленые насаждения. Было выдано 2188 электронных бюллетеней. Всего на участие в тестировании зарегистрировался 4865 избиратель. Средняя явка по трем округам составила 44,9%. По сравнению с третьем тестированием было выдано на 382 бюллетеня больше, однако явка упала на 8,2%.

За один день до четвертого тестирования проводился тест системы ДЭГ для участников технической рабочей группы при Общественном штабе по контролю и наблюдению за выборами депутатов Мосгордумы, созданным Общественной палатой Москвы. Во время проведения тестирования прошло «Рабочее совещание с приглашением СМИ», по итогам голосования представителями ОП были анонсированы результаты и сделаны объявления о предстоящем голосовании.

К проведению тестирования были привлечены некоторые члены ТИК и УИК электронных избирательных участков. Также, в составы избирательных комиссий участков дистанционного электронного голосования № 5001, 5002 и 5003 были введены сотрудники ДИТ. Члены комиссий отработали процедуры подготовки участка к открытию, подсчета, печати списка избирателей и протоколов. Протоколы в рамках тестирования не подписывались, наблюдателям копии не выдавались.

За демонстрацией тестирования наблюдали члены технической рабочей группы: Александр Исавнин (программист, член УИК, «Пиратская Партия», «РосКомСвобода»), Дмитрий Кузнецов (программист, член ТИК, «Гражданская инициатива»), Григорий Мельконьянц (сопредседатель движения «Голос», член Научно-экспертного совета при ЦИК России), Дмитрий Нестеров (координатор движения «Голос» по Москве) и Евгений Федин (программист, член ТИК, движение «Сонар»). По итогам наблюдения подготовлен настоящий отчет, который дополняет отчеты о наблюдении на первом и третьем тестировании.

Ключевые выводы

Четвертое тестирование системы дистанционного электронного голосования прошло без видимых сбоев. На предыдущих этапах тестирования были выявлены недостатки шифрования — предполагается, что проблема устранена. Однако закрытые (приватные) ключи последних голосований так и не были опубликованы, поэтому достоверно убедиться в этом не представляется возможным. В ответ на критику, что невозможно удостовериться, что все избиратели, подавшие заявление на включение в список голосующих дистанционно сделали это лично, была введена контрольная процедура выборочного обзвона: члены комиссий прозванивают избирателей, включенных в список для ДЭГ, чтобы подтвердить порядок включения их в список. Выявлена уязвимость, позволяющая производить подмену голоса во время голосования на устройстве избирателя. Через эту уязвимость возможно удаленное вмешательство в выборы и влияние на их результаты. Выявлена недокументированная возможность по логированию действий избирателя с бюллетенем, которая после тестирования была частично устранена. В последний момент разработчики системы отказались от использования анонсированного сервиса, который позволял бы избирателю расшифровать голос и анонимно проверить правильность его учета после окончания голосования. Сервис состоял из двух частей: после голосования он демонстрировал избирателю цифровой код с зашифрованным голосом и интерфейс, куда после окончания голосования можно было вставить код, чтобы проверить правильность учета голоса. Предполагалось, что наблюдатели смогут поставить на свои устройства ноды, чтобы в реальном времени следить за изменением распределенного реестра. Однако по факту в день голосования показывается только веб-интерфейс такой ноды, где видны блоки определенной метки (пачки бюллетеней), а остальные блоки недоступны для контроля. Если провести аналогию с видеонаблюдением — нам предлагают смотреть уже смонтированный ролик вместо живой трансляции. Блокчейн остается подконтролен только техническим специалистам ДИТ и закрыт от прямого наблюдения. Разработчики системы отказались публиковать после окончания голосования закрытый (приватный) ключ, предназначенный для расшифрования волеизъявления избирателя, что не позволит проверить, правильно ли подсчитаны голоса, не было ли ошибок и злого умысла при расшифровке. Не отлажен должным образом процесс обработки и реакции на электронные обращения избирателей, в том числе по оперативному отображению обращений на автоматизированном рабочем месте председателя комиссии. Положение о дополнительных гарантиях обеспечения гласности при проведении эксперимента по дистанционному электронному голосованию, в котором планировалось прописать инструменты для наблюдения, к финальному тестированию принято не было. Московская городская избирательная комиссия приняла его только 3 сентября. Подготовленное для проведения интернет-голосования на выборах в орган государственной власти программное обеспечение так и не было сертифицировано. Не были зафиксированы контрольные суммы файлов с участием регулирующих органов. В условиях отсутствия должных инструментов контроля за системой и наличия уязвимостей, ее использование на выборах депутатов Московской городской Думы 8 сентября сопряжено с критическими рисками сбоев и вмешательства, о которых общество может не узнать.

1. Уязвимость — подмена голоса избирателя во время голосования

На заседаниях технической рабочей группы высказывалось предположение о возможности подмены голоса избирателя во время голосования. Эта уязвимость обсуждалась, но техническая рабочая группа не имела возможности проверить эту гипотезу: в составе группы нет голосующих из экспериментальных округов. На четвертом тестировании эту гипотезу удалось успешно подтвердить. Участники тестирования из трех аккаунтов в присутствии представителей ДИТ и ЦИК России смогли проголосовать одним образом на странице бюллетеня, а в Блокчейн был записан другой голос.

Описание

Подмена голоса избирателя может достигаться за счет дополнительного скрипта, срабатывающего в браузере, с которого производится голосование.

Для проверки гипотезы реальности угрозы была разработана небольшая программа на JavaScript, которая при событии нажатия на кнопку «Проголосовать» подменяет отправляемое значение выбора избирателя. На каждом значении формы после выбора указывается id значения одного заранее определённого кандидата.

В качестве средства доставки программы на JavaScript в браузер избирателя было создано тривиальное расширение для браузера Google Chrome (Chromium), запускающее указанный скрипт на странице elec.moscow (сервер выдачи бюллетеня).

Пользовательский сценарий

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

Возможные риски и направления атак

Данная уязвимость может получить применение, например, на предприятиях: в случае административного давления на избирателей. Избирателей принуждают голосовать через систему ДЭГ, не указывая конкретного кандидата, но строго на указанном работодателем компьютере либо на множестве компьютеров (учебный класс, аудитория).

Голосование на компьютере в помещении УИК дистанционного электронного голосования.

Принуждение к голосованию на компьютере пользователя с выбором профиля злоумышленника либо организации злоумышленника, предполагающего доставку кода в браузер пользователя.

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

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

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

Рекомендации

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

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

Информирование избирателей о рекомендации использовать собственные программно-аппаратные средства.

Рекомендация избирателям осуществлять голосование в режиме инкогнито, не заходя в профиль.

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

2. Недокументированная возможность — логирование действий избирателя с бюллетенем

Перед тестом для технической рабочей группы и последующим четвертым тестированием в использующийся на странице с бюллетенем скрипт ДИТ были добавлены логирования следующих событий:

Успешное получение бюллетеня с соответствующим ответом сервер-сайда;

Ошибка при получении бюллетеня с соответствующим ответом сервер-сайда;

Открытие бюллетеня;

Выбор варианта с указанием варианта, который выбран;

Снятие выбора варианта с указанием, какой вариант перестал быть выбранным;

Нажатие на кнопку отправки результата голосования с указанием выбора в бюллетене;

Ошибка голосования с соответствующим ответом сервер-сайда;

Ошибка шифрования с деталями ошибки.

Непонятными представляются причины реализации логирования из 4 и 5 пунктов. Мы обратились к заместителю руководителя ДИТ А.А. Костырко за разъяснением относительно цели добавления логирования выбора конкретного варианта и снятия такого выбора. После удостоверения, что логирование, действительно, оказалось добавлено, была представлена следующая версия: якобы реализовано функциональное требование к продукту, заключавшееся в восстановлении случайно закрытого бюллетеня при его повторном открытии в течение 15 минут с предустановленной отметкой выбора в соответствии с тем состоянием, в котором был бюллетень перед закрытием.

Однако на следующий день после проведения четвертого тестирования логирование было частично изменено и озвученная причина добавления логирования перестала выглядеть правдоподобно:

Было убрано логирование значения при простановке галки и при ее снятии. Оставлено только логирование факта, что галка поставлена и что она снята;

Прекращено логирование окончательного выбора кандидата, когда избиратель нажимает кнопку посылки голоса;

Добавлено дополнительное логирование отправки голоса без деталей относительно того, за кого отдан голос.

В репозиторий на Github, управляемый сотрудниками ДИТ, 4 сентября был добавлен вариант скрипта, подключаемого на странице с бюллетенем, содержащий дополнительное логирование. Функция осуществления данного логирования — sendHit и соответствующие вызовы.

Настоящие причины добавления подобного логирования представляются неясными: поведение пользователей на странице избирательного бюллетеня превращено в чей-то предмет исследования. Поиск по репозиторию по строке «hit» не приводит к успешному результату: фрагмент серверной части, относящийся к обработке добавленного логирования, не выложен.

Данное логирование можно расценить как веб-счетчик либо набор веб-счетчиков, запрещенных для размещения на странице избирательного бюллетеня пунктом 3.7.1 функциональных требований.

3. Возможности для наблюдения

В предложенном техническом решении ДЭГ есть т.н. «черные ящики» и ряд секторов, которые предполагалось максимально опубличить, чтобы обеспечить открытость, гласность процесса и заслужить доверие к системе.

Списки избирателей и авторизация

Работа со списками избирателей и авторизация — самый непрозрачный этап, администрируемый исполнительной властью. Отсутствуют возможности контроля аккаунтов mos.ru (СУДИР — система управления доступом к информационным ресурсам), невозможно проверить корректность верификации пользователей этих аккаунтов.

При этом на стороне комиссий предусмотрена процедура выборочного обзвона членами участковых комиссий избирателей, включенных в список избирателей для дистанционного электронного голосования, на предмет подтверждения данным избирателем порядка включения его в список избирателей для дистанционного электронного голосования. Результаты таких обзвонов должны заноситься в специальную ведомость. Таким образом можно выборочно проверить, подавал ли избиратель заявление на дистанционное голосование или же его аккаунтом кто-то воспользовался без его ведома.

Анонимизация

Код анонимизатора был опубликован. Предлагается алгоритм получения случайного ключа бюллетеня, полученного из нескольких источников и проксирование пользователя по аналогии с сетью Tor.

Шифрование голоса в бюллетене

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

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

Блокчейн

Предполагалось, что наблюдатели смогут поставить ноды на свои устройства, чтобы в реальном времени следить за изменением распределенного реестра. Из-за особенностей реализации наполнение реестра это возможно только в контуре ДИТ, что вполне корректно, остальные ноды играют роль монитора наблюдателя.

Архитектурно предполагалось контролировать реестр избирателей (выдача бюллетеня) и отправленный в электронную урну бюллетень.

Из-за особенностей блокчейна предполагался контроль программы учета голосов (смарт-контракта), которая тоже записывается в один из блоков реестра.

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

Учет голоса

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

Инструмент для расшифровки голоса избирателя и правильности его учета

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

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

Остаются четыре инструмента для наблюдения

У «электронного» наблюдателя остаются четыре инструмента контроля:

Веб-интерфейс ноды наблюдателя на сайте mos.ru, где показываются блоки с голосами. Регулярно можно скачивать csv файл с указанными данными и пропущенными блоками для последующего анализа на изменения. Таблица со статистикой, которая будет демонстрироваться в помещении комиссии, с четырьмя числовыми показателями: перешло на страницу голосования, правильно ввели авторизационную СМС, выдано бюллетеней и проголосовало. Можно наблюдать за тем, чтобы числа в строках таблицы, обновляемые каждые 15 минут, не росли слева-направо, а уменьшалась. Участковым комиссиям должны быть переданы номера мобильных телефонов избирателей, включенных в список избирателей на соответствующем участке для ДЭГ. Им предоставляется возможность проводить их обзвон на предмет подтверждения данным избирателем порядка включения его в список избирателей. Результаты обзвона вносятся в ведомость по утвержденной Мосгоризбиркомом форме. Наблюдатель, присутствующий в помещении комиссии, вправе наблюдать за процессом обзвона и ознакомиться с ведомостью фиксации телефонных звонков. Программно-аппаратный комплекс дистанционного электронного голосования, расположенный в помещении комиссии, на котором обеспечивается демонстрация следующей информации: