导语:根据一般的经验,开源加密的安全性要低于闭源加密,但事实上确实如此吗?
根据一般的经验,开源加密的安全性要低于闭源加密,但事实上确实如此吗?
根据Linus's Law,开源软件(OSS)比闭源软件(CSS)具有更少的漏洞。由于更多的人可以访问OSS及其代码,因此,更多的人会使用该软件,阅读其源代码,发现其中的漏洞,并报告此类漏洞。这篇文章是在加密漏洞的背景下讨论的,加密漏洞是加密组件中的软件或逻辑漏洞。
注:Linus's Law,是1999年 Eric Steven Raymond在他出版的讨论软件工程方法的著名文集《大教堂和市集》中描述的一个观点:given enough eyeballs, all bugs are shallow。只要有足够多的眼睛,就可让所有问题浮现。更正式的说是:只要有足够的单元测试员及共同开发者,所有问题都会在很短时间内被发现,而且能够很容易被解决。
我想用我最近讲过的区块链中的漏洞(通常是加密漏洞)的例子,根据它们是如何被发现的,将加密漏洞分为四类。这些想法主要基于我十年前开始审查加密软件的经验,适用于各种项目,包括科技初创企业、大型企业、政府组织和区块链公司。
· 使用漏洞:这些漏洞是你可以在不阅读代码的情况下,使用应用程序找到的漏洞。例如,良性SHA-512越界读取。对于这种类型的漏洞,OSS的安全性可能要差一些。在CSS中,我没有注意到那些已经广泛使用的应用程序和下载量很少的应用程序之间的安全性有什么重大差异,这表明存在大量的使用漏洞。
· 原语漏洞:这些漏洞是由加密原语或协议的漏洞而引发的。通常情况下,阅读文档就足够了,甚至不需要深入研究代码。原语漏洞在十年前并不罕见,但今天每个人都能上网,了解要避免的原语。最近的一个例子是有人公开宣称用IOTA的哈希算法可以产生冲突交易,可以识别哈希值相同的2个密钥,攻击者有机会进行冲突交易的攻击。但根据我的经验,近年来OSS往往具有较少的原语漏洞,原因是CSS有时依赖于其他或遗留组件,因此无法完全选择所有原语。
· 滥用漏洞:这种情况是使用原语是正确的,但使用方式不安全。例如,Lisk使用Ed25519签名和安全哈希函数来生成过短的地址。其他常见的漏洞包括具有易碰撞的随机数流加密(Stream cipher),或者PBKDF2迭代次数不足。这些漏洞最常见于代码审查中,并且相对容易找到。就滥用漏洞来说,我不认为我在CSS中看到的每行代码漏洞比OSS中的代码更多。
Hard bug:为了找到这样的漏洞,你通常需要了解复杂的协议或逻辑,并且在数学或编程语言内部等领域具有特定的高级技能。例如,这篇文章中讨论的libzerocoin漏洞对于单纯的代码审阅者来说并不是很容易发现的。不过这些漏洞更多会被有经验的人找到。
也许开源加密与闭源加密的不同之处就在于,闭源加密漏洞往往比开源加密漏洞更难找到,同时这两种加密情况下的漏洞利用都不那么复杂,例如,你很少需要编写复杂的shellcode和chain漏洞以便利用加密漏洞。但是,某些加密漏洞则需要利用强大的计算能力(例如ROCA或SHA-1碰撞)。