我想证明我所使用的源代码和公开的开源版本是一样的。我的想法是发布开源版本的散列,并在引导时将其与已部署服务器的哈希进行比较。但是,由于开源哈希在部署前是可用的,错误的参与者可能会将哈希硬编码到服务器中,从而避免哈希函数。
有什么办法可以防止这种情况发生吗?我发现Heroku正在使用类似的方法来获取提交哈希。这是防篡改的吗?如果是的话,这与我的做法有何不同?
发布于 2020-09-30 10:20:13
如果你读过肯·汤普森的"关于信任的思考",那么你已经知道我要说的一切了。如果没有,请继续阅读:
想象一下,我发布了一个用某种语言编写的开源项目,它只是接受输入并没有改变地返回输入--就像一个非常简单的echo
版本。下载我的源代码,把它全部读一遍(反正只有几行长),然后编译它。你可以确定你的程序做的和你想的完全一样,对吧?
您如何知道您的编译器没有添加任何额外的指令,例如检查输入的sha-256散列是否为e257f6eccac764b6cea785a0272e34d3dbc56419eac2ad436b9fb4bddcd10494
,如果是,则执行一些意外的操作。
你可能会说,这是不可能的,但你永远不能完全肯定。但也许你想完全肯定,对吧?毕竟,您想要以密码的方式证明您正在运行的软件完全按照源代码的要求执行。因此,您可以使用逆向工程工具来检查二进制文件,比如Ghidra或IDA Pro。But...how,你能确定这些工具能像你想的那样做吗?当然,从表面上看,它们看起来像是向您展示了二进制文件,但您如何确保它们不会隐藏恶意插入的代码呢?
您可以完全放弃现有编译器,用字节、字节和指令编写您自己的编译器,但是您如何做到这一点呢?您需要一些将这些字节写入磁盘的程序。您如何知道这些未受感染,并编写了一些额外的字节?
即使您完全放弃程序,只使用磁化针和一只稳定的手,如何确保您的CPU实际运行您希望它运行的指令,而不运行一些额外的指令?毕竟,CPU现在运行的是微码,这是很难检查的。
..。很难证明一台电脑能像我们想的那样做。您能显示一些源代码或部署状态的散列以向客户显示某些内容吗?你当然可以。但这并不意味着什么。
发布于 2020-10-01 14:45:04
问得好!
这可能不是百分之百的证明,但你可能会试图接近与透明度。可以做的是允许对堆栈进行某种级别的审计。例如,允许公开查看进程(只读shell?)哪些二进制文件(只读ftp?)他们跑了。然后,任何人都可以下载二进制文件,进行校验和,并与供应商1进行比较。
发布于 2020-09-30 14:11:26
如果我正确地理解了您的问题,您所问的是不可能的,因为服务器的行为就像一种“黑匣子”,而普通用户无法检查到底发生了什么。
你不需要简单地证明你有什么东西,或者你知道什么:你实际上需要证明你使用的东西和预期的完全一样,包括每一个步骤和每一个细节。要证明黑匣子的确切行为,需要进行大量的分析和检查,而正常用户是不允许这样做的。
换句话说,给出一个简单的例子,StackExchange不可能真的让我们相信他们真的在使用安全哈希函数的特定实现来安全地存储密码。不过,有些事情可能有助于说服我们:例如,有一个由一些外部受信任的当局制定的持续和彻底的审计制度。那么,如果我们能够信任外部审计师,我们就可以把他们报告的任何东西当作证据。然而,完全遵守规定从来没有得到充分的保证(审计员可能腐败)。正如你所看到的,这个问题相当复杂。
https://security.stackexchange.com/questions/239006
复制相似问题