无法证明代码是真实的代码
即使投票软件是公开发布的,仅有这一点还不够。你还需要能够自己重新构建它,并得到机器实际运行的完全相同的程序。没有这一点,已发布的代码可能与秘密安装的不同版本不匹配。
说明视频即将推出
60 秒的平实语言演示,讲解此漏洞。
实际发生了什么
这是一项公认的软件供应链原则。跨行业的 Reproducible Builds 项目之所以存在,正是因为阅读源代码是不够的——你必须能够独立重新构建它,并确认你得到完全相同的程序,逐位相同。否则"这是我们的源代码"和"这是正在运行的程序"就是两个不同的、无法验证的事情。
当前状况
如今大多数司法管辖区甚至不要求投票软件的源代码公开(见"你不被允许检查的软件")——因此要求任何人都能与运行中的机器匹配的可复现构建就更稀少了。上面的数字反映的是现行法律。
阅读菜单不等于品尝食物
发布源代码就像公布餐厅的食谱。很好——但这并不能证明厨房实际上按照那个食谱做菜。也许他们照着做了。也许他们没有。仅从食谱本身无法判断。
可复现的构建弥补了这个差距:任何人都可以获取已发布的源代码,自己编译它,并检查他们得到的完全相同的程序——逐位相同——与安装在机器上的一致。这是更广泛的软件世界用来捕捉审查后被篡改代码的方法。
为什么重要
没有可复现的构建,"这是我们的开源代码"和"这是机器上运行的程序"就是两个独立的声称,其中只有一个可以被检查。一个已发布的干净版本可能与一个秘密修改过的版本并存,而任何外部方都无法证明两者的区别。
TrustVoting 如何解决这个问题
TrustVoting 致力于可复现的构建:重新构建已发布的源代码,得到完全相同的二进制文件——然后完整性层(校验和 + 认证启动)证明机器运行的正是那个二进制文件。开放代码 → 任何人都能复现的构建 → 一台机器证明它正在运行。
TrustVoting 如何消除它
TrustVoting 致力于可复现的构建:任何人都可以获取已发布的源代码,重新构建它,并确认它产生的二进制文件与机器运行的完全相同——然后完整性层(校验和 + 认证启动)证明机器正在运行该二进制文件。