不推荐开源 webapp 的代码吗?

信息安全 Web应用程序 开源 朦胧
2021-08-25 11:17:20

如何找出网站内置的编程语言?

如果所有者忘记关闭调试模式,可以对多少 Django 应用程序进行逆向工程?

和其他类似的问题 ^ 。

很快:似乎至少在 Web 应用程序开发方面,我们希望向攻击者披露尽可能少的信息。

  • 攻击者想要确定我们的 Web 应用程序运行的平台,但我们想要诱使他们相信它是一个与实际不同的平台;
  • 建议我们关闭调试模式,因为详细的异常信息可能会泄漏我们应用程序的部分源代码(而不是平台的);

如果我们开源我们的网络应用程序的服务器代码,我们愿意将这些信息交给每个人,我链接的问题讨论如何隐藏这些信息;甚至比这更多的信息。

因此,开源应用程序似乎是人们最不想做的事情之一。

这让我很惊讶,因为:

  • 一些人认为开源应用程序更安全,因为更友好的眼睛可能会查看代码,寻找可利用的错误并提交补丁;
  • 由于上述问题而不开源应用程序是通过默默无闻的安全性,这是不好的。

但是,根据@Mason Wheeler 对此网站的评论

我认为,如果即使是安全测试人员也无法弄清楚该网站是用什么语言构建的,那么它就会更加安全,因为这样就没有人知道要尝试哪种漏洞利用了。(是的,偶尔会有通过默默无闻来确保安全的有效用例。)

因此,是否同意将 Web 应用程序的服务器端代码开源是一个可怕的想法?

4个回答

这是一个复杂的问题,因为有几个方面需要考虑,有利有弊,并且可能没有明确的答案。

开源软件的安全优势应该来自维基百科称之为“Linus 定律”的“定律”,即“只要有足够的眼球,所有的 bug 都是浅的”。首先,您必须问自己将拥有多少个眼球。例如,您的项目是否将被大量用户共享、分叉、广泛使用并由大型社区进行审查?还是您的软件只会在您的网站上使用而没有其他人会关心它?或者也许没有其他人能够重复使用它,因为它没有附带自由软件许可证?最终会有白帽眼球和黑帽眼球,所以你需要愿意接受一方面你会从道德黑客那里得到一些安全改进,但另一方面,您也会受到黑帽子的攻击。攻击者是否会对针对您的项目特别感兴趣,还是只会受到非针对性攻击?这些都是你应该考虑的事情,可能并不容易得出结论。还值得记住的是,在几个开源项目中,尽管社区的所有眼球都存在安全漏洞,但这些漏洞已经存在了很长时间(参见维基百科上的莱纳斯定律)。

默默无闻的安全性是另一个经常被误解的概念,因为它的名字听起来就像是为了保密。不是这样的。通过默默无闻的安全性是指您的安全性的重要部分来自方法(实现)的保密性。这是一个默默无闻的安全示例:

// Login without password if URL has parameter dev=debug
// I'm a stupid dev, so I believe this is secure because nobody knows about it!
// But this source code can't be published or I'll be hacked at once
if ($login_password === $password || $_POST['dev'] === 'debug') {
    login_ok();
}

无论如何,即使您的代码是正确的并且您在设计上依赖于安全性,也没有什么能阻止您在其之上使用一层混淆。也就是说,将源代码保密可以帮助您,因为它会减慢潜在攻击者的速度。要记住的重要一点是,默默无闻是可以的,只有当它只是良好设计之上的一层时,它才能被视为一项重要资产。

总之,我会说你最好不要发布源代码,除非你有理由这样做(例如,因为你希望你的软件是免费的/自由的并且你想围绕你的项目创建一个社区)。例如,如果您的唯一目标是提高应用程序的安全性,那么仅在 GitHub 上发布它就不会获得任何好处。如果您真的担心您的软件可能包含错误并且您希望其他人通过提供更多“眼球”来帮助您,您可以考虑支付专业的安全审计费用。

阅读我在上下文中写的内容很重要。

是的,偶尔会有一些有效的通过默默无闻来确保安全的用例。

这是为了回答一个关于渗透测试黑盒系统的问题而写的,在这个黑盒系统中,源可用的想法甚至都没有放在桌面上。在这种情况下,默默无闻的安全性可以具有一定的效用。但是,作为一般规则,它并不是特别有用,而且当它有用时,它仅作为更大的纵深防御策略的一部分有用。 如果你不知道目标在哪里,你就无法攻击它,但是一旦坏人知道他的目标是什么,你最好也有其他防御措施,否则你就会陷入众所周知的小河.

此外——而且更适用于考虑开放源代码可能性的这个问题——无论你从隐藏源代码中获得的任何好处都大大超过了Kerckhoff 的原则:“[你应该总是假设]对手知道系统。” 换句话说,如果对手拥有完整的源代码,你就不能认为你的系统是安全的,那么你就不能认为它是安全的。(这只是常识;在硬件商店告诉您隐藏它很重要以使人们看不到它是哪种锁的情况下,您对物理锁有多少信任?)

如果您从假设对手了解系统开始——在现实世界中,这意味着他可能通过其他黑客、某种形式的间谍活动或各种其他妥协获得了这些知识——那么从逻辑上讲,发布代码没有教给他任何新东西。它所做的就是让好人有机会赶上:现在邀请那些永远不会试图破解您或损害您安全性的诚实人来看看并指出可以更好的地方。

从严格的网络安全角度来看,公开来源显然是战胜默默无闻的赢家。不想这样做可能还有其他原因(保护业务方法或其他敏感信息),但更好地阻止黑客入侵并不是其中之一。

发布代码与未能保护代码不被漏洞利用之间存在重要区别。

如果您发布代码,就会有黑帽、灰帽和白帽可以访问您的代码。白帽会披露他们发现的任何漏洞,如果漏洞赏金足够大,灰帽可能会披露这些漏洞。无论如何,Blackhats 都会尝试破解您,而发布的代码将对他们有所帮助,因此在您从漏洞披露中获得的利益与攻击者发现漏洞的危险之间需要权衡取舍。但这种权衡往往有利于出版。

如果您的代码被漏洞利用发现,那么主要是可以访问它的黑帽。如果以这种方式发现漏洞,它们被负责任地披露的可能性就会大大降低,因此这种权衡不太可能对您有利。

通过默默无闻的安全并不是一件坏事,它只是不可靠。它永远不应该是您保护某物的主要或唯一方法。它可能具有误导性和虚幻性。但在其他方法之上,它仍然具有一定的价值。不知道您的平台可能会减慢攻击者的速度,或导致他错过可能的攻击途径。特别是因为反过来适用,所以有预先编写的渗透测试工具一个接一个地应用常见的已知漏洞。为什么要冒险暴露他们?

“友好的眼睛”方法适用于 Linux,因为很多人实际上都在使用 Linux,并且对它的持续和改进功能感兴趣。与 Apache 和其他任何东西相同。您的 Web 应用程序不太可能出现这种情况。您可能正在为自己公司的特定用途开发 Web 应用程序,而不是任何人都可能将其合并到其网站中的更通用的框架。所以你不太可能从贡献者那里受益。

掩盖他们!还有所有其他适当的东西。