修复间接漏洞是一项复杂、乏味且坦率地说无聊的任务,没有人真正愿意接触。当然,有很多方法可以手动完成,但是否可以自动完成并最大限度地降低中断更改的风险?脆弱树木的森林那么你从哪里开始呢?首先,需要有一种修复错误的方法,这不适用于间接依赖项。其次,它需要以安全的方式进行,或者不破坏任何东西。你看,间接依赖被引入到依赖树的深处,要获得你想要的确切版本是很棘手的。正如Debricked的研发负责人曾经说过的那样,“你通过玩转你的直接依赖并祈祷Torvalds解决正确的间接包来转动旋钮。当Torvalds对你有利时,你必须牺牲一些云存储给Bob叔叔确保更新不会破坏您的应用程序。”换句话说,确实应该有一种更简单、压力更小的方法来做到这一点。在本文中,我们将向您介绍如何手动解决传递性漏洞,并在最后向您展示Debriked解决方案,它允许您自动执行此操作。如果您真的只对解决方案感兴趣,我建议您开始滚动。对依赖树进行精确手术在图形数据库项目的研究阶段,或者更确切地说,在Debricked如何以光速修复您的开源漏洞的今天,团队偶然发现了一些解释如何修复NPM中的间接漏洞的文章。如文中所述,`minimist`包受漏洞影响,即CVE-2021-44906和CVE-2020-7598。这些是“原型污染”漏洞,意味着参数没有被正确清理。幸运的是,`minimist`的维护者在1.2.6版本中修复了这些错误。不幸的是,`mocha`版本7.1.0解决了`minimist`0.0.8,它处于这些错误的易受攻击范围内。正如本文作者所建议的,可以通过多种不同的方式修复这些漏洞。突破性改变?第一个建议是简单地触发所有“间接依赖项”的更新,这意味着我们实际上并不更改mocha的版本。要执行此更新,只需运行“npmupdate”,删除“npm.lock”文件,然后运行“npminstall”。这将使用间接依赖项的最新可能版本(根据约束)重新生成依赖项树。使用这种方法,破坏更改的风险非常低,因为您实际上并没有更新任何根依赖项,只是您的间接依赖项。当包的功能或接口不向前兼容时,就会发生重大更改,这意味着对包的更新可能会破坏您的应用程序。常见的重大更改是类/函数删除、函数参数更改或许可证更改(注意!)。但生活并不总是一帆风顺,树的这种简单更新并不能解决问题。问题是`mkdirp`实际上已经将他们的`minimist`版本锁定为0.0.8。这意味着`mkdirp`的贡献者已经得出结论,他们与较新版本的`minimist`不兼容,强制更新`minimist`可能会在`mkdirp`和`minimist`之间引入重大变化。在不破坏依赖关系树的情况下,我应该使用什么版本的`mocha`来逐步转换为`minimist`的安全版本?什么图算法可以解决这个问题?NPM如何解决依赖关系可能有点复杂,因为它们可以“拆分”依赖关系树。这意味着它们可以有多个版本的依赖项,以确保我们始终有一个兼容的树。为了解决这个漏洞,我们需要通过更新所有可以渗透到minimist的根来确保minimist的所有实例都是安全的。用于解决该问题的算法称为“所有最大路径安全”。通过遍历依赖图并维护最大版本,同时在每个交叉点修剪该包的所有其他版本,我们可以创建依赖树的近似表示。如果近似是安全的,那意味着我们真正的树也是安全的!通过对“mocha”的所有潜在版本执行此算法,我们找到了修复此漏洞的最小升级。为了获得我们想要的算法速度,该团队必须构建一个自定义Neo4j程序,该程序可以在大约150毫秒内处理搜索深度为30+的100多个根版本。快速地?在这种情况下,我们不必搜索很远...因为`mocha`的7.1.1是安全的!这只是一个补丁更新,这意味着中断更改的风险非常低。对于不太复杂的情况(比如这个),“npmaudit”可以帮助您使用他们出色的“npmauditfix”命令。
