Перейти к материалам
Тестирование интернет-голосования
разбор

В московском интернет-голосовании нашли еще одну серьезную уязвимость. Мэрия отказалась это признавать (и по-тихому все исправила)

Источник: Meduza
Тестирование интернет-голосования
Тестирование интернет-голосования
Андрей Никеричев / Агентство городских новостей «Москва»

28 августа прошло четвертое и последнее тестирование интернет-голосования перед тем, как эту систему впервые опробуют на выборах в Мосгордуму 8 сентября. Воспользоваться таким вариантом голосования готовы около пяти тысяч москвичей в трех округах, где проходит эксперимент (чуть меньше 1% избирателей в этих округах). Перед последним тестированием мэрия Москвы исправила критическую уязвимость, которая позволила бы узнавать результат выборов прямо во время голосования. Признать это организаторы голосования отказались — зато решили до последнего момента не показывать исходный код системы независимым экспертам.

Утечка бита

В чем проблема

Главную уязвимость московской системы интернет-голосования обнаружил в начале августа французский криптограф Пьеррик Годри: он показал (и «Медуза» это воспроизвела), что ключи шифрования слишком короткие, их можно взломать за 20 минут на бытовом компьютере. Мэрия оперативно заменила ключи на более длинные, Годри отправили миллион рублей за его находку (хотя власти до сих пор отказываются признавать это успешным взломом). В своей работе Годри говорил, что взламывал ключи шифрования, поскольку это было проще всего. При этом он сразу же заметил другой недостаток, взлом которого потребовал бы дополнительного исследования: из-за особенностей ключа один бит секретной информации мог оказаться незашифрованным. Это мэрия также исправила.

Проблему с утечкой бита по мотивам публикации Годри исследовал белорусский математик из Гарварда Александр Головнев. Он выяснил, что даже после всех исправлений возможна ситуация, когда один бит исходной информации (то есть часть сведений о голосе избирателя) может «утечь» — его можно будет опознать даже после шифрования. Эта уязвимость не позволяет расшифровать все голоса, но в некоторых случаях позволяет посчитать, сколько избирателей подали голос за одного из кандидатов. Если кандидатов всего два (или если это вопрос с двумя вариантами ответа), то, при совпадении некоторых условий, можно вычислить голоса и одного, и второго — то есть узнать полные результаты голосования. А поскольку в интернет-голосовании зашифрованные голоса публикуются по мере поступления (чтобы подтвердить, что с ними нет манипуляций), то метод Головнева позволил бы в реальном времени следить, кто побеждает.

«Конечно, первым делом я сообщил мэрии», — рассказал Головнев «Медузе». 23 августа он отправил письма и на адрес службы поддержки интернет-голосования, и на адрес пресс-службы департамента информационных технологий (ДИТ), который ему порекомендовал Годри. Затем Головнев опубликовал результат своей работы, а Годри на него сослался. Когда 28 августа началось тестирование, из программного кода процедуры шифрования, который использует мэрия, стало очевидно, что они исправили ошибку, найденную Головневым. Но в мэрии это признать отказались.

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

Как показал Головнев, можно легко проверить, будут ли «торчать» остатки этих голосов уже после шифрования. И эта проверка напрямую завязана на процедуру возведения числа в степень. Если проверка показала, что голос «торчит», то достаточно перед шифрованием возвести его в квадрат, а уже потом зашифровать. Тогда «торчать» в зашифрованном виде ничего не будет.

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

Все эти изменения не имеют никакого отношения к тому, обозначены кандидаты последовательностью чисел вроде 1, 2, 3 и 4 или случайно выбранными значениями.

Что ответила мэрия

Во время тестирования 28 августа сопредседатель «Голоса» Григорий Мельконьянц по просьбе «Медузы» попросил организаторов интернет-голосования прокомментировать статью Головнева. По словам замглавы ДИТ Артема Костырко, они не видели письма от математика, а его статью им прислали «знакомые», поэтому в мэрии не связывались с Головневым, так как якобы не знали, кому и куда писать. «Но со статьей мы ознакомились», — заметил Костырко.

Дальше он начал рассуждать только о примере, который привел Головнев в своей статье: если обозначать голоса просто цифрами 1, 2, 3 и 4, то их потом легко найти. «Мы на самом деле так [голоса] и не кодировали, просто мы этого не говорили», — пояснил замглавы ДИТ. По мнению Костырко, Головнев в своей статье предлагал искать среди зашифрованных бюллетеней именно те, где стоит голос, обозначенный цифрой 1. Это не так, в статье Головнева явно сказано: «Мы подчеркиваем, что эта атака сможет различить (с высокой вероятностью) два сообщения, которые отличаются лишь голосом избирателя. Каким бы ни было обозначение кандидата и какие бы части бюллетеня ни были зашифрованы».

Наконец, Костырко добавил, что не считает приведенные Головневым выкладки уязвимостью, так как они не позволяют взломать ключ. Он никак не прокомментировал изменения в коде, которые явно указывают, что в мэрии учли замечания математика. «Медуза» показала новый программный код Пьеррику Годри, и он согласился, что эти изменения затрагивают именно ту проблему, которую описал Головнев. «Забавно, как они говорят, что проблемы нет, но по-тихому исправляют уязвимость», — отметил французский криптограф.

Головнев, Годри и «Медуза» проверили публичные ключи и обозначения ответов в бюллетене на тестировании 28 августа, где было всего два варианта на выбор. Если бы мэрия не внесла исправления в программный код, результаты этого голосования можно было бы вычислить в реальном времени.

Хотите проверить сами?

В тестировании 28 августа использовался такой публичный ключ (эта открытая информация получена из кода страницы бюллетеня во время голосования одного из сотрудников «Медузы»):

  • modulo: 122708482516656908518411551057486​707566480532379139005166993594053​627713971726309572644986511021372​871998165903355005836525836983414​496968661729191112587333253191262​755602784412922675331893614019119​979108938727080350070077494581307​839764500139796452363593731160426​765955763100357260124300619948890​487736216143​
  • generator: 451465164605478361124438621073344​852430021445217695135443303230533​817186215046024089281788679579553​822549456836924598068887817462973​955786762716688608555255668141230​435630397910049299213101737112841​886851726915262710518983879966922​859552448902542960909454558708003​901764472642026032468205173954004​24415196557
  • publicKey: 313980724156137854006925466257352​832440655528704355590728116497728​667714752003456003686890226275205​017295954361807773350397564842010​875194556620530226608768634929529​613464729288073686274048378468399​716170582386719964877778491957513​541877664233395217045660170456622​183555113004423026529654404940706​58401450214

Избирателям задали вопрос: «Что, на ваш взгляд, стоит развивать в вашем районе в первую очередь?» Вот как были обозначены варианты ответа в html-коде бюллетеня:

  • Парковочное пространство — 3247602110
  • Парки и зеленые насаждения — 667396531

Как указано в статье Головнева, можно легко проверить, что вариант «Парки и зеленые насаждения» является квадратичным вычетом по модулю modulo (при возведении в степень (modulo-1)/2 по модулю modulo дает единицу). А вариант «Парковочное пространство», напротив, не является квадратичным вычетом. Следовательно, их можно было бы различить даже в зашифрованном виде.

«Если бы я хотел схимичить»

В чем проблема

Другой момент, на котором в своем выступлении остановился Костырко, касается предыдущей публикации «Медузы» — о взломе коротких ключей по методу Годри. Тогда «Медуза» выложила ответ на тестовое задание мэрии от 7 августа: расшифрованные приватные (секретные) ключи. Но мэрия решила не публиковать правильный ответ, то есть формально подтвердить или опровергнуть успех взлома невозможно.

Что ответила мэрия

По словам Костырко, ответы на задание от 7 августа не выложили «из-за скорости, из-за всего». «Если бы я хотел схимичить или что-нибудь там сделать, я бы просто сделал приватный ключ другим. Опубликовал бы его и сказал: „Смотрите, они на самом деле ничего не смогли!“» — заметил Костырко.

То, о чем говорит Костырко, математически невозможно, объяснил «Медузе» Головнев. Существует ровно одно число, которое является приватным ключом и соответствует публичному ключу из задания мэрии.

Мэрия до последнего не будет публиковать программный код интернет-голосования

В чем проблема

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

Но код, использовавшийся на финальном тестировании 28 августа, заранее опубликован не был. К примеру, уязвимость Головнева исправлена, но об этом можно судить лишь по косвенным признакам — по скомпилированному коду. По словам организаторов, исходный код будет показан, скорее всего, ко вторнику, 3 сентября. Это означает, что на проверку окончательного кода перед настоящими выборами будет всего четыре дня.

Что ответил Алексей Венедиктов

«Мне вообще непонятен этот разговор с публикациями кода: „Вы нам публикуете код, и мы вас взломаем!“ Это выглядит, согласитесь, достаточно интересно», — заметил один из инициаторов системы интернет-голосования Алексей Венедиктов. Он добавил, что всегда был против широкой публикации кода, желая оставить его обсуждение только в пределах технической рабочей группы экспертов. «Наша задача, чтобы 8-го числа никто не смог взломать. И чтобы результат был адекватен голосованию. Все!» — подытожил Венедиктов.

* * *

Ранее в мэрии уже отказались от идеи печатать на бумажных копиях электронных бюллетеней публичный ключ — это часть ключа, которую каждый избиратель получает на свой компьютер и может легко посмотреть в коде страницы с бюллетенем. Наблюдателям публичный ключ также не показывают. «Затруднение доступа к публичному ключу — это неправильный подход и очень плохой знак, который показывает, насколько создатели не уверены в своей схеме шифрования», — сказал Пьеррик Годри «Медузе» по поводу этого решения.

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

Михаил Зеленский, Денис Дмитриев