• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

您的JavaScript开源软件包依赖项是否安全?

现代javascript开发人员喜欢 npm。GitHub 和 npm 注册表是开发人员查找特定包的首选位置。开源模块通过为开发人员提供可以在项目中重用的大量功能来提高生产力和效率。公平地说,如果没有这些开源软件包,今天的大多数框架都不会以目前的形式存在。

例如,一个成熟的企业级应用程序可能依赖于数百个甚至数千个包。通常的依赖包括直接依赖、开发依赖、捆绑依赖、生产依赖和可选依赖。这很棒,因为每个人都可以从开源生态系统中获得最大的收益。

然而,被忽视的因素之一是所涉及的风险量。尽管这些第三方模块在其领域特别有用但它们也会给您的应用程序带来一些安全风险。

开源库容易受到攻击吗?

OSS 依赖项确实容易受到攻击和破坏。让我们看几个例子: 

最近在一个名为 eslint-scope 的包中发现了一个漏洞,该包是几个流行的 JavaScript 包的依赖项,例如 babel-eslint 和 webpack软件包维护者的帐户被盗用,黑客在其中添加了一些恶意代码。幸运的是,有人很快发现了这个漏洞,据报道损害仅限于少数用户。 

Moment.js 是 javaScript 中最常用的解析和显示日期的库之一,最近被发现存在严重性评分为 7.5的漏洞。该漏洞使其容易受到 ReDoS 攻击。补丁很快发布,他们能够很快解决问题。

但这还不是全部。每周都会挖掘出许多新的漏洞。其中一些会向公众披露,而另一些则仅在严重违规后才成为头条新闻。 

那么我们如何降低这些风险呢?在本文中,我将解释一些可用于保护开源依赖项的行业标准最佳实践。

1.跟踪您的应用程序的依赖关系

从逻辑上讲,随着依赖项数量的增加,最终获得易受攻击的包的风险也会增加。这同样适用于直接和间接依赖。尽管没有理由停止使用开源包,但跟踪它们始终是一个好主意。

这些依赖项很容易被发现,并且可以像npm ls 在应用程序的根目录中运行一样简单。您可以使用–prod 显示所有生产依赖项的–long 参数和每个包描述摘要的参数。 

此外,您可以使用服务来自动化依赖管理流程,为您的依赖提供实时监控和自动更新测试。一些熟悉的工具包括GreenKeeperLibraries.io等。这些工具整理您当前使用的依赖项列表并跟踪有关它们的相关信息。

2.摆脱你不需要的包

随着时间的推移和代码的变化,您可能会完全停止使用某些包,而是添加新的包。但是,开发人员倾向于不删除旧包。

随着时间的推移,您的项目可能会积累大量未使用的依赖项。尽管这不是直接的安全风险,但这些依赖项几乎肯定会增加项目的攻击面并导致代码中不必要的混乱。攻击者可能能够通过加载具有较高漏洞商的旧但已安装的软件包来找到漏洞,从而增加它可能造成的潜在损害。

你如何检查这些未使用的依赖项?您可以在 depcheck 工具的帮助下完成此操作。Depcheck 扫描您的整个代码requiresimport 命令。然后,它将这些命令与已安装的包或package.json中提到的包相关联,并为您提供报告。该命令还可以使用不同的命令标志进行修改,从而更简单地自动检查未使用的依赖项。

使用以下命令安装 depcheck:

npm install -g depcheck

3. 查找并修复关键的安全漏洞

上面讨论的几乎所有要点都主要与您可能遇到的潜在问题有关。但是您现在使用的依赖项呢?

根据最近的一项研究,几乎15% 的当前软件包在组件或依赖项中都包含已知漏洞。但是,好消息是,您可以使用许多工具来分析代码并在项目中发现开源安全风险。

最方便的工具是 npm 的npm auditaudit 是随 npm 的第 6 版发布的脚本node Security Platform 最初开发了 npm audit,后来 npm registry 获得了它。如果你想知道 npm audit 是什么,这里引用官方博客的一段话:

安全审计是对安全漏洞的包依赖关系的评估。安全审核通过使您能够查找和修复依赖项中的已知漏洞来帮助您保护包的用户。npm audit 命令将包中配置的依赖项的描述提交到默认注册表,并要求报告已知漏洞。 

生成的报告通常包含以下详细信息:受影响的包名称、漏洞严重性和描述、路径和其他信息,以及应用补丁解决漏洞的命令(如果有)。您甚至可以通过运行以 JSON 格式获取审计报告 npm audit --json

除此之外,npm 还提供有关如何根据报告采取行动的帮助。您可以使用它npm audit fix来修复已经发现的问题。这些修复通常使用引导式升级或通过开源补丁来完成。 

请随意参考npm 的文档以获取更多信息。

4.用内部替代品 替换过期的图书馆 

开源安全的概念在很大程度上依赖于注视那个特定库的眼睛的数量。积极使用的软件包受到更密切的关注。因此,开发人员很有可能已经解决了该特定包中的所有已知安全问题。 

让我们举个例子。在 GitHub 上,您可以将许多 JSON Web 令牌实现与您的 Node.js 库一起使用。但是,那些未在积极开发中的可能存在严重漏洞。Auth0 报告的一个这样的漏洞允许任何人使用他们想要的任何有效负载创建自己的“签名”令牌。 

如果一个相当流行或使用良好的软件包有这个缺陷,那么开发人员发现并修补错误的几率会更高。但是一个不活跃/被放弃的项目呢?我们将在下一点讨论这个问题。

5.始终选择处于积极开发中的库

也许确定特定包活动的最快和最有效的方法是在 npm 上检查它的下载速率。你可以在 npm 的包页面的Stats 部分找到它。也可以使用npm stats api或通过浏览npm-stat.com上的历史统计数据自动提取这些数据。对于带有 GitHub 存储库的包,您应该查看提交历史记录、问题跟踪器以及库的任何相关拉取请求。

6.经常更新依赖

有许多错误,包括大量不断发现的安全错误,并且在大多数情况下会立即修补。仅在给定项目的最新分支/版本上修复最近报告的漏洞并不少见。

例如,让我们以 2016 年初在 H mac包 'hawk' 上报告的正则表达式拒绝服务 (ReDoS) 漏洞为例。 hawk 中的这个 bug 很快得到解决,但仅在最新的主要版本 4.x 中得到解决。像 3.x 这样的旧版本在很晚才被修补,尽管它们同样面临风险。 

因此,作为一般规则,如果您的依赖项使用最新的可用版本,则它们不太可能出现任何安全错误。 

确认您是否使用最新版本 的最简单方法是使用npm outdated 命令。此命令支持 -prod 忽略任何开发依赖项 --json并使自动化更简单的标志。

定期检查您使用的软件包以验证其修改日期。您可以通过两种方式执行此操作:通过 npm UI 或运行npm view <package> time.modified.

结论

保护您的应用程序的关键是从一开始就拥有安全第一的文化。在这篇文章中,我们介绍了一些提高 JavaScript 组件安全性的标准做法。 


文章目录
  • 开源库容易受到攻击吗?
  • 1.跟踪您的应用程序的依赖关系
  • 2.摆脱你不需要的包
  • 3. 查找并修复关键的安全漏洞
  • 4.用内部替代品 替换过期的图书馆
  • 5.始终选择处于积极开发中的库
  • 6.经常更新依赖
  • 结论