避免发布时间和更新时间之间的竞争条件

信息安全 披露 更新 打补丁
2021-09-06 23:05:10

开发人员发布安全更新的时间与用户实际应用安全更新的时间之间存在一种竞争条件。与此同时,攻击者将能够了解该漏洞并攻击尚未修补的系统。这个问题可以完全避免吗?如果没有,尽可能减轻它的最佳做法是什么?

在某些情况下,这听起来可能不是一个大问题,例如,当补丁是针对难以利用的复杂问题时,尤其是当软件是封闭源代码时。在这种情况下,攻击者将需要几天的时间来开发漏洞,并且用户有足够的时间来更新系统。但在其他情况下,这种竞争条件的影响实际上是灾难性的。想象一下 GitHub 上的一个开源项目中的以下提交:

- echo '<span>' . $username . '</span>'; // line removed
+ echo '<span>' . htmlspecialchars($username) . '</span>'; // line added

这显然是对持久性 XSS 漏洞的修复。即使假设安全更新在提交后仅一小时公开发布,并且用户将在发布后仅一小时进行更新(这完全不现实),这将导致两个小时的窗口即使是没有经验的攻击者也能在一分钟内利用的漏洞。对于非常流行的软件,自动攻击在安全更新发布后仅几个小时就开始的情况并不少见,有时甚至在正式发布前不久就开始了。

那么可以做些什么来完全避免或部分缓解这种竞争状况呢?认真对待系统安全的供应商和客户使用了哪些最佳实践?以下是我想到的一些可能的解决方案:

  • 不要让源代码随时可用,可能是通过编译或混淆它。这是专有软件经常做的事情。我想微软依赖于这样一个事实,即对他们的补丁进行逆向工程需要时间,同时所有用户都可以进行更新。
  • 不要宣传安全修复程序。只需修复并发布它,无需告诉任何人您已修复任何内容,或在任何地方留下任何提示。这可能会延迟攻击,但也可能会延迟更新,因为用户可能会认为“这听起来不重要,我稍后会更新它”。
  • 强制自动修补安全漏洞。在发布任何公告或提供任何安全建议之前,系统将尽快自动修补,仅修复安全问题,避免破坏任何功能。这听起来是个好主意,前提是所有系统几乎同时在短时间内打上补丁。默认情况下,Wordpress 会为其核心执行类似的操作,但我不知道更新所有安装需要多长时间(有数百万个)。
  • 依靠安全公司的服务来领先于攻击者。有些安全公司声称可以像攻击者一样监控各种事情(检测和调查新的攻击,查看官方公告,甚至从黑帽社区收集信息等),并通过特殊的方式帮助您领先于攻击者建议、网络防火墙等。这似乎是另一种流行的解决方案,但它并没有真正解决比赛问题,它只是试图加快比赛速度。此外,此解决方案可能对流行的软件有所帮助,但我想很难找到可以帮助不太常见的应用程序的服务。

我现在想不出别的。

3个回答

这就是纵深防御概念发挥作用的地方。是的,定期正确地打补丁,但要考虑到在任何重要的系统中都会有易受攻击的组件。

您的第一道防线,因为 XSS 有时会通过网络钓鱼被利用,培训您的最终用户如何发现和避免网络钓鱼攻击。

如果用户实施了 Web 应用程序防火墙;那么尽管 XSS 可能仍然存在,但可以检测和阻止利用它的尝试。

如果网络服务器配置了标准的同源策略,那么 xss 成功的可能性就会降低。即使 WAF 没有检测到它。

如果您的软件使用适当的会话管理,并且依赖于例如对关键事务进行重新身份验证,那么即使成功,XSS 攻击的影响也可以显着降低。

如果您确保数据被正确加密,用户只能访问他们需要的内容,并且仅在绝对必要时才存储敏感数据,那么利用该 xss 漏洞将造成的危害较小,即使他们让攻击者可以完全访问易受攻击的系统。

以下是我在野外看到的一些针对逆向工程补丁的防御措施。


公开宣布关键补丁何时可用。

确保攻击者和您的客户同时访问补丁程序,让您的客户在攻击者有足够的时间开发他们的漏洞之前修补他们需要修补的所有内容。

一个著名的例子是Patch Tuesday,这是 Windows 用来在已知日期发布补丁的策略。

另一个例子是 Drupal:他们让人们在发布前一周了解一个非常关键的补丁


为所有内容发布一个补丁。

Windows 也使用了这种策略:通过每隔几周发布一个补丁,与安全修复中的 1 行更改相比,对每个更改进行逆向工程需要更多的努力。

在一个架构良好的系统中,没有一个漏洞应该足以让任何攻击者轻松访问。例如,也许在 PHP 中发现了一个严重的错误,但是您正在 nginx 中运行mod_security,并且您已经清理了未引用的文件,并且您对文件系统具有所需的最低权限,并且数据库用户只能运行存储过程,并且您的开发人员已经在遵循OWASP 指南...基本上它仍然很糟糕,您仍然需要对其进行修补,但是由于您一直遵循良好的安全卫生,您有一些喘息的空间。如果它会是侵入性的,你也许可以等到维护窗口来做这项工作。理想情况下,攻击者需要烧掉几个 0 天才能进入,并且需要更多时间来执行横向移动。你不可能完全安全,但你可以让攻击你的成本更高。

第二件事是不要在自己的背上画一个目标。假设您将成为目标攻击而非投机攻击的受害者——现代水坑/供应链攻击使这种情况变得越来越可能——不要让你的开发人员在 LinkedIn 上贴满技能,使用可以轻松追踪的身份回到你的公司,在论坛上发布关于特定技术的特定版本等。在我们假设的 PHP 场景中,已经在看着你并且知道你使用 PHP 的攻击者会得到“啊哈!” 宣布新漏洞后立即尝试。