Уроки электронного голосования в Московскую Городскую Думу 2019 года

Если в про­шлом году дистан­ци­он­ное элек­трон­ное голо­со­ва­ние граж­дан рас­смат­ри­ва­лось ско­рее как курьёз или экс­пе­ри­мент, выво­ды из кото­ро­го будут сде­ла­ны когда-то потом, то в 2020‑м мы все вне­зап­но обна­ру­жи­ли, что это — реаль­ность, с кото­рой нам пред­сто­ит столк­нуть­ся ско­ро и в пол­ном объ­ё­ме. В зна­чи­тель­ной сте­пе­ни к это­му под­толк­ну­ли каран­тин­ные огра­ни­че­ния — про­ве­де­ние выбо­ров ока­за­лось под вопро­сом, а жизнь поли­ти­че­ских пар­тий вста­ла на паузу.

В общем, спрос встре­тил­ся с пред­ло­же­ни­ем – и пова­ли­ли зако­но­про­ек­ты. Партиям раз­ре­ши­ли про­во­дить прай­ме­риз через Госуслуги/ЕСИА, реги­о­ны один за дру­гим рапор­ту­ют о стрем­ле­нии орга­ни­зо­вать ДЭГ (дистан­ци­он­ное элек­трон­ное голо­со­ва­ние) уже в сен­тяб­ре на мест­ных выборах.

К сча­стью или к сожа­ле­нию, одно­го толь­ко зако­но­твор­че­ства мало – нуж­на ещё и тех­ни­че­ская реа­ли­за­ция, с кото­рой не всё так одно­знач­но. Кто-то верит, что всё уже было сде­ла­но в Москве в про­шлом году (там даже был блок­чейн!), кто-то – что ДЭГ вооб­ще невоз­мож­но реа­ли­зо­вать на уровне, не допус­ка­ю­щем мас­со­вых фаль­си­фи­ка­ций, а пото­му от ДЭГ необ­хо­ди­мо отка­зать­ся в принципе.

Поэтому мы реши­ли посвя­тить раз­бо­ру этих вопро­сов неболь­шой цикл ста­тей и встреч:

  1. Алексей Щербаков — «Уроки элек­трон­но­го голо­со­ва­ния в Московскую Городскую Думу 2019 года»
  2. Олег Артамонов — «Дистанционные элек­трон­ные голо­со­ва­ния: архи­тек­ту­ра дове­рен­ной элек­то­раль­ной систе­мы»
  3. Круглый стол «Нажми на кноп­ку: тео­рия и прак­ти­ка элек­трон­ных голосований»

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

Строго гово­ря, это не ста­тья, а слег­ка лите­ра­тур­но отре­дак­ти­ро­ван­ный текст одно­имён­но­го выступ­ле­ния Алексея Щербакова (alexeishch) на нашей кон­фе­рен­ции 5 мар­та это­го года.

Алексей – при­гла­шен­ный экс­перт коман­ды Романа Юнемана по под­го­тов­ке докла­да «Электронное голо­со­ва­ние. Риски и уяз­ви­мо­сти», веду­щий backend-разработчик ком­па­нии FoodPlex.

В докла­де рас­ска­зы­ва­ет­ся о том, как имен­но было тех­ни­че­ски устро­е­но дистан­ци­он­ное элек­трон­ное голо­со­ва­ние на выбо­рах в МГД 2019 года, какие были досто­ин­ства и недо­стат­ки как в тех­ни­че­ских реше­ни­ях, так и в рабо­те с экс­перт­ны­ми группами.

Помимо это­го тек­ста, мож­но про­чи­тать так­же ещё две ста­тьи, уже пуб­ли­ко­вав­ши­е­ся на Хабре:

Если вы пред­по­чи­та­е­те видео или аудио, пол­ную запись докла­да мож­но посмот­реть на YouTube.

***

Здравствуйте, меня зовут Алексей Щербаков, я был экс­пер­том при­гла­шён­ной коман­ды Романа Юнемана на Московском голо­со­ва­нии. Ну вооб­ще преж­де чем рас­ска­зы­вать о самом голо­со­ва­нии, сто­ит ска­зать как это вооб­ще происходило.

Всё это нача­лось в мар­те 2019 года, когда было объ­яв­ле­но об экс­пе­ри­мен­те, потом уже в мае при­нят закон о голо­со­ва­нии, а само голо­со­ва­ние про­ис­хо­ди­ло 8 сен­тяб­ря в трёх окру­гах Москвы. Голосование про­хо­ди­ло через интер­нет в тече­ние 12 часов.

Сама систе­ма была постро­е­на на базе блок­чей­на Ethereum фир­мы Parity. Там же была исполь­зо­ва­на схе­ма Эль-Гамаля для шиф­ро­ва­ния. Система логи­ро­ва­ния исполь­зо­ва­лась Graylog и для пере­да­чи дан­ных меж­ду сооб­ще­ни­я­ми исполь­зо­вал­ся какая-то реа­ли­за­ция AMQP, мы пред­по­ла­га­ем, что ско­рее все­го это был RabbitMQ, про­сто как кор­по­ра­тив­ный стан­дарт. Сама систе­ма выгля­де­ла вот таким образом:

Большая часть систе­мы нахо­ди­лась вне Департамента инфор­ма­ци­он­ных тех­но­ло­гий (ДИТ) Москвы [это очень важ­ный момент, так как с внеш­ни­ми экс­пер­та­ми общал­ся толь­ко ДИТ Москвы — прим. ред.], но блок­чейн нахо­дил­ся у них. Они рабо­та­ли сов­мест­но с пор­та­лом Госуслуг. Описание, как эта систе­ма созда­ва­лась, ДИТ Москвы пуб­ли­ко­вал на Хабре. И они там же уже гово­ри­ли в част­но­сти о том, что у них про­бле­мы были, в основ­ном, толь­ко один час, поряд­ка 400 чело­век были этим затронуты.

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

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

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

Если мы рас­смот­рим вто­рую мет­ри­ку – чис­ло тран­зак­ций на блок – то по ним мы видим про­бле­му уже подроб­нее. Мы, во-первых, видим, что в зонах отклю­че­ния, ника­ких тран­зак­ций не запи­сы­ва­лось. В нашей подо­зри­тель­ной зоне мы видим крайне мало тран­зак­ций, а потом мы видим инте­рес­ный момент, когда у нас меня­ет­ся харак­тер запи­си дан­ных блок­чей­на. С чем это свя­за­но? Изначально, когда дан­ные писа­лись, они писа­лись с опре­де­лён­ным интер­ва­лом, это сде­ла­но для того, что­бы нель­зя было по вре­ме­ни голо­со­ва­ния точ­но опре­де­лить, какой чело­век голо­со­вал. Данные накап­ли­ва­лись и сбра­сы­ва­лись в блок­чейн. Однако потом после какой-то рекон­фи­гу­ра­ции блок­чей­на дан­ные ста­ли запи­сы­вать­ся уже хао­тич­но. То есть была про­из­ве­де­на какая-то опе­ра­ция, но мы не можем точ­но ска­зать на осно­ве этой мет­ри­ки что кон­крет­но ДИТ сде­лал. Но мы можем ска­зать, что в дан­ном слу­чае ДИТ каким-то обра­зом вме­шал­ся в рабо­ту системы.

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

Помимо это­го, у нас ещё есть ещё одна зона, в кото­рой дан­ные не дохо­ди­ли до блок­чей­на. Суммарно все эти зоны неис­прав­но­сти зани­ма­ют 4 часа. Зона дегра­да­ции зани­ма­ет поряд­ка 6 часов, она нача­лась после обе­да и шла до кон­ца голо­со­ва­ния. Из-за того, что никак не мони­то­ри­ли блок­чейн, они даже не подо­зре­ва­ли о том, что были какие-то про­бле­мы. Более того, люди, кото­рые при­сут­ство­ва­ли на самом участ­ке, часть изби­ра­тель­ной комис­сии, гово­ри­ли, что всё, что они мог­ли сде­лать – это сидеть на диван­чи­ке и смот­реть, что про­ис­хо­дит на экране. То есть они не пони­ма­ли, что про­ис­хо­дит, и узна­ва­ли о каких-то про­бле­мах исклю­чи­тель­но из СМИ. У них не было вооб­ще ника­ких инстру­мен­тов для того, что­бы наблю­дать за про­бле­мой.

Помимо это­го был инте­рес­ный момент: у наблю­да­те­лей дол­жен был быть доступ к само­му блок­чей­ну. То есть, им обе­ща­ли, что у них будет спе­ци­аль­ная нода наблю­де­ния и они смо­гут уже непо­сред­ствен­но обра­щать­ся к блок­чей­ну, выпол­нять на нём опе­ра­ции и смот­реть, что про­ис­хо­дит. Но эту воз­мож­ность у них ото­бра­ли! Почему? Непонятно. И на экран про­сто выве­ли статистику.

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

Здесь есть очень важ­ный момент – вре­мя жиз­ни бюл­ле­те­ня. Если изби­ра­тель не успе­вал за 15 минут запол­нить бюл­ле­тень, то он счи­тал­ся анну­ли­ро­ван­ным. И сама ста­ти­сти­ка так­же шла интер­ва­ла­ми по 15 минут. То есть, если у нас изби­ра­тель не про­хо­дил какой-то уча­сток ворон­ки за 15 минут, то мы можем уве­рен­но ска­зать, что на сле­ду­ю­щем эта­пе ста­ти­сти­ки он не учи­ты­вал­ся. И на каж­дом эта­пе у нас полу­ча­лось мень­шее коли­че­ство. Именно бла­го­да­ря это­му уда­лось отсле­дить инте­рес­ные ано­ма­лии статистики.

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

Это срав­не­ние ста­ти­сти­ки, кото­рая полу­че­на по дан­ным наблю­да­те­лей, и ста­ти­сти­ки, кото­рая полу­че­на из выгруз­ки из блок­чей­на. Как вид­но, они прак­ти­че­ски сов­па­да­ют, но есть неболь­шое отли­чие, когда, види­мо, были неболь­шие про­бле­мы в ста­ти­сти­ке на фрон­тен­де. Это нам дает воз­мож­ность гово­рить, что ста­ти­сти­ка, кото­рую полу­ча­ли неза­ви­си­мые наблю­да­те­ли, и ста­ти­сти­ка, полу­чен­ная из блок­чей­на на осно­ве выгруз­ки – это прак­ти­че­ски одно и то же, за исклю­че­ни­ем эта­па, когда у нас были какие-то проблемы.

Помимо ста­ти­сти­ки, у нас есть инте­рес­ная ауди­о­за­пись — вре­мя око­ло 17 часов, про­го­ло­со­ва­ло око­ло 2000 чело­век, один из пред­ста­ви­те­лей ДИТ Москвы рас­ска­зы­ва­ет, какие вме­ша­тель­ства они про­во­ди­ли на рабо­та­ю­щей систе­ме. В част­но­сти он рас­ска­зы­ва­ет, что поряд­ка 900 чело­век повтор­но полу­ча­ли SMS для авторизации.

Нам это гово­рит, во-первых, о том, что бла­го­да­ря систе­ме логи­ро­ва­ния, кото­рую они исполь­зо­ва­ли, ДИТ Москвы мог нару­шать тай­ну голо­со­ва­ния. Они мог­ли сопо­ста­вить вре­мя голо­со­ва­ния, ста­тус бюл­ле­те­ня и номер теле­фо­на, что очень важ­но! Они иден­ти­фи­ци­ро­ва­ли людей, у кото­рых были про­бле­мы, опре­де­ли­ли их номе­ра теле­фо­нов и разо­сла­ли повтор­ные SMS. Количество этих людей – поряд­ка 40 % от всех про­го­ло­со­вав­ших на этом участ­ке. Разница меж­ду дву­мя кан­ди­да­та­ми, пер­вым и вто­рым, соста­ви­ла все­го 84 чело­ве­ка, в то вре­мя как для 900 чело­век мы даже не можем ска­зать, какой у них был резуль­тат. Потому что над ними про­из­во­ди­лись какие-то дей­ствия. Мы не можем ска­зать, что эти голо­са под­та­со­вы­ва­ли, но мы можем ска­зать, что у 900 чело­век были про­бле­мы, мы не можем ска­зать, за кого они про­го­ло­со­ва­ли и про­го­ло­со­ва­ли ли они вооб­ще. То есть чис­ло людей, кото­рые столк­ну­лись с про­бле­ма­ми, в десять раз боль­ше, чем чис­ло людей, кото­рые отде­ля­ли одно­го кан­ди­да­та от победы.

Репозиторий с дан­ны­ми и код, кото­рый исполь­зу­ет­ся для ана­ли­за, мож­но най­ти по этой ссыл­ке.

Также мы про­и­ве­ли ана­лиз кода, кото­рый исполь­зо­вал­ся для само­го голо­со­ва­ния. Мы ожи­да­ли, что боль­шин­ство опе­ра­ций будет про­ис­хо­дить непо­сред­ствен­но в самом блок­чейне и что код дол­жен быть опуб­ли­ко­ван. Мы полу­чи­ли смарт-контракты, код фор­мы и код, ответ­ствен­ный за отправ­ку сооб­ще­ния. Но там были части, кото­рые оста­лись неиз­вест­ны­ми, пото­му что они выпол­ня­лись на сто­роне уже дру­го­го Департамента – уже пор­та­ла mos.ru.

Что было инте­рес­но най­де­но в коде? Оказалось, что он не огра­ни­чи­вал воз­мож­ность одно­го чело­ве­ка про­го­ло­со­вать в раз­ных окру­гах. Это инте­рес­ный момент, это было на откуп отда­но бэкен­ду, кото­рый нахо­дил­ся где-то в дру­гом месте и исход­ный код кото­ро­го мы не смог­ли посмот­реть. Непонятно, зачем в систе­ме исполь­зо­ва­ли блок­чейн — так как он всё рав­но не кон­тро­ли­ро­вал всё, его мож­но было заме­нить на обыч­ную базу дан­ных. Ну и в код фор­мы бук­валь­но за день до голо­со­ва­ния доба­ви­ли вот такой вол­шеб­ный код, кото­рый поз­во­лял с помо­щью одной пере­мен­ной на сто­роне бэкен­да вклю­чать допол­ни­тель­ный скрипт в фор­му, что очень инте­рес­но! Зачем они это сде­ла­ли? По сути, это воз­мож­ность выпол­не­ния про­из­воль­но­го кода в момент голо­со­ва­ния на устрой­стве поль­зо­ва­те­ля.

По крип­то­гра­фии так­же был инте­рес­ный момент. Изначально они выбра­ли 256-бит шиф­ро­ва­ние, хотя ещё в 1999 году для этой схе­мы пред­ла­га­лось исполь­зо­вать 768 бит, а 10 лет назад пред­ла­га­лось уже 1024 бита. А если сей­час открыть реко­мен­да­ции Евросоюза, то там будет тре­бо­ва­ние «не менее 1024 бит», если же тре­бу­ет­ся защи­та до 2030-го года, то реко­мен­ду­ет­ся исполь­зо­вать 3072 бита. Есть так­же инте­рес­ный момент в том, как они вычис­ля­ют энтро­пию. Понятно, что люди не до кон­ца разо­бра­лись, зачем им это всё нуж­но.

Что я могу ска­зать об этой системе?

Во-первых, ДИТ Москвы не смог обес­пе­чить хотя бы 90% рабо­то­спо­соб­но­сти. Вообще счи­та­ет­ся, что систе­ма высо­кой доступ­но­сти, она долж­на иметь не менее 90% вре­ме­ни рабо­ты. То есть мы не можем даже ска­зать, что она была рабочая.

Во-вторых, на продакшн-системе про­из­во­ди­лись опе­ра­ции, кото­рые никто никак не кон­тро­ли­ро­вал, никто вооб­ще не мог понять, что про­ис­хо­ди­ло. Если посмот­реть засе­да­ние суда [по обжа­ло­ва­нию ито­гов выбо­ров — прим. ред.], ока­жет­ся, что ни люди, ни наблю­да­те­ли, ни сама комис­сия не пони­ма­ли, что про­ис­хо­дит. Всё-таки надо было их как-то под­го­то­вить к самой про­це­ду­ре, кото­рая происходила.

Вместо заключения

Мы не хотим ска­зать, что элек­трон­ные выбо­ры – это обя­за­тель­но бар­дак, посто­ян­ные про­бле­мы, стран­ные тех­ни­че­ские реше­ния и непо­ни­ма­ние, что вооб­ще про­ис­хо­дит в дан­ный момент.

Тем не менее, как мы видим по это­му мате­ри­а­лу, вопрос дове­рия к резуль­та­там голо­со­ва­ния по сути сво­ей являл­ся вопро­сом дове­рия к его орга­ни­за­то­рам — вза­и­мо­дей­ствие с кото­ры­ми ока­за­лось весь­ма неод­но­знач­ным. Это, как нам кажет­ся, отве­ча­ет и на весь­ма акту­аль­ный вопрос о том, име­ет ли ДИТ Москвы доста­точ­но опы­та для его мас­шта­би­ро­ва­ния на всю Москву, а тем более – всю стра­ну, и на вопрос о том, мож­но ли про­сто взять какую-нибудь «голо­со­вал­ку с блок­чей­ном», запу­стить её на сер­ве­ре и начать про­во­дить выборы.

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

Подписаться на рассылку новостей
Партии прямой демократии

Directed by Pixel Imperfect Studio. Produced by Git Force Programming LLC.