В предыдущей публикации мы сравнивали российские системы ДЭГ (дистанционного электронного голосования) с эстонскими — и мгновенно залезли в такие технические детали, как слепая подпись, ключевые пары и так далее, то есть, по сути, в архитектуру систем ДЭГ.
Впрочем, залезли мы относительно поверхностно — на самом деле, российская система ДЭГ (для определённости дальше будем описывать федеральную систему, ибо она в целом интереснее московской) с технической точки зрения устроена крайне непросто, но сложность эта имеет причину. И большинство комментариев о том, что «начальнику на стол ляжет список, кто как проголосовал» — из непонимания или нежелания, иногда намеренного, разобраться в этой сложности.
Конкретные объяснения, «почему с ДЭГ всё плохо», зависят от квалификации высказывающегося — и простирается от «какие числа захотят, такие и покажут» (Дарья Митина, «Коммунисты России», на недавнем круглом столе у Александра Асафова) до ссылок на протокол двух агентств с указанием на отсутствие таковых агентств (статья Александра Исавнина на Хабре).
Попробуем разобраться, так ли всё плохо на самом деле, как устроена российская — для определённости возьмём федеральную, которую делает «Ростелеком», она интереснее — система ДЭГ, что там с протоколом двух агентств и что помешает показать такие числа, какие захотят. Ну и заодно — какие есть основания верить, что система реализована действительно так, как говорится в документах.
Надеемся, вам будет интересно — в конце концов, на Хабре можно быть равнодушным к выборам, но не к сложным технологическим системам!
Опираться мы будем на:
- презентацию архитектуры федеральной системы ДЭГ, сделанную в конце июля Юрием Сатировым из «Ростелекома» (запись лекции на YouTube, презентация в PDF)
- опубликованное ранее ЦИК России официальное описание этой архитектуры (PDF раз, PDF два)
- презентацию модели угроз и нарушителя, представленную на одном из заседаний экспертной рабочей группы при ЦИК России
- наше прямое общение с «Ростелекомом» и ЦИК России по тем вопросам, которые нам показались неясными
Текст подготовлен при активном участии Олега Артамонова, наблюдателя за ДЭГ в 2020 году и члена ТИК ДЭГ в 2021 году. Выражаем благодарность за оперативные ответы на наши вопросы Юрию Сатирову (Ростелеком), Артёму Калихову (Waves Enterprises) и Георгию Грицаю (ЦИК России).
Начнём с обсуждения того, рассматривают ли вообще авторы системы такие вещи, как возможность нарушения тайны голосования, в качестве угрозы.
Модель угроз и нарушителя
Модель угроз и нарушителя (МУиН) — это достаточно традиционный для IT-систем документ, описывающий, каким именно и с чьей стороны атакам и опасностям они могут подвергнуться. Банальные угрозы в целом всем очевидны — хакеры, DDoS, пожар, наводнение, землетрясение и экскаватор в поисках кабеля.
Значительно интереснее угрозы, специфические для конкретной системы — те, которые повлекут не просто её отказ, а скажем так, недопустимое поведение: утрату или искажение обрабатываемых данных, раскрытие внутренней информации. В случае электоральных систем они крайне критичны, так как подозрение на успешную атаку на систему может привести к срыву выборов.
Вообще говоря, есть три вида угроз:
- социальная: т.н. голосование под давлением, когда человека принуждает к определённому выбору руководство или родственники;
- электоральная: когда проводятся манипуляции на уровне процедур избирательной системы, например, вброс бюллетеней;
- техническая: когда осуществляется непосредственная атака на инфраструктуру ПТК ДЭГ (причём как снаружи, так и изнутри).
Обсуждаемая модель угроз работает с третьей категорией — она описывает, какие именно угрозы от каких именно злоумышленников, от иностранных спецслужб до недобросовестных сотрудников, могут быть направлены против ПТК ДЭГ.
Полный текст модели угроз и нарушителя (это примерно полтораста страниц) пока что ЦИК России не опубликован, однако на одном из заседаний экспертной группы при ЦИК была представлена презентация с основными тезисами, на базе которых МУиН формируется. На днях была выложена также выписка из модели угроз, но ничего принципиально нового она нам не добавляет.
Традиционный вопрос журналистов про МУиН, в принципе, очевиден и предельно банален — «а предусмотрена ли защита от иностранных хакеров?» (интересно, как они представляют себе отрицательный ответ?). Однако нас больше интересует вторая часть таблички — это угрозы внутренние.
Как можно заметить, в число возможных нарушителей включены все, начиная от уборщицы в ЦОД и заканчивая администраторами системы.
Второй слайд — про то, от чего система защищается.
По сути, на нём перечислены требования, которым должна удовлетворять любая (а не только электронная) система голосования:
- голосование должно быть тайным;
- избиратель не должен иметь возможности проголосовать дважды;
- голоса избирателей должны быть учтены именно так, как они были поданы;
- не должно быть возможности узнать промежуточный результат голосования.
Например, в бумажном голосовании это реализуется довольно очевидными способами:
- на бумажном бюллетене нет никаких отметок, которые позволили бы по нему установить, кому он был выдан;
- факт голосования отмечается в списке избирателей, где избиратель расписывается в получении бюллетеня;
- пересчёт бюллетеней производится в присутствии наблюдателей;
- до окончания голосования бюллетени находятся в опечатанной урне, которую запрещено вскрывать.
С электронными системами всё на порядок сложнее. Больше всего вопросов вызывает сочетание первого и второго пунктов — многие, например, просто априори не верят в возможность соблюдения тайны голосования в системах ДЭГ (более того, как мы видели на примере эстонской системы, она там действительно соблюдается условно: заполненные бюллетени не анонимны сами по себе, но анонимизируются уже на сервере).
Протокол, который невозможен
Итак, нам необходимо сначала выдать избирателю бюллетень, а потом принять его уже заполненным — но по пути забыть, как звали этого избирателя. Но при этом быть уверенными, что заполненный бюллетень мы принимаем именно от избирателя, а не от случайного прохожего.
С «бумагой» всё достаточно просто — показав паспорт и получив бюллетень, избиратель должен проследовать к урне и опустить его туда. Если он вместо этого проследовал на выход с участка, то проголосовать он уже не сможет (кстати, на каждом УИК есть какое-то ненулевое количество таких избирателей — никто не знает, зачем они так делают, но точное совпадение выданных и полученных бюллетеней политтехнологами даже считается признаком явного вброса: при подсчёте дорисовали недостающее).
С цифрой всё намного сложнее — мы не стоим рядом с избирателем, когда он получает бюллетень, мы вообще никак не видим этого процесса. Вот бюллетень выдали — а вот он вернулся заполненным, например, через десять минут. Никакими внешними признаками удостовериться, что вернулся именно выданный бюллетень, невозможно.
Соответственно, сам бюллетень должен нести неподделываемый (sic!) признак собственной валидности, по которому ещё и нельзя отследить его обратно к отправившему этот бюллетень человеку.
Теоретически, вот уже три десятилетия в академической среде пишутся и публикуются работы по протоколам тайных электронных голосований, краеугольным камнем в которых является так называемый «протокол двух агентств»: одно агентство удостоверяет личность человека и выдаёт некий признак, по которому второе может определить, что этот человек имеет право голосовать, не зная его личность.
Критичным — и самым слабым — моментом является независимость этих агентств: если они могут обменяться информацией и выстроить полную цепочку путешествия избирателя по системе, то они смогут и сопоставить конкретный бюллетень с конкретным избирателем, тем самым разрушив тайну голосования.
Проблема в том, что эта красивая конструкция со всей очевидностью не может быть перенесена в реальность: ни в одной стране мира нет таких двух агентств, которые и обладали бы техническими ресурсами и квалификацией для поддержания куска инфрасктруктуры ДЭГ, и не вызывали бы подозрений в попытках, например, саботировать выборы, и были бы абсолютно независимы друг от друга. Государственные агентства никогда не бывают полностью независимы, к коммерческим компаниям нет доверия, у конкурирующих партий нет квалификации и ресурсов.
Более того, утечка информации может произойти и вообще без прямого участия одного из агентств: разработчиком может быть попросту поставлена в одно или в оба агентства система с бэкдором, сливающая информацию об избирателях третьей стороне. Даже если система поставляется в исходных кодах — а это маловероятно, так как накладывает ещё большие требования на квалификацию каждого из агентств в IT — в огромном объёме этого кода бэкдор можно запрятать так, что его не найдут ещё много-много лет.
Иногда этот тезис используется как довод в пользу полного отказа от ДЭГ — и, конечно, он бы был справедлив, если бы другие формы голосования были бы лучше.
Например, доводы сторонников классического бумажного голосования сводятся к тому, что физически присутствующие на участках наблюдатели могут проконтролировать каждое действие комиссии и избирателей, не допустив никакого беззакония.
На практике, однако, в России — примерно 97 тысяч избирательных участков. Чтобы эффективно наблюдать за выборами, особенно с учётом трёхдневного голосования, на каждый участок надо хотя бы по 3 наблюдателя хотя бы от 5 разных партий — то есть почти полтора миллиона человек. Причём это должны быть люди обученные, заинтересованные, знающие формальные процедуры проведения выборов, не состоящие в родстве или подчинённых отношениях с членами комиссии, не состоящие в сговоре друг с другом, и прочая, и прочая.
Очевидно, что подготовить такую армию качественных наблюдателей попросту невозможно — в результате наблюдение за голосованием эффективно работает в городах-миллионниках, а дальше, по мере снижения численности населения и значимости населённого пункта, падает до тех пор, пока не начинаются чудеса.
Более того, и пересчёт бюллетеней — второе средство, должное спасти выборы — в большинстве случаев не поможет, так как многие способы фальсификации результатов оставляют после себя формально валидную стопку бюллетеней, которые уже можно честно считать и пересчитывать сколько угодно раз.
Значит ли это, что выборы вообще надо отменить, так как эффективных средств контроля за ними на практике нет?
Очевидно, нет. Ещё Черчилль отметил, что демократия — худшая форма правления, если не считать всех остальных, испробованных человечеством. Вопрос в том, какими средствами можно улучшить существующую систему голосования, снизив вероятность и масштаб фальсификаций в ней.
Например, в случае бумажного голосования таким средством могут стать КОИБы (комплексы обработки избирательных бюллетеней), подсчитывающие бюллетени в момент их подачи избирателем и тем самым пресекающие постфактумные манипуляции с ними. Да, вопрос доверия к ним — тоже больной (см. скандал с Dominion на последних выборах в США или запрет на использование голландских КОИБов в Германии), но в любом случае КОИБы при их правильной реализации выглядят как шаг вперёд, делая невозможным целый ряд манипуляций с бюллетенями.
То же самое касается и ДЭГ. Главный вопрос не в том, что в Википедии описана реализация сферического ДЭГ в вакууме — вопрос в том, можно ли техническими средствами построить достаточно надёжную систему ДЭГ в реальном мире.
Ослепление избирателя: обеспечение тайны голосования без двух независимых агентств
В Эстонии на данную проблему, как мы выяснили ранее, попросту забили: там избиратель подписывает бюллетень секретной частью ключевой пары, публичная часть которой государству известна и с конкретным физлицом сопоставлена. Потом, уже после завершения голосования, эта подпись уничтожается. В принципе, это всё равно, что вместо записи в книгу избирателей на обычном голосовании прятать свой бюллетень в конверт с ФИО, паспортными данными и подписью — и в таком виде в урну и бросать (собственно, аналогия и взята с эстонских государственных порталов).
В России, где уровень доверия к выборам и комиссиям и так крайне низок, так вряд ли бы получилось.
Поэтому в российском ДЭГ был использован значительно более сложный механизм, именуемый «слепой подписью», смысл которого в том, чтобы в двух агентствах — неважно, независимы они или нет — попросту не существовало бы единого признака, по которому они могли бы сопоставить избирателя и его бюллетень.
Если пытаться изложить это максимально кратко, схема выглядит так:
- Избиратель заходит на сайт голосования и авторизуется через ЕСИА (в простонародье «Госуслуги», но мы-то с вами знаем, что это разные системы).
- Система ДЭГ, получив из ЕСИА данные учётной записи избирателя, проверяет, есть ли он в книге избирателей, и выдаёт бюллетени, соответствующие выборам, проходящим по его месту жительства. На бюллетенях нет никаких идентификационных признаков, они одинаковы до последнего бита у всех избирателей.
- На устройстве избирателя (код выполняется в браузере) генерируется ключевая пара — секретный и публичный ключ. Назовём публичный ключ K, а секретный — S.
- Публичный ключ маскируется — например, домножается на какое-то случайное, также только что сгенерированное, число. Таким образом получается ключ K“, восстановить по которому исходный ключ K, не зная параметры маскировки, невозможно.
- Замаскированный ключ K“ отправляется на сервер, выдающий бюллетени.
- Сервер подписывает этот ключ своим собственным ключом и возвращает подпись (назовём её C“, чтобы подчеркнуть, что она относится к ключу K“) на смартфон избирателя.
- Одновременно сервер передаёт на смартфон избирателя свой публичный ключ голосования (одинаковый для всех избирателей).
- Заполненный бюллетень на устройстве избирателя шифруется публичным ключом голосования и подписывается секретным ключом избирателя S.
- С подписи C“ и ключа K“ на смартфоне избирателя снимается маскировка — этот алгоритм устроен таким образом, что в результате получается подпись C, валидная для ключа K.
- Зашифрованный и подписанный бюллетень отправляется на сервер приёма бюллетеней, к нему прикладывается публичный ключ избирателя K и полученная в пункте 9 подпись этого ключа С.
- Так как публичный ключ избирателя был создан на его устройстве при получении бюллетеня «с нуля», то сервер приёма бюллетеней ничего о нём не знает — однако может проверить его подпись C, а после этого — проверить, что бюллетень действительно подписан секретной частью этого же ключа. Если на оба пункта ответ положительный — значит, бюллетень был выдан настоящему избирателю (той частью системы, которая ещё знала ФИО этого избирателя).
- Система отправляет бюллетень на хранение в блокчейн.
Таким образом, два сервера — выдающий пустой бюллетень и принимающий заполненный — знают об избирателе:
- выдающий сервер: ФИО, паспортные данные, адрес проживания, ключ K“, подпись C“;
- принимающий сервер: галочки в бюллетене, ключ K, подпись C.
В этой схеме нет ни одного признака, который присутствовал бы одновременно на сервере, выдающем пустые бюллетени, и сервере, принимающем заполненные бюллетени, и позволил бы установить соответствие между бюллетенем и физлицом, его заполнявшим.
Обратите также внимание: анонимизация по сути происходит на устройстве пользователя, большая часть алгоритмов выполняется в его браузере, то есть, их код и состав отправляемых на сервера данных может проверить любой желающий. Соответственно, даже без знания серверной части кода можно с достаточной уверенностью судить о том, корректно или некорректно реализована эта схема.
Итак, зафиксируем первый пункт: в официальном дизайне системы приняты меры к соблюдению тайны голосования даже в том случае, если два агентства не являются независимыми.
Атака сбоку: раскрытие тайны голосования через логгирование
Тем не менее, все мы понимаем, что теоретически бюллетень и избирателя можно сопоставить по косвенным данным — ведя на серверах системы детальные логи: IP-адрес, браузер, время отправки и получения бюллетеня, а потом сопоставив на одном компоненте их с ФИО избирателя, а на другом — с бюллетенем.
Доказать полную невозможность реализации такой схемы нереально. Ни реализация сферического протокола двух агенств в вакууме, ни аудит исходных кодов, ни допуск независимых экспертов в ЦОД — ничто из этого не даёт гарантии, что где-то в системе не осталась хорошо спрятанная закладка, логгирующая и сохраняющая или отправляющая данные, позволяющие идентифицировать избирателя.
Поэтому оценка подобной угрозы также делается по косвенным признакам:
- есть ли основания полагать, что в системе предусмотрена такая возможность?
- есть ли основания полагать, что в системе использовалась такая возможность?
Естественно, на оба вопроса ответ может быть только вероятностный — но с другой стороны, и ответ на вопрос «нет ли на избирательных участках над кабинкой скрытой камеры, подключённой к системе распознавания лиц» — тоже вероятностный, обследовать помещение вас в общем случае не пустят.
Ответы на подобные вопросы каждый должен дать себе сам, однако приведём наши варианты вместе со стоящей за ними логикой.
- таких оснований нет — в первую очередь в силу того, что если бы в систему необходимо было заложить возможность вскрытия тайны голосования, это можно было бы сделать намного надёжнее и проще на уровне её архитектуры; это вызвало бы недовольство некоторого — небольшого — количества экспертов, но в целом уже на уровне СМИ прекрасно зашла бы отсылка, например, к эстонскому опыту и «мы руководствовались международными практиками»;
- таких оснований нет — хотя в России прошло уже два крупных голосования в системе ДЭГ (по поправкам к Конституции и ЕДГ 13 сентября 2020), никаких известных нам свидетельств, что кому-то «на стол легли» поимённые списки, кто как голосовал, нет.
Тем не менее, последний вопрос — довольно серьёзный, ведь если такие списки существуют, как утверждает Александр Исавнин в недавней статье, то сам этот факт обнуляет все разговоры о соблюдении тайны голосования. По этой причине мы запросили как у Александра Исавнина, так и у его коллеги, члена ТИК и члена технической рабочей группы ДИТ Москвы по электронному голосованию Евгения Федина, есть ли у них какие-то фактические свидетельства наличия таких списков. Александр Исавнин ответил «Вы — наследники сурковской пропаганды!», Евгений Федин — «именно списки с голосами избирателей мне пока не попадались». Наверное, на этом вопрос можно считать закрытым.
Соответственно, на данный момент можно с увереностью говорить, что:
- в заявленном дизайне системы способов нарушить тайну голосования не наблюдается;
- так как значительная часть алгоритмов реализована на устройстве пользователя, даже не имея доступа в ЦОД к серверной части системы, можно убедиться, что фактический дизайн системы в части алгоритмов обеспечения тайны голосования соответствует заявленному;
- фактических примеров нарушения тайны голосования на предыдущих двух случаях массового использования ДЭГ в России зафиксировано не было.
Скрыть нельзя показать: проверка избирателем собственного голоса
Ещё один интересный вопрос, косвенно относящийся к тайне голосования — это возможность для самого избирателя проверить, был ли учтён его голос.
В московской системе ДЭГ такая возможность есть, хоть и неофициальная — надо было в момент голосования открыть отладочные инструменты браузера и записать передаваемые на сервер параметры, чтобы потом найти по ним свой бюллетень. Бюллетени отправлялись и хранились в блокчейне в зашифрованном виде, однако перед подсчётом голосов они расшифровывались.
Такая схема вызывает опасения в том, что проверка голоса может быть использована для обеспечения голосования под давлением или продажи голосов избирателей — в качестве подтверждения «правильности» голосования заказчик потребует предъявить ему результат проверки. По этой причине, в частности, возможность оставалась доступной только для технарей с высокой квалификацией, и не выносилась в интерфейс пользователя.
В федеральной системе ДЭГ решили совместить несовместимое — и дать пользователю возможность проверить, что его голос действительно хранится в блокчейне, но не давать возможности этот голос посмотреть (и показать другим).
Для этого вместо одного ключа шифрования бюллетеня будут создаваться два:
- единый ключ шифрования, создающийся на отключённом от сети ноутбуке в присутствии СМИ и наблюдателей. Его секретная половина разделяется на части и раздаётся на флэшках нескольким людям, публичная же на флэшке переносится на сервер голосования, после чего либо данные на ноутбуке уничтожаются (также в присутствии СМИ и наблюдателей), либо ноутбук опечатывается и убирается в сейф;
- ключевые пары, генерирующиеся для каждого проходящего голосования, публичная часть которых передаётся на сервера, а секретная остаётся в HSM — аппаратном модуле, которые позволяет выполнить расшифровку загружаемых в него данных, но не позволяет скачать из него ключ.
Оба публичных ключа при выдаче бюллетеня передаются вместе с ним на устройство избирателя, где бюллетень шифруется ими. Зашифрованные бюллетени складываются в блокчейн.
Просто так взять и расшифровать бюллетени становится невозможным: так как ответная часть одного из ключей хранится в HSM, расшифровка доступна только людям, имеющим к данному HSM доступ. Но для подсчёта голосов это и не требуется: в федеральной ДЭГ используется гомоморфное шифрование, которое позволяет сначала складывать данные, а потом расшифровывать результат.
Чтобы подвести итоги голосования:
- бюллетени, зашифрованные двумя ключами, складываются, в результате чего в силу гомоморфности используемых алгоритмов шифрования получается зашифрованный теми же двумя ключами результат сложения;
- результат сложения отправляется в HSM, где с него снимается первый ключ;
- владельцы флэшек с частями второго ключа собираются вместе (снова в присутствии СМИ) и проводят процедуру сборки ключа из его частей;
- собранный ключ публикуется, с его помощью окончательно расшифровывается результат голосования.
Обратите внимание, что в процессе нигде не производится расшифровка индивидуальных бюллетеней, невозможно это сделать и самостоятельно — для этого нужен доступ к HSM.
В результате избиратель может найти в выгрузке блокчейна свой бюллетень и может проверить, что он действительно его и не был никем модифицирован (так как бюллетень подписан на устройстве избирателя) — но при этом не может посмотреть, а также кому-либо показать, как именно в бюллетене были проставлены галочки. В будущем, по словам разработчиков, это может стать базой для функционала выдачи избирателю криптографически подтверждённой квитанции о том, что его голос учтён (принят и загружен в блокчейн).
Остаётся вопрос учёта бюллетеня в финальном подсчёте — теоретически можно предположить, что результат может быть подменён при расшифровке суммаризованного бюллетеня в HSM. На практике, однако, это несложно проверить, взяв результат расшифровки (он публикуется в блокчейн) и зашифровав его обратно публичным ключом данного голосования.