开源投票系统是必要的——但还不够。以下是缺失的部分。
洛杉矶县花了十年时间打造世界上最透明的投票系统——开源、公众所有、独立可审计。瑞士做了同样的事情。研究人员仍然发现了一个隐藏的后门。以下是两个案例都遗漏的内容。
2018年8月21日,一位加州州政府官员站在麦克风前,即将说出该州历史上前所未有的话:洛杉矶县的选票统计系统刚刚获得认证——这是第一次,用于计算选票的软件属于公众所有。
不是供应商。不是受商业机密法保护的私营公司。是公众。
该系统被称为VSAP——全民投票解决方案。 它耗费数年时间和数千万美元才得以建成。从零开始为美国最大的选举司法管辖区设计,用以取代老旧的专有机器。其源代码——告诉计算机如何统计您的选票的实际指令——已向任何人公开。
这确实是一个里程碑。但这仍然还不够。
这一差距——开源代码与验证计票之间的差距——正是本文的主题。
为什么秘密源代码从来都不是正确答案
要理解VSAP的意义,您必须理解它取代了什么。
几十年来,计算美国选票的软件一直是商业机密。供应商辩称他们的代码是专有知识产权。选举官员必须相信这些机器能正确工作。通过其他手段获得机器的研究人员——比如2006年从Diebold AccuVote-TS获得机器的普林斯顿团队,花了几周时间研究——发现他们可以在不到一分钟内安装选票盗取代码,该代码会从一台机器传播到另一台机器,并改变所有内部日志以保持一致。该机器会以完全的信心报告篡改后的计数。
代码是秘密的。篡改是看不见的。
2021年乔治亚州咖啡县展示了同一把剑的另一个刃口:保持代码秘密并不能保证其安全。一个取证小组被允许进入选举办公室,走出来时携带了整个Dominion投票系统的副本——选举管理系统、民意调查垫、选票标记设备、扫描仪,一切。作为安全策略的保密性只与房间里最配合的知情人一样强大。
开源代码打破了这两种故障模式。您无法在每个人都能阅读的代码中隐藏选票盗取病毒。您不需要窃取秘密,因为根本不存在秘密。
但一旦您发布源代码,您就转移了问题。 问题不再是"代码说什么?"问题变成了:"选举之夜实际运行的代码与GitHub上的代码是否相同?"
事实证明这个问题很难回答。
瑞士的教训:开源代码、隐藏缺陷
2019年,瑞士邮政及其西班牙供应商Scytl做了看起来像透明度黄金标准的事情。他们在计划在具有约束力的联邦投票中使用前,发布了瑞士互联网投票系统的完整源代码。独立研究人员可以阅读每一行。
研究人员Sarah Jamie Lewis、Olivier Pereira和Vanessa Teague接受了邀请。他们在密码学中发现的不是打字错误。不是粗心的错误。这是一个后门——一个埋藏在混合网络洗牌证明中的数学结构,允许掌握某些秘密值的人生成一个验证副本,该副本会通过每项检查,同时在其下方改变了选票。
该系统声称提供"通用可验证性"。有效的证明将确认洗牌是正确的。但如果您知道后门值,您可以生成该证明来通过一个实际上不正确的洗牌。
他们称他们的报告为Ceci n'est pas une preuve——"这不是一个证明"。瑞士邮政和Scytl承认了这一发现。瑞士当局暂停了该系统。十年的工作,一次完整的公开代码发布——缺陷仍然存在,直到外部密码学家深入研究数学才被发现。
以下是新闻稿中未出现的教训:开源代码是必要的,因为它使独立检查成为可能。它还不够充分,因为检查仍然必须真正进行,由有能力找到他们所寻找内容的人进行,然后修复必须得到可验证的应用。
发布代码是故事的开始,而不是结束。
可复现性问题:从代码到运行中的机器
让我们更具体一点。想象您是洛杉矶县的市议会成员。您可以阅读VSAP源代码。您发现它是干净的。您对代码的正确性感到满意。
选举之夜到来。在仓库的某个地方,一台机器醒来并开始计算选票。
您如何知道该机器运行的是您读过的代码?
"源代码"和"运行软件"之间的差距称为构建过程。源代码是人类可读的文本。计算机运行编译的二进制文件——编译器从该文本生成的机器指令。编译过程不是自动的、明显的或肉眼可验证的。它涉及选择:哪个编译器版本、哪些标志、哪些依赖项、按什么顺序。
如果两个人使用不同的编译器编译相同的源代码,他们通常会生成不同的二进制文件。 如果二进制文件不同,您无法通过查看它们来判断差异是无害的(不同的优化设置)还是恶意的(添加的指令)。
这不是理论上的问题。它在Ken Thompson的1984年图灵奖演讲"关于信任的思考"中被精确描述。Thompson表明您可以在编译器中插入后门,该后门会无形地将恶意代码添加到它编译的任何程序中——包括编译器的未来版本——在任何人能读到的源代码中留下任何痕迹。
在过去十年中,自由软件世界开发的解决方案称为可复现构建。其理念是:如果构建过程是确定性的——相同的输入,相同的输出,每次都是——那么任何独立方都可以编译相同的源代码,并将二进制文件指纹与实际安装在机器上的代码进行比较。如果指纹匹配,机器正在运行代码所说的内容。
如果它们不匹配,代码和机器之间的某些内容发生了变化。这不是哲学上的问题。这是安全故障。
我们在关于可复现构建的文章中更深入地涵盖了这一点。 简短版本:没有它们,"开源"意味着"您可以阅读食谱"。它并不意味着"从烤箱里出来的东西就是食谱所描述的"。
VSAP的开源架构是一个真正的进步。但开源而没有记录完整、可复现的构建过程,会留下源代码审计无法弥补的差距。
证明:证明机器就是该机器
可复现构建告诉您二进制文件是否与源代码匹配。证明是将特定机器、特定时间的特定验证二进制文件联系起来的步骤。
可以将其视为一条签名链。司法管辖区证明一个二进制文件。二进制文件被加密签名。当机器在选举日启动时,它测量自己的软件状态并生成一份签名报告——一份"测量"——可以根据认证值进行检查。如果任何内容被修改,测量将不匹配。这不是奇特的;现代智能手机已经通过这种方式保护其引导过程。
在当前选举系统实践中,等价物是一个哈希——数字指纹——应该在部署前与认证版本进行检查。但"应该"在这句话中承担了很大的责任。检查通常是手动的、不频繁的,或者依赖可能本身存在差距的监管链。
考虑咖啡县发生的情况:整个系统的软件被有合法物理访问办公室权限的人复制并分发。这些系统通过了选前检查。事后进行的哈希比较会告诉您留在办公室中的机器上的二进制文件是否发生了变化。它不会告诉您离开的副本会发生什么。
证明单独不能解决内部威胁问题。但这确实意味着每台机器在启动时都可以被要求证明它正在运行什么——答案可以在投票开始前针对公开注册表进行检查。
监管链:代码无法替代的物理层
以下是选举之夜凌晨2点时完全可审计的开源系统的样子:一张记忆卡从制表机中取出,放入由多党观察员签署的密封袋中,记录在分类账中,由来自不同政党的两个人运输,并到达一个中央设施,在读取数据前检查其印章。
以下是链条断裂时的样子:2016年奥地利宪法法院推翻了一次总统决选——不是因为发现了欺诈,而是因为在多个地区,邮寄选票被未经授权的人在法律规定的窗口外打开和计算,没有所需的见证人。大约77,000张选票受到证实程序违规的影响,这超过了30,000张的获胜边界。法院没有发现欺诈。它无论如何都推翻了选举,因为会使欺诈可被检测到的程序未被遵循——一个未被检测到的操纵与未被检测到的操纵无法区分。
同一逻辑适用于具有完美开源代码和可复现构建的投票机。如果包含结果的记忆卡由一个没有见证人的人处理,然后才到达计票处,监管链就被破坏了。代码的正确性是无关的。您无法证明卡包含机器生成的输出。
物理监管链不是被技术替代的遗留程序。它是将软件世界与物理世界相连的锚。 没有它,完美的密码证明的计数浮离任何任何人都可以重新检查的物理选票。
审计:关闭循环的检查
德国联邦宪法法院对这一原则的表述就像任何法院所做的一样明确:选举的基本步骤必须是"任何公民都能可靠地检查,不需要任何专业知识"。法院在2009年做出了这一声明,推翻了在2005年联邦选举中使用Nedap投票计算机。这些机器仅将选票存储在电子内存中。没有独立可验证的记录。没有非专家可以执行的检查。法院认为这违反了宪法——无论机器是否曾出现故障。
开源代码部分满足了技术素养公民的这一要求。可密码验证的审计可以对所有人满足。
乔治亚州2020年全州人工计票审计——大约500万份总统选票,由159个县在不足六天内审查——确认了机器计数在约十分之一百分比以内。这是一个有意义的结果。由选民手工标记的纸质选票,由选民原则上可以观看的人计算,根据机器总数检查:这是普通公民可以不需要密码学学位的情况下追踪的链条。
但即使那条链条也有限制。科罗拉多州在2017年进行了第一次全州风险限制审计,提供了统计信心,表明报告的结果是正确的。风险限制审计比固定百分比检查更严格:它在接近的比赛中抽样更多选票,在压倒性胜利中更少,并提供定义的概率,表明错误的结果会被发现。科罗拉多州继续收紧其风险限制。这是前进的方向。
来自两者的教训:审计只有在有可信任的东西来审计时才有效。 选民标记和可以检查的纸质选票是可信的。选民无法读取的二维码——美国联邦法院在Curling v. Raffensperger中发现"不提供可验证和可审计的选票记录",因为代码本身对选票进行制表,选民无法验证——不是审计线索。这是机器信任自己。
开源+可复现构建+证明+监管链汇聚于此:一份耐用的、人类可读的记录,选民个人验证过,任何独立方都可以重新计数,其从选民之手到最终计票的路径在每个步骤都由多个具有相互冲突利益的方记录。
没人完全完成的检查清单
以下是"开源"给您什么和不给什么的实际清单:
开源给您的:
- 合格专家阅读代码并发现错误或后门的能力
- 比较计数的明述逻辑与其应该做的事情的能力
- 消除阻止安全研究的商业机密论证
- 可复现构建和社区审计的基础
开源不给您的:
- 运行中的二进制文件与源代码匹配的证明(需要可复现构建)
- 特定机器运行认证二进制文件的证明(需要证明)
- 结果在机器和计票之间未被改动的证明(需要监管链)
- 计数反映盒子中纸质选票的证明(需要针对选民验证纸质记录的审计)
瑞士发布了其源代码并仍然隐藏了后门——不是因为发布是无用的,而是因为没有持续的、专家的、对抗性审查的发布太久没有发现陷阱。洛杉矶县发布了其源代码,应该得到赞扬。下一个十年的问题是,使用VSAP的每个县是否可以独立检查每台机器上的二进制文件是否与源代码所说的匹配,以及每张记忆卡是否从机器到计票处走过了不间断的链条。
透明度不是一个单一时刻。它是从源代码存储库到凌晨2点的密封袋的过程。
什么会真正使其可检查
如果您想构建一个系统,其中任何独立方——不仅仅是官员,不仅仅是供应商——可以验证从代码到认证结果的整个链条,它看起来会像这样:
第一: 在一个版本化、不可变的存储库中发布源代码,每个发布都有加密哈希。
第二: 记录完整、脚本化的构建过程,任何方都可以复现,生成一个哈希与认证哈希匹配的二进制文件。
第三: 选前证明:每台机器在处理选票前,生成其自身软件状态的签名测量。该测量根据认证哈希进行检查并公开记录。
第四: 选民验证的纸质记录——选民个人检查过的选票,反映人类可读的选择,而不是选民无法读取的条形码。
第五: 例行风险限制审计,对纸质选票进行抽样以对抗机器计数,规模根据比赛的差距,由来自多方的观察员进行,结果在选区级别发布。
第六: 机器可读、选区级别的结果,在认证时刻立即发布——不是之后,不是以需要信息自由请求的格式,而是.csv或.xml文件,任何人都可以下载并与选区记录进行对账。
这些步骤都不是奇特的。所有步骤都存在于当前实践中的某个地方。没有司法管辖区已端到端实现了所有步骤,具有每个链接处的独立验证。
这是差距。不是"开源vs.闭源"。差距在于发布代码和使整个链条——从源到机器到选票到计票——独立可验证之间。
在那条链条完整和公开之前,"开源"是必要的改进。它不是一个完整的答案。
资源
- 加州国务卿——VSAP计票版本1.0认证(2018年8月21日)
- 洛杉矶县记录员/县书记——VSAP官方计划报告
- Lewis、Pereira、Teague——Ceci n'est pas une preuve(Scytl-SwissPost互联网投票系统中的后门承诺),2019
- Feldman、Halderman和Felten——Diebold AccuVote-TS投票机安全分析(USENIX/EVT)
- Lawfare——乔治亚州咖啡县究竟发生了什么?
- Verfassungsgerichtshof、决议W I 6/2016-125、2016年7月1日(英文翻译)
- Bundesverfassungsgericht、2009年3月3日判决、2 BvC 3/07和2 BvC 4/07(英文翻译)
- Curling v. Raffensperger、案号1:17-cv-2989-AT、意见书和命令(N.D. Ga. 2020年10月11日)
- 科罗拉多州国务卿——一种新的选举审计:科罗拉多州第一个完成它
- 格鲁吉亚公共广播——风险限制审计确认拜登赢得格鲁吉亚州