我了解,对于开源软件,我的使用量可能会根据作者的信任度和他们使用的分发平台(Codeplex、Git 或私人服务器)而有所不同。
FOSS 网站通常会为我提供一个下载二进制文件的链接和另一个下载源代码的链接。
在什么情况下我可以简单地下载exe?(并验证校验和,希望没有 rootkit 等)
有时我应该从源代码编译二进制文件吗?
可能有助于回答这个问题的是有关预编译的 EXE 感染了病毒或其他恶意代码的众所周知的问题的信息。(等)如果您知道任何此类事件,我也会很感激这些信息。
我了解,对于开源软件,我的使用量可能会根据作者的信任度和他们使用的分发平台(Codeplex、Git 或私人服务器)而有所不同。
FOSS 网站通常会为我提供一个下载二进制文件的链接和另一个下载源代码的链接。
在什么情况下我可以简单地下载exe?(并验证校验和,希望没有 rootkit 等)
有时我应该从源代码编译二进制文件吗?
可能有助于回答这个问题的是有关预编译的 EXE 感染了病毒或其他恶意代码的众所周知的问题的信息。(等)如果您知道任何此类事件,我也会很感激这些信息。
大多数时候,它只是稍微安全一点,有时它更不安全。
在什么情况下我可以简单地下载exe(cutable?)
来自主要发行版的签名包构建在发行版的构建服务器上。在这方面,几乎可以肯定最好使用包装系统。
有时我应该从源代码编译二进制文件吗?
通常,源代码控制存储库(例如)git
会产生可以观察到的不知名的历史,而不是可以单独更改的二进制输出。在这方面,源代码更安全,但前提是您实际上是在审查它。可能存在恶意二进制文件,或者打包开发人员的系统被恶意编译器破坏,但前者的记录实例很少见,而后者几乎闻所未闻。
编译也会使您暴露于未知的错误中。如果您使用不同的编译器选项,您可能会引入一个在定期分发的二进制文件中看不到的错误。由于不同的编译器标志,有很多与机器相关的缺陷或行为变化的情况。在这方面,从源代码编译可能不太安全。
这里的最终答案归结为您愿意花费多少时间来验证二进制文件或源代码的来源。
我先声明,我不知道任何只有 FOSS 项目的预编译可执行文件包含恶意代码的情况。所以如果你正在寻找具体的例子,这个答案可能不适合你。
自己编译代码的最大优势是能够通读所述代码并确定代码实际执行的操作。这通常被吹捧为 FOSS 代码的主要优势。参见莱纳斯定律。
有足够的眼球,所有的错误都是浅的
但实际上,单个开发人员甚至是一小部分开发人员都没有时间和意愿去查看项目中使用的每个 FOSS 代码的源代码。更不用说要真正发现恶意代码,开发人员需要有安全背景。想象一下,在编译之前遍历 Linux 内核的整个代码库……您需要对 FOSS 开发人员和项目托管站点有一定的信任。
就个人而言,我将采取的方法取决于相关 FOSS 项目的声誉。如果它像 Linux 内核这样庞大且有声望的东西,我只会使用他们提供的任何二进制文件,并相信许多开发人员会发现恶意代码并及时发布修复程序。如果项目不是很有名气,我会尝试自己检查源代码,看看是否有任何恶意代码的提示,然后再自己编译。如果那不可能,我会质疑所说的 FOSS 项目的使用,而是选择一个更有信誉的项目,甚至自己编写功能。
源代码在以下方面“更安全”:
第一种方式不是强有力的保证。首先,由于您设想的是一个敌对的作者,那么您必须考虑该作者可以通过哪些方式为您提供带有后门的特定源代码,这与其他人看到的源代码不同。因此,可以审查您将要编译的源代码的一组人可能会减少为一个人,即您。在这种情况下,如果您个人不愿意执行完整的源代码审查,那么编译源代码不会让您比使用二进制文件更安全,至少对于想要植入后门的敌对作者而言。
其次,后门和其他漏洞是错误。已经充分证明,再多的代码审查都无法检测出所有的错误,即使是非常严重的错误,即使是真正错误的错误也是如此。如果我们不能可靠地找出仅仅是运气不好和疏忽造成的错误,我们怎么能指望识别出故意逃避检测的所谓聪明的攻击者故意制造的错误呢?
经典的必读参考资料是Ken Thompson 的图灵奖讲座。有关最近的故事,请参阅有关OpenBSD IPSec 实施中所谓的后门的所有戏剧,结果证明(官方)是一个哑弹。虽然在后一种情况下似乎没有实际的后门(我没有检查过自己),但它强调了一个事实,即在有细微缺陷的 PRNG 中植入一些后门似乎是很有可能的,即使作为许多人都能看到的源代码.
最后,这是一个风险问题。从攻击者的角度来看,在源代码中放置后门是有风险的:如果源代码被广泛使用,那么被抓到的风险就更高;而二进制代码中的后门大多是安全的——同样,对于攻击者而言。依赖源代码对你来说更安全意味着依赖攻击者的理性,即使用源代码,因为你相信攻击者不会疯狂到冒险将后门置于可见源代码中。
至少在 Windows 的二进制文件的情况下,防止病毒可能具有更高的实用价值。通过使用源代码,您可以抵抗大多数可以在软件作者的机器上运行的病毒(当然,不能抵抗您自己机器上的病毒——但这些病毒已经存在)。
首先,正如其他人所说,开源并不意味着那些看代码的人有足够的技能来检测你提到的问题。此外,代码可以看起来是良性的,而实际上它在幕后做了一些事情:请参阅Underhanded C 代码竞赛的示例:
一项挑战编码人员解决简单数据处理问题的竞赛,他们通过编写看似无辜的 C 代码,该代码尽可能可读、清晰且看似可信,但暗中实现了恶意功能。
其次,即使代码不一定有明确的恶意位,它也可能容易受到可能危及系统的攻击。Heartbleed 可能是这里最明显的例子。
因此,假设您信任作者和社区,并且不存在诸如随机数类型中的漏洞之类的微妙问题,那么现在的问题是 - 我何时可以信任二进制文件以及何时更建议从源代码编译?
要回答这个问题,我建议您查看reproducible builds。它们正在debian和其他包括tor中实现。如果您感兴趣的 FOSS 程序提供可重现的构建和分发校验和的自动化系统,那么二进制文件被破坏的可能性很小。特别是查看Qubes 项目在签名方面是如何做到的。