Расследования · Политика

Мандаты пользуются вбросом

Только с помощью «переголосования» в Москве у оппозиции скрутили не менее четверти миллиона голосов и отдали их партии власти и ее кандидатам

Максим Гонгальский , к.ф.-м.н., научный сотрудник Физфака МГУ, глава МО Раменки
Экраны с участками для голосования в Информационном центре Центральной избирательной комиссии РФ во время выборов в Госдуму. Фото: РИА Новости

Прошла неделя после дня голосования, а мы уже детально понимаем, каким образом, с большой вероятностью, были сфальсифицированы результаты электронных выборов. Я демонстрирую ниже подтверждения фальсификаций, найденные мною и экспертами штаба Анастасии Брюхановой. Я руководил этой работой и отвечаю за научную обоснованность ее результатов (в работе принимали также участие Илья Снимщиков — программист чат-ботов, Ярослав Соболев — старший научный сотрудник Center for Soft and Living Matter (Корея), а также еще три человека, пожелавшие остаться неназванными). 

Мы оцениваем объем фальсификаций приблизительно в четверть миллиона.

Эта оценка основана на том, что оппозиция потеряла при переголосовании около 280 тысяч голосов на всю Москву: примерно 133 тысячи — за кандидатов по одномандатным округам и примерно 147 тысяч — за партийный список. (Подробные выкладки даются ниже.) Полагая, что часть «потерь» (например, 10%) могла носить доброкачественный характер (избиратель исправил свою ошибку), считаем оценку не менее 250 000 скрученных голосов надежным приближением.

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

То что происходили именно «вбросы» (добавление записей, а не их удаление или изменение), следует из использования блокчейна.

Блокчейн — это последовательность блоков (бюллетеней), каждый из которых содержит информацию обо всех ранее добавленных блоках. «Вытащить» бюллетень из середины такой цифровой «пачки» практически невозможно. А вот добавить новые — можно.

Авторы этого расследования

Автор: Максим Гонгальский, кандидат физико-математических наук, научный сотрудник Физического факультета МГУ, глава муниципального округа Раменки — специально для «Новой».

При участии Ильи Снимщикова и Ярослава Соболева.

Под редакцией Андрея Заякина.

Слишком дружное голосование

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

Технические детали

Данные для графика были получены из публичного SQL дампа, скачанного с сервера observer.mos.ru 20 сентября в 0.49. Голоса в дампе хранятся в зашифрованном виде (часть из них расшифрована публично и тоже есть в дампе), поэтому все голоса были расшифрованы с использованием публичного ключа с сервера observer.mos.ru. Для расшифровки использовалась библиотека golang.org/x/crypto/nacl/box, в которой реализован алгоритм шифрования, аналогичный тому, который был использован для шифрования голосов.

В базе есть несколько таблиц: blocks, transactions и decrypted_ballots.

В таблице transactions указаны все поступающие транзакции, в них указаны данные транзакций, в том числе хэш, timestamp (временная метка) и тип, например выдача бюллетеня или прием голоса. Транзакции приема голоса в оригинальном дампе были зашифрованы. В таблице decrypted_ballots указан хэш транзакции приема голоса, которая была расшифрована, а также сам голос за конкретного кандидата. В эту таблицу были записаны все расшифрованные голоса, аналогично тому, как это было сделано ДИТ для части голосов. По связке хэшей из таблиц decrypted_ballots и transactions можно установить, в какой момент времени была обработана транзакция с голосом за конкретного кандидата. Это можно, например, сделать с помощью такого SQL запроса:

SELECT T.datetime FROM transactions T INNER JOIN decrypted_ballots B ON T.hash = B.store_tx_hash WHERE B.decrypted_choice[1]=153878280

В этом запросе собираются все timestamp транзакций, хэш которых соответствует хэшу расшифрованного голоса за кандидата с ID 153878280 (это Митрохин). Все голоса, полученные за конкретного кандидата, суммировались в 30-минутном интервале, а затем вычислялся процент проголосовавших за кандидата от общего числа голосующих в интервале. Такой подход позволяет исключить колебания явки, связанные как с разным временем суток, так и с особенностями работы сервера.

Самое поразительное, что мы увидели практически полное совпадение аномальных деталей не только во всех 15 одномандатных округах, но и при голосовании по партийным спискам, а даже на довыборах в Мосгордуму.

Поэтому для примера приведем 208-й одномандатный округ — ЦАО г. Москвы, однако все особенности и выводы могут быть перенесены на любой другой московский округ и партийное голосование в Москве. Этот округ считается самым оппозиционным, а его избиратели — самыми обеспеченными и благополучными в Москве: голосование за «Единую Россию» здесь традиционно низкое. В этом округе в числе прочих выдвигались:

  • экс-председатель партии «Яблоко» Сергей Митрохин, 
  • известный журналист Максим Шевченко,
  • от КПРФ — Нина Останина,
  • от «Справедливой России» — Магомет Яндиев.
  • Сергей Собянин (то есть де-факто партия «Единая Россия») поддерживал самовыдвиженца Олега Леонова.

Рисунок 1. Уровень поддержки власти и оппозиции в разные моменты времени в 208-м округе Москвы. Суммирование производится по 30-минутным интервалам. Ночной период исключен из анализа. Розовым цветом отмечен аномальный рост поддержки провластного кандидата с утра в воскресенье.

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

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

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

А вот «воскресная аномалия» сразу бросается в глаза: внезапно утром в воскресенье за провластного кандидата Леонова голосует в полтора раза больше избирателей в единицу времени, чем обычно.

Роботы обедают рано

Дальше примерно в 14.30 так же резко интенсивность голосования падает до обычного значения.

Но самое удивительное, что эта аномалия (показана красным) с абсолютно одинаковыми характеристиками наблюдалась одновременно во всех 15 одномандатных округах, в голосовании за партии и даже в округах на выборах в Мосгордуму!

Более того, оказалось, что 

с 12.20 до 13.00 происходит временный спад уровня поддержки правящей партии примерно до средних пятнично-субботних значений (показан черной вертикальной пунктирной линией) — и он тоже повторяется во всех округах!

Ничем кроме организованного вмешательства в базу данных (в виде дописывания новых строчек) нам не удается объяснить эти аномалии. Нет никаких сведений о том, что сторонники правящей партии во всех 15 округах, например, сговорились: сначала — всем вместе голосовать за своих кандидатов с восьми до половины первого, затем — так же синхронно, на территории всей Москвы, прекратить голосовать, и затем — снова энергично голосовать в течение часа. Живые люди, действующие независимым друг от друга образом, так себя не ведут. Живые люди, которых заставляют что-либо делать вместе организованно, обычно оставляют след в видимом мире — переписку, чаты с кураторами, автобусы, на которых их свозят к компьютеру начальников. Ничего такого нами не наблюдалось.

Профили аномалий очень резкие: за 5–10 минут уровень поддержки партии власти вырастает на 50% (мы увидели это, когда сделали сортировку по 5-минутным интервалам вместо 30-минутных; для увеличения статистики был взят средний процент по всех округам, то есть отношение суммы голосов за всех провластных кандидатов в данном интервале к сумме всех голосов).

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

На графике видно, как роботы делают перерыв с 12.20 до 13.00 (показан зеленым) и затем возобновляют свою работу еще примерно на полтора часа.

Рисунок 2. Усредненный процент поддержки провластных кандидатов во всех одномандатных округах Москвы в воскресенье. Суммирование производится по 5-минутным интервалам. На графике хорошо виден «перерыв на обед» в 12.2013.00 и завершение работы роботов в 14.30.

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

Мы задали Артему Костырко вопрос: могут ли эти скачки объясняться сбоями в работе системы? Он не увидел в резких скачках ничего аномального и объяснил их плановыми SMS-рассылками портала Московской мэрии. На вопрос, почему при этом увеличивается исключительно процент кандидатов от «Единой России», а избиратели других кандидатов никак не реагируют на призыв голосовать, 

он ответил, что «провластный электорат испытывает жгучее желание проголосовать в ответ на рассылку».

Рисунок 3. Корреляция между голосованием за провластных кандидатов в одномандатных округах Москвы. Суммирование производится по 30-минутным интервалам, визуальное сглаживание введено для лучшей читаемости графика. Видно, что «волна поддержки» стихает фактически одномоментно

Переголосование не защищает от произвола, а создает его

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

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

помимо публичного блокчейна существует еще и «тайный» блокчейн, неподконтрольный избирательной комиссии, а подконтрольный только Департаменту информационных технологий (ДИТ) Москвы. И что установить, какой голос сгорает, можно только по метками в этом блокчейне.

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

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

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

Так вот, на деле со статистикой переголосований оказалось все ровно наборот, если сравнить с исходной задумкой:

избиратели провластных кандидатов отменяли свое решение РЕЖЕ (!!!), чем оппозиционные.

Вот, например, иллюстрация для 208-го округа.

Рисунок 3а. Доля «сгоревших» бюллетеней у кандидатов от правящей партии и оппозиции в 208 округе.

Далее мы обнаружили, что проценты «сгоревших» голосов практически одинаковы для всех оппозиционных кандидатов (1013%), хотя Сергей Митрохин и Максим Шевченко, Нина Останина и Магомет Яндиев вели совершенно разные кампании и ориентировались на разный электорат. А у Олега Леонова переголосовавших было всего 7%. Это можно было бы списать на случайность, но абсолютно такая же ситуация произошла во всех 15 округах Москвы, как показано на графике ниже! 

Вот уж точно — «потерпевший упал грудью на нож и так 15 раз».

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

А ведь в «списке Собянина» были такие разные люди, как телеведущий Евгений Попов, актер Дмитрий Певцов, знаток Анатолий Вассерман и т. п. И у всех процент переголосовавших лежал в узком диапазоне 79%. Как же получилось, что их электорат одинаков в своих «ошибках» и «разочарованиях» (которые были бы легитимной причиной для переголосования)?

«Слепое» переголосование в пользу власти?

Объяснить парадокс нам удалось, только предположив, что имели место фальсификации. Куда именно есть доступ у злоумышленника мы (пока что) не знаем. Предположим, стоит задача повысить процент провластного кандидата, но доступа к содержанию самих бюллетеней нет. Подменить бюллетени нельзя: все они зашифрованы и расшифровываются только после окончания голосования. Какие бюллетени будем переголосовывать? Непонятно.

Но можно переголосовать за случайных людей в пользу провластного кандидата.

Посмотрите на схему: на ней для простоты показаны 10 кандидатов с 10 голосами.

Рисунок 4. Схема честного и нечестного переголосования. Отрезанными прямоугольниками показаны «сгоревшие» бюллетени, подписана их доля у кандидата. «Административный кандидат» показан самым темным оттенком синего в блоке «нечестное переголосование»: у него 9 изначальных и 10 «накрученных» в результате переголосования бюллетеней. При этом его «сгоревший» бюллетень составляет 5%, а не 10% от всех бюллетеней кандидата. Это объясняет аномалию заниженной доли «сгоревших» бюллетеней у всех административных кандидатов в схеме «слепого переголосования в пользу власти».

Если переголосовывает 10% реальных избирателей, действующих независимо друг от друга, и сделавших в своем выборе случайные ошибки, то новые голоса достаются в среднем всем кандидатам; доля же избирателей, которые выбрали данного кандидата изначально, но потом изменили свое решение, остается равной 10%. 

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

За счет этого получится, что процент тех, кто изначально голосовал за этого кандидата, но «сжег» свой бюллетень (чтобы потом снова отдать свой голос тому же человеку), уменьшится до 5%.

По-видимому, именно это могло происходить на московских выборах в этом году. Могло быть «скручено» около 130 тысяч голосов: примерно по 810 тысяч голосов в каждом округе. Именно столько нужно добавить провластным кандидатам, чтобы процент переголований уменьшился с 11% до 7% исключительно за счет добавления голосов.

Переголосование, но «не слепое»

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

Рисунок 5. На верхнем графике показана зависимость количества «сгоревших» за каждые полчаса голосов от времени их подачи для каждого кандидата (с накоплением). Обратите внимание: на графике отражено не время, когда будет «последний» голос (учитывающийся при подсчете), а время, когда был отдан исходный голос (который «сгорит», то есть не будет учтен). На нижнем графике суммарное число голосов, отданных за каждые полчаса. Источники: верхний график оцифрованные нами графики Артема Костырко, нижний публичный дамп. Пунктиром указана оценка реального количества голосов Леонова (за вычетом «переложенного» в его пользу). Стрелками указано обосновываемое нами превращение голосов оппозиции в голоса за Леонова.

Мы снова приводим график для 208-го округа как пример и подчеркиваем, что такая же картина наблюдалась во всех округах, как и в голосовании по спискам (роль административных кандидатов там играет «Единая Россия»). Из графиков видно, что «жгучее желание провластного электората проголосовать в ответ на рассылку» (воскресенье) есть не что иное, как переголосование под видом избирателей, отдавших свой голос Сергею Митрохину (как и всем другим оппозиционным кандидатам во всех округах).

И так получилось, что половина (!!!) субботних вечерних избирателей Митрохина решила отказаться от своего выбора в пользу Леонова. А вот субботние вечерние избиратели Леонова переголосовали только в 7% случаев. И это уже несовместимо с моделью «слепого» переголосования.

Почему несовместимо? Потому что в случае «слепого» мы оценивали отношение: сгоревшие бюллетени за кандидата ко всем бюллетеням за кандидата в дампе. Поэтому при «слепом» перекидывании в пользу власти 10% бюллетеней от всех кандидатов, у кандидата от власти получалась доля 5% сгоревших в дампе, а у оппозиции — по 11%.

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

в определенные периоды времени у оппозиции голоса «горят» просто мешками и вагонами, а у провластных кандидатов — не так.

Голоса за Митрохина были отданы в период с 16.00 в субботу до 12.00 в воскресенье. А скрутка этих голосов происходила с 08.00 до 15.00 в воскресенье. Переголосование половины голосов за оппозицию, и при этом практически непереголосование за власть — уже невозможно объяснить с помощью «слепой» модели.

Рисунок 6. По вертикальной оси указано отношение числа «сгоревших» голосов за кандидата (группу кандидатов) к общему числу «сгоревших» голосов, отданных в данный период времени за полчаса. Ночные периоды с малым абсолютным количеством переголосований исключены из анализа.

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

Саморазоблачение

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

Но Костырко своими графиками подтвердил, что отнимали именно у оппозиции.

Это подтверждает, что злоумышленники могли точно знать, кто и как проголосовал на момент вброса. Если бы переголосования происходили «вслепую», как мы предполагали в предыдущей гипотезе, тогда затрагивали бы и провластных кандидатов пропорционально их реальным процентам. Даже если это были переголосования с Леонова на Леонова, на графике, изображенном на рисунке 5 все равно был бы виден пик для Леонова, аналогичный Митрохину. Например, видно, что в пятницу переголосований у Леонова примерно в полтора раза больше, чем у Митрохина. Однако его нет, следовательно, кто-то до окончания голосования мог иметь ключ для расшифровки, анализировал результаты голосования в режиме реального времени и управлял скоростью фальшивого переголосования.

Выборы со скрученным пробегом

Это означает, что истории про «технические сложности» с расшифровкой результатов, скорее всего, неверны: «кому надо» результаты были известны уже в субботу вечером.

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

Мы можем выдвинуть гипотезу, что изначально был разработан алгоритм, который эмулировал переголосования в размере 10% от всех проголосовавших. Новые голоса уходили, вероятно, кандидатам от «Единой России» из списка Собянина. Чтобы не возникло подозрений, голоса, отданные за «Единую Россию», переголосовывались тоже: ведь изначально эта опция позиционировалась как полезная для «бюджетников», которые «голосуют под присмотром начальства». Однако в субботу вечером оказалось, что даже заложенных 10% может не хватить для триумфальной победы «списка Собянина». И процент решили увеличить до 50%.

Рисунок 7. Оценка накруток голосов в пользу провластных одномандатных кандидатов за счет оппозиции.

Разумеется, среди переголосований с оппозиции на власть в очень небольшом проценте случаев могли были быть и те, которые были обусловлены ошибками: голосовал за Фому, а галку поставил за Ерему. Процент таких ошибок вряд ли превышает 12% и в первом приближении не играет роли. Тем более такие ошибки как раз имели бы характер равномерного распределения по всем кандидатам в пользу всех кандидатов, чего не наблюдается. Мы решили оценить такие «доброкачественные переголосования» с запасом. И считать, что 10% всех сгоревших голосов оппозиции обусловлены добросовестными ошибками избирателей. У оппозиции сгорело 280 тысяч голосов: 133 тысячи — по одномандатникам и 147 тысяч — по федеральному списку. 

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

От редакции

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