Открытый исходный код необходим — но его недостаточно. Вот что ещё нужно.
Округ Лос-Анджелеса потратил десятилетие на создание самой прозрачной в мире системы голосования — с открытым исходным кодом, государственной собственностью и независимо проверяемой. Швейцария сделала то же самое. Исследователи всё равно нашли скрытый backdoor. Вот что упустили оба случая.
21 августа 2018 года официальный представитель штата Калифорния стоит у микрофона и произносит то, что никогда ранее не было сказано в истории штата: система подсчёта голосов округа Лос-Анджелеса только что получила сертификацию — и впервые программное обеспечение, подсчитывающее голоса, принадлежит обществу.
Не производителю. Не частной компании, защищённой законами о коммерческой тайне. Обществу.
Система называется VSAP — Voting Solutions for All People. На её создание ушли годы и десятки миллионов долларов. Она была разработана с нуля для крупнейшей избирательной юрисдикции Соединённых Штатов, заменив устаревшие проприетарные машины. И её исходный код — собственно инструкции, говорящие компьютеру, как подсчитать ваш голос — был опубликован для всеобщего ознакомления.
Это, по сути, веха. И этого всё ещё недостаточно.
Этот разрыв — между открытым кодом и проверенным результатом — вот о чём этот пост.
Почему закрытый исходный код всегда был неправильным ответом
Чтобы понять, почему VSAP важна, нужно разобраться в том, что она заменила.
Десятилетиями программное обеспечение, подсчитывающее голоса американцев, было коммерческой тайной. Производители утверждали, что их код — это собственность, защищённая авторским правом. Должностные лица органов избирательных комиссий должны были принимать на веру их слова о том, что машины работают корректно. Исследователи, получившие доступ к машинам другими способами — например, команда из Принстона, которая в 2006 году взяла машину Diebold AccuVote-TS и потратила несколько недель на её анализ — обнаружили, что могли установить код для кражи голосов менее чем за минуту, который распространялся с машины на машину и изменял все внутренние логи, сохраняя консистентность. Машина выдавала поддельный результат с полной уверенностью.
Код был секретным. Манипуляция была невидимой.
Кофи-Каунти, Джорджия в 2021 году показала другую сторону того же меча: сохранение кода в тайне не гарантирует его безопасность. Группе судебных экспертов разрешили войти в офис избирательной комиссии, и они вышли с копией всей системы голосования Dominion — системы управления выборами, планшетов для опроса, устройств для разметки бюллетеней, сканера, всего. Тайна как стратегия безопасности действительна только до тех пор, пока в комнате находится самый сговорчивый инсайдер.
Открытый исходный код устраняет оба этих режима отказа. Вы не можете скрыть вирус для кражи голосов в коде, который может прочитать каждый. Вам не нужно воровать секрет, потому что его нет.
Но в тот момент, когда вы публикуете исходный код, вы переносите вопрос. Вопрос больше не в том, "что говорит код?" Вопрос становится: "Это тот же самый код, который на самом деле работает в ночь выборов, что и код на GitHub?"
И этот вопрос оказывается очень сложным для ответа.
Швейцарский урок: открытый код, скрытый изъян
В 2019 году Swiss Post и её испанский поставщик Scytl сделали то, что выглядело как золотой стандарт прозрачности. Они опубликовали полный исходный код системы интернет-голосования Швейцарии перед планируемым использованием на обязательном федеральном голосовании. Независимые исследователи могли прочитать каждую строчку.
Исследователи Сара Джейми Льюис, Оливье Перейра и Ванесса Тиг воспользовались этой возможностью. То, что они нашли в криптографии, был не опечаткой. Это был не небрежный баг. Это была лазейка — математическая конструкция, спрятанная в доказательстве перемешивания mixnet, которая позволила каждому, кто владел определёнными секретными значениями, сгенерировать транскрипт проверки, который прошёл бы каждый контроль, при этом изменив голоса.
Система заявляла об «универсальной проверяемости». Корректное доказательство подтвердило бы, что перемешивание было правильным. Но если вы знали значения лазейки, вы могли заставить это доказательство пройти для перемешивания, которое было совсем не правильным.
Они назвали свой отчёт Ceci n'est pas une preuve — «Это не доказательство». Swiss Post и Scytl признали результаты. Швейцарские власти приостановили систему. Десятилетие работы, полный публичный выпуск кода — и изъян был всё ещё там, невидимый до тех пор, пока внешние криптографы не изучили математику.
Вот урок, который не появляется в пресс-релизе: открытый исходный код необходим, потому что он делает возможной независимую проверку. Это недостаточно, потому что проверка должна на самом деле происходить, людьми, квалифицированными найти то, что они ищут, и затем исправления должны быть проверяемо применены.
Публикация кода — начало истории, не конец.
Проблема воспроизводимости: от кода к работающей машине
Давайте конкретизируем это. Представьте, что вы — член городского совета округа Лос-Анджелеса. Вы можете прочитать исходный код VSAP. Вы находите его чистым. Вы убеждены, что код правильный.
Наступает ночь выборов. Где-то на складе машина включается и начинает подсчитывать бюллетени.
Как вы узнаете, что машина работает на том коде, который вы читали?
Разрыв между «исходным кодом» и «работающим программным обеспечением» называется процессом сборки. Исходный код — это текст, понятный людям. Компьютер запускает скомпилированный двоичный файл — машинные инструкции, которые компилятор создаёт из этого текста. Процесс компиляции не автоматический, не очевидный и не может быть проверен на глаз. Он включает выборы: какая версия компилятора, какие флаги, какие зависимости, в каком порядке.
Если два человека компилируют одинаковый исходный код с использованием разных компиляторов, они часто производят разные двоичные файлы. И если двоичные файлы различаются, вы не можете сказать, просто глядя на них, является ли разница невинной (другой параметр оптимизации) или вредоносной (добавленная инструкция).
Это не теоретическая проблема. Это было описано с летальной точностью в Лекции Тьюринга 1984 года Кена Томпсона, «Размышления о доверии к доверию». Томпсон показал, что вы могли бы вставить backdoor в компилятор, который незримо добавил бы вредоносный код к любой программе, которую он компилировал — включая будущие версии самого компилятора — без следа в любом исходном коде, который кто-либо мог бы прочитать.
Решение, разработанное за прошедшее десятилетие в сообществе свободного ПО, называется воспроизводимые сборки. Идея: если процесс сборки детерминирован — одинаковые входные данные, одинаковые выходные данные, каждый раз — то любая независимая сторона может скомпилировать тот же исходный код и сравнить отпечаток пальца двоичного файла с тем, что на самом деле установлено на машине. Если отпечатки совпадают, машина работает на том коде, который говорит исходный код.
Если они не совпадают, что-то изменилось между кодом и машиной. Это не философическая проблема. Это сбой безопасности.
Мы подробнее рассмотрели это в нашем посте о воспроизводимых сборках. Короткая версия: без них «открытый исходный код» означает «вы можете прочитать рецепт». Это не означает «то, что вышло из духовки, это то, что описывает рецепт».
Архитектура VSAP с открытым исходным кодом — это подлинный шаг вперёд. Но открытый исходный код без документированного, воспроизводимого процесса сборки оставляет разрыв, который никакой аудит исходного кода не может закрыть.
Аттестация: подтверждение того, что машина — это машина
Воспроизводимые сборки говорят вам, совпадает ли двоичный файл с исходным кодом. Аттестация — это шаг, который привязывает определённую машину к определённому проверенному двоичному файлу в определённый момент времени.
Думайте об этом как о цепи подписей. Юрисдикция сертифицирует двоичный файл. Двоичный файл криптографически подписан. Когда машина загружается в день выборов, она измеряет своё собственное состояние программного обеспечения и генерирует подписанный отчёт — «измерение» — который может быть проверен против сертифицированного значения. Если что-либо было изменено, измерение не совпадёт. Это не экзотика; это уже то, как современный смартфон защищает свой процесс загрузки.
В текущей практике избирательных систем эквивалентом является хеш — цифровой отпечаток пальца — который должен быть проверен против сертифицированной версии перед развёртыванием. Но «должен быть» несёт большую нагрузку в этом предложении. Проверки часто бывают ручными, нечастыми или полагаются на цепь хранения, которая сама может иметь разрывы.
Рассмотрим то, что произошло в Кофи-Каунти: всё программное обеспечение системы было скопировано и распределено людьми, имевшими законный физический доступ к офису. Системы прошли проверки перед выборами. Сравнение хешей после события сказало бы вам, был ли изменён двоичный файл на машине, которая осталась в офисе. Это не сказало бы вам, что было сделано с копией, которая ушла.
Аттестация не решает проблему инсайдер-угроз одна. Но это означает, что каждая машина при загрузке может быть спрошена, чтобы доказать, что она работает — и ответ может быть проверен против публичного реестра до того, как будет подсчитан хотя бы один голос.
Цепь хранения: физический слой, который код не может заменить
Вот как выглядит полностью проверяемая система с открытым исходным кодом в 2 часа ночи в ночь выборов: карта памяти выходит из сумматора, идёт в запечатанный пакет, подписанный наблюдателями от нескольких партий, регистрируется в реестре, её везут два человека, не из одной партии, и она приходит в центральное учреждение, где её печать проверяется до того, как будут прочитаны данные.
И вот как это выглядит, когда эта цепь разрывается: Конституционный суд Австрии в 2016 году аннулировал второй тур президентских выборов — не потому, что было обнаружено мошенничество, а потому что в нескольких округах почтовые бюллетени были открыты и подсчитаны неуполномоченными лицами вне установленного законом окна, без требуемых свидетелей. Примерно 77 000 голосов были затронуты доказанными нарушениями процедуры, что превысило победный край в 30 000 голосов. Суд не нашёл мошенничества. Он всё равно аннулировал выборы, потому что процедуры, которые сделали бы мошенничество обнаружимым, не были соблюдены — и необнаруженная манипуляция неотличима от необнаруженной манипуляции.
Та же логика применяется к машине для голосования с идеальным открытым исходным кодом и воспроизводимой сборкой. Если карта памяти, содержащая результаты, обрабатывается одним человеком без свидетелей перед тем, как она достигнет канцелярии, цепь хранения нарушена. Правильность кода неважна. Вы не можете доказать, что карта содержит выходные данные, которые выдала машина.
Физическая цепь хранения — это не наследственная процедура, которую заменяет технология. Это якорь, который связывает мир программного обеспечения с физическим миром. Без неё идеальное криптографическое доказательство подсчёта плывёт свободно от любого физического бюллетеня, который кто-то может переподсчитать.
Аудиты: проверка, которая закрывает цикл
Федеральный конституционный суд Германии сформулировал принцип так ясно, как это когда-либо делалось: необходимые этапы выборов должны быть «проверяемы гражданином надёжно и без какого-либо специального знания». Суд сказал это в 2009 году, аннулировав использование машин для голосования Nedap на федеральных выборах 2005 года. Машины сохраняли голоса только в электронной памяти. Не было независимо проверяемого записи. Не было проверки, которую неспециалист мог бы выполнить. Суд нашёл это неконституционным — независимо от того, неправильно ли когда-либо работали машины.
Открытый исходный код частично удовлетворяет это требование для технически грамотных граждан. Криптографически проверяемый аудит удовлетворяет его для всех.
Аудит ручного подсчёта штата Джорджия в 2020 году — примерно 5 миллионов президентских бюллетеней, проверённых 159 округами менее чем за шесть дней — подтвердил машинный подсчёт с точностью примерно в одну десятую процента. Это значимый результат. Бюллетень из бумаги, который избиратель отметил вручную, подсчитанный человеком, которого избиратель в принципе мог бы наблюдать, проверенный против машинного результата: это цепь, которую обычный гражданин может проследить без диплома по криптографии.
Но даже эта цепь имеет ограничения. Колорадо провёл первый в штате аудит с ограничением риска в 2017 году, предоставив статистическую уверенность в том, что сообщённый результат был правильным. Аудит с ограничением риска более строг, чем проверка с фиксированным процентом: он выбирает больше бюллетеней в тесных гонках, меньше в раздавленных гонках и предоставляет определённую вероятность того, что неправильный результат был бы обнаружен. Колорадо продолжает сужение своего предела риска. Это направление развития.
Урок из обоих: аудит работает только если есть что-то надёжное, против чего проверять. Бюллетень из бумаги, который избиратель отметил и мог бы проверить, надёжен. QR-код, который избиратель не может прочитать — который федеральный суд нашёл в Curling v. Raffensperger «не обеспечивает проверяемый и проверяемый бюллетеневой записью», потому что код сам подсчитывает голос и избиратель не может его проверить — не является следом аудита. Это машина, доверяющая сама себе.
Открытый исходный код + воспроизводимые сборки + аттестация + цепь хранения сходятся на это: прочная, понятная для человека запись, которую избиратель лично проверил, которую любая независимая сторона может переподсчитать, и чей путь от руки избирателя к итоговому результату документирован на каждом этапе множеством сторон с конфликтующими интересами.
Контрольный список, который никто полностью не выполнил
Вот фактический список того, что «открытый исходный код» даёт вам и чего не даёт:
Что даёт открытый исходный код:
- Возможность квалифицированным экспертам читать код и находить ошибки или backdoor
- Возможность сравнить заявленную логику подсчёта с тем, что она должна делать
- Устранение аргументов о коммерческой тайне, которые блокируют исследование безопасности
- Основу для воспроизводимых сборок и аудита сообщества
Что открытый исходный код не даёт вам:
- Доказательство того, что работающий двоичный файл совпадает с исходным кодом (требует воспроизводимые сборки)
- Доказательство того, что определённая машина работает на сертифицированном двоичном файле (требует аттестацию)
- Доказательство того, что результаты не были изменены между машиной и канцелярией (требует цепь хранения)
- Доказательство того, что подсчёт отражает бумажные бюллетени в коробке (требует аудиты против проверенной избирателем бумажной записи)
Швейцария опубликовала свой исходный код и всё ещё скрыла лазейку — не потому, что публикация была бесполезна, а потому, что публикация без устойчивого, опытного, противостоящего анализа оставила ловушку не сработанной слишком долго. Округ Лос-Анджелеса опубликовал свой исходный код и заслуживает признания. Вопрос на следующее десятилетие в том, сможет ли каждый округ, использующий VSAP, независимо проверить, что двоичный файл на каждой машине совпадает с тем, что говорит исходный код, и что каждая карта памяти прошла неразрывную цепь от машины к канцелярии.
Прозрачность — это не единственный момент. Это процесс, который идёт от хранилища исходного кода к запечатанному пакету на столе в 2 часа ночи.
Что на самом деле сделает это проверяемым
Если бы вы захотели построить систему, в которой любая независимая сторона — не только официальный представитель, не только производитель — могла бы проверить всю цепь от кода к сертифицированному результату, это выглядело бы так:
Первое: Исходный код, опубликованный в версионируемом, неизменяемом хранилище с криптографическим хешем для каждого выпуска.
Второе: Документированный, скриптируемый процесс сборки, который любая сторона может воспроизвести, создав двоичный файл, чей хеш совпадает с сертифицированным хешем.
Третье: Аттестация перед выборами: каждая машина перед обработкой бюллетеня генерирует подписанное измерение своего собственного состояния программного обеспечения. Это измерение проверяется против сертифицированного хеша и логируется публично.
Четвёртое: Проверенные избирателем бумажные записи — бюллетени, которые избиратель лично проверил, отражающие выборы, написанные человеческими словами, а не штрих-коды, которые избиратель не может прочитать.
Пятое: Плановые аудиты с ограничением риска, которые выбирают бумажные бюллетени против машинного подсчёта, размеру соответствующему маржи гонки, проводимые наблюдателями от нескольких партий, с результатами, опубликованными на уровне избирательного округа.
Шестое: Машиночитаемые, результаты уровня избирательного округа, опубликованные в момент их сертификации — не после события, не в формате, требующем запрос о свободе информации, а в файле .csv или .xml, который каждый может загрузить и согласовать против лент избирательного округа.
Ни один из этих шагов не экзотический. Все они существуют где-то в текущей практике. Ни одна юрисдикция не реализовала все из них от начала до конца с независимой проверкой на каждом звене.
Вот разрыв. Не «открытый исходный код против закрытого исходного кода». Разрыв между публикацией кода и созданием всей цепи — от исходного кода к машине к бюллетеню к результату — независимо проверяемой каждым, кто хочет это проверить.
До тех пор, пока эта цепь не завершена и не открыта, «открытый исходный код» — это необходимое улучшение. Это не готовый ответ.
Посмотрите, как этот разрыв выглядит во всех юрисдикциях по всему миру →
Прочитайте 2-минутную версию того, почему открытый исходный код необходим, но недостаточен →
Исследуйте конкретные разрывы в воспроизводимых сборках и аттестации →
Источники
- California Secretary of State — VSAP Tally Version 1.0 certification (Aug. 21, 2018)
- LA County Registrar-Recorder/County Clerk — VSAP official program report
- Lewis, Pereira, Teague — Ceci n'est pas une preuve (trapdoor commitments in the Scytl-SwissPost Internet voting system), 2019
- Feldman, Halderman & Felten — Security Analysis of the Diebold AccuVote-TS Voting Machine (USENIX/EVT)
- Lawfare — What the Heck Happened in Coffee County, Georgia?
- Verfassungsgerichtshof, Decision W I 6/2016-125, 1 July 2016 (English translation)
- Bundesverfassungsgericht, Judgment of 3 March 2009, 2 BvC 3/07 and 2 BvC 4/07 (English translation)
- Curling v. Raffensperger, No. 1:17-cv-2989-AT, Opinion and Order (N.D. Ga. Oct. 11, 2020)
- Colorado Secretary of State — A new kind of election audit: Colorado is first to complete it
- Georgia Public Broadcasting — Risk-Limiting Audit Confirms Biden Won Georgia