解决间接漏洞之谜,在不破坏依赖树的情况下修复间接漏洞

修复间接漏洞是一项复杂、乏味、坦率地说很无聊的任务,没有人真正想去做。除了清创,似乎。当然,有很多方法可以手动完成,但它可以自动完成,而破坏更改的风险最小吗?听取情况汇报的小组决定找出答案。
满是脆弱树木的森林
那么,你从哪里开始呢?
首先,需要有一种方法来修复漏洞,对于间接依赖性,这是不可能的。其次,它需要以安全的方式进行,或者在没有任何中断的情况下进行。
你看,间接依赖关系是在依赖关系树的深处引入的,很难得到你想要的确切版本。作为Debricked的R&,D曾经说过。"
换句话说,真的应该有一种更简单、压力更小的方式来做。
在本文中,我们将引导您了解如何手动解决可传递漏洞,并在最后向您展示Debricked解决方案,该解决方案允许您自动完成。如果你真的对这个解决方案感兴趣,我建议你开始滚动。
依赖树上的精确手术
在graph数据库项目的研究阶段,或者说,Debricked today如何以光速修复您的开源漏洞,团队偶然发现了一些文章,解释了如何修复NPM中的间接漏洞。
如文章所述,“最低限度”软件包受到漏洞的影响,即CVE-2021-44906和CVE-2020-7598。
这些都是“原型污染”漏洞,这意味着争论没有得到适当的净化。幸运的是,“minimist”的维护者在1.2.6版本中修复了这些漏洞。
不幸的是,“mocha”7.1.0版解决了“minimist”0.0.8,这在这些漏洞的易受攻击范围内。正如本文作者所建议的,这些漏洞可以通过几种不同的方式修复。

但是打破改变怎么样?
第一个建议是简单地触发所有“间接依赖项”的更新,这意味着我们实际上不会更改“mocha”的版本。要执行此更新,只需运行“npm update”,删除您的“npm”。锁定“file”,然后运行“npm install”。这将使用间接依存关系的最新版本(根据约束)重新生成依存关系树。使用这种方法,破坏更改的风险非常低,因为实际上不更新任何根依赖项,只更新间接依赖项。
但生活并不总是这么容易,这种简单的树更新并不能解决漏洞。问题是“mkdirp”实际上已经将“minimist”的版本锁定为0.0.8。这意味着“mkdirp”的贡献者已经得出结论,它们与“minimist”的较新版本不兼容,强制更新“minimist”可能会在“mkdirp”和“minimist”之间引入破坏性变化。
思考图!
因此,百万美元的问题是:应该使用哪种版本的“摩卡咖啡”,从而在不破坏依赖树的情况下,逐步形成安全版本的“最低限度主义”?这实际上是一个图问题,本文对此进行了描述。
什么图形算法可以解决这个问题?NPM如何解析依赖关系可能有点复杂,因为它们可以“拆分”依赖关系树。这意味着它们可以有一个依赖项的多个版本,以确保我们始终有一个兼容的树。为了解决这个漏洞,我们需要通过更新所有可以延伸到“minimist”的根来确保“minimist”的所有实例都是安全的。
用于解决此问题的算法称为“所有最大路径安全”。通过遍历依赖关系图并保留最大版本,同时在每个交叉点修剪该包的所有其他版本,我们可以创建依赖关系树的近似表示。如果近似是安全的,这意味着我们的真实树也将是安全的!
在这种情况下,我们不必搜索很远#8230,因为“摩卡”的7.1.1是安全的!这只是一个补丁更新,这表明破坏更改的风险非常低。对于不太复杂的情况(如本例),“npm audit”可以帮助您使用其奇妙的“npm audit fix”命令。
不要太即兴,进入酒吧亚人类的工作方式!
现在,如果你走到这一步(祝贺你,非常令人印象深刻)并想,“这听起来很复杂,而且需要做很多工作,”别担心,你不是唯一一个。幸运的是,单击这个小按钮时,所有这些都会在Debricked工具中完全自动发生:

到目前为止,这可用于Javascript。很快,支持将扩展到Java、Golang、C#、Python和PHP。
如果你还不是一个被询问的用户,你还在等什么?它对单个开发人员、较小的团队和开源项目是免费的(如果你是一个较大的组织,不用担心。有一个慷慨的免费试用版)。在这里免费注册。