十、使用已知漏洞的组件

ASP.NET Core web 开发人员依靠第三方商业和开源框架、库和包来构建 web 应用。这种方法加快了开发时间,以支持快速的业务需求。虽然这为开发人员节省了大量时间,但使用外部开发的组件存在风险。这些库中的代码安全性通常得不到保证,而且与其他任何软件一样,都会存在安全缺陷。有必要进行软件组成分析SCA),以确定您的 ASP.NET Core web 应用是否使用了过时且易受攻击的软件包。

在本章中,我们将介绍以下配方:

  • 修复易受攻击的第三方 JavaScript 库的使用
  • 修复易受攻击的NuGet包的使用
  • 修复从不受信任的源托管的库的使用

在本章结束时,您将学习如何使用浏览器加载项和命令行工具查找易受攻击的库版本,如何将框架更新为更安全的NuGet包版本,如何确定不受信任的源是什么,以及如何采取步骤补救这些源在代码中引入的风险。

技术要求

这本书是为配合 VisualStudio 代码、Git 和.NET5.0 而编写和设计的。ASP.NET Core Razor 页面中提供了配方中的代码示例。示例解决方案还使用 SQLite 作为数据库引擎,以简化设置。本章的完整代码示例可在上找到 https://github.com/PacktPublishing/ASP.NET-Core-Secure-Coding-Cookbook/tree/main/Chapter10

修复易受攻击的第三方 JavaScript 库的使用

Web 开发离不开 JavaScript 库,因为它们帮助开发人员执行文档对象模型DOM)操作并在网页中处理异步 JavaScript 和 XMLAJAX)。jQuery 就是这样一个库。尽管 jQuery JavaScript 库的效率很高,但与以前版本的 jQuery 库相关联的还有许多常见漏洞和暴露CVEs。CVE 是公开的漏洞,详细说明了特定软件或组件的弱点。让我们看看如何使用浏览器扩展来发现易受攻击的 jQuery 版本。

准备好了吗

对于本章中的食谱,我们需要一个在线银行应用示例。

打开命令 shell 并通过克隆ASP.NET-Core-Secure-Coding-Cookbook存储库下载示例网银应用,如下所示:

git clone https://github.com/PacktPublishing/ASP.NET-Core-Secure-Coding-Cookbook.git

运行示例应用以验证没有生成或编译错误。在命令 shell 中,导航到位于\Chapter10\vulnerable-jquery1\before\OnlineBankingApp的示例应用文件夹,并运行以下命令:

dotnet build

dotnet build命令将构建示例OnlineBankingApp项目及其依赖项。

测试过时且易受攻击的第三方库

要确定应用是否使用易受攻击的 JavaScript 组件,我们可以使用Retire.js等工具。以下步骤将指导我们如何安装Retire.js并使用它在我们的示例网上银行 web 应用中测试过时且易受攻击的第三方库:

  1. Using your preferred browser, install the Retire.js browser extension. The steps to install Retire.js are more or less the same for most browsers.

    a) 使用 Chrome,在地址栏中键入以下内容以打开Chrome 网络商店

    https://chrome.google.com/webstore/category/extensions?hl=en-US&authuser=1

    b) 一旦Chrome 网络商店加载,您将在页面左侧看到一个搜索栏。键入Retire.js并点击进入

    Figure 10.1 – Retire.js in Chrome Web Store

    图 10.1–Chrome Web Store 中的 Retire.js

    c) 从搜索结果中选择retire.js。您现在将被重定向到Retire.js扩展页面,在那里您可以安装扩展。点击添加到 Chrome按钮开始安装:

    Figure 10.2 – Retire.js extensions page

    图 10.2–Retire.js 扩展页面

    d) 安装后,会弹出消息,通知您retire.js 已添加到 Chrome中:

    Figure 10.3 – Retire.js successful installation

    图 10.3–Retire.js 成功安装

  2. 在开始练习文件夹中,通过键入以下命令启动 VS 代码:

    cs code .

  3. 导航至菜单中的终端新终端,或在 VS 代码中按Ctrl+Shift+即可。 ** 在终端中键入以下命令以构建并运行示例应用:

    cs dotnet run

    • 打开浏览器并转到https://localhost:5001/Loans。* Log in using the following credentials:

    a) 电邮:stanley.s.jobson@lobortis.ca

    b) 密码:rUj5jtV8jrTyHnx!

    • 一旦认证,您将被重定向到贷款页面。 Notice that the retire.js plugin is loaded in the toolbar and is marked with a red exclamation point*. Clicking it will show you details of the warning:

    Figure 10.4 – Retire.js in

    图 10.4–Retire.js 正在运行

    • retire.js插件将显示一个弹出窗口,显示 CVE 信息。我们的网上银行解决方案使用的是jQuery version 3.4.1,已知该漏洞具有中等严重性。*

*在此配方中,我们将使用库的最新版本修复易受攻击的第三方组件。

怎么做…

让我们来看看这个食谱的步骤:

  1. 在开始练习文件夹中,通过键入以下命令启动 VS 代码:

    cs code .

  2. Open Pages\Shared\_Layout.cshtml and notice the script tag referencing an external jquery-3.4.1.min.js JavaScript file:

    cs <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>

    此 jQuery 版本易受跨站点脚本XSS攻击)。

  3. 为了消除这种安全风险,我们将 jQuery 脚本引用更新为 jQuery 团队建议的最新版本,即升级到 3.5.0 版(或使用最新版本)。

  4. 在浏览器中,转至https://code.jquery.com/jquery/
  5. Scroll down until you find the latest version of jQuery Core (as of this writing, it is jQuery Core 3.6.0):

    Figure 10.5 – jQuery CDN references

    图 10.5–jQuery CDN 参考

  6. 点击缩小链接,显示 jQuery 3.6.0 缩小版的代码集成弹出窗口,然后点击复制到剪贴板图标,将整个脚本标记引用复制到 jQuery CDN。

  7. 一旦我们有了对 jQuery 最新版本的 CDN 脚本引用,我们就通过替换整个易受攻击的脚本元素

    cs <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>

    来更新我们的_Layout.html文件 8. 要测试代码修复是否有效,请重复测试过期易受攻击的第三方库部分中的步骤 3-9并查看结果:

Figure 10.6 – No vulnerability found

图 10.6-未发现任何漏洞

请注意,Retire.js插件不再显示页面易受攻击。

它是如何工作的…

Retire.js是一个有用的免费开源浏览器插件,它可以扫描网页以查找易受攻击的 JavaScript 库。Retire.js对页面中加载的资源执行被动扫描,并基于统一资源定位器URL)、文件名、文件内容或哈希识别易受攻击的 JavaScript 库。

我们安装此浏览器加载项是为了识别我们的贷款页面易受基于CVE-2020-11022的 XSS 攻击。我们通过将 jQuery 库更新到最新版本来弥补 XSS 被利用的风险。

还有更多…

让我们使用Retire.js浏览器插件发现并修复另一个漏洞:

  1. 打开\Chapter10\jquery2\before\OnlineBankingApp\处的样本OnlineBankingApp文件夹。
  2. 导航至菜单中的终端新终端,或在 VS 代码中按Ctrl+Shift+即可。 ** 在终端中键入以下命令以构建并运行示例应用:

    cs dotnet run

    • 打开浏览器并转到https://localhost:5001/Loans。* Log in using the following credentials:

    a) 电邮:axl.l.torvalds@ut.net

    b) 密码:6GKqqtQQTii92ke!

    • 一旦认证,您将被重定向到贷款页面。 请注意,Retire.js浏览器加载项的图标在工具栏中有一个感叹号。 Click the Retire.js icon and the extension will display a pop-up window that shows the vulnerability information:

    Figure 10.7 – Scan result

    图 10.7–扫描结果

    附加组件表示在 jQuery 库中至少发现了四个中度严重性的 CVE。

    • Click one of the hyperlinks beside each CVE to see details of the vulnerabilities. One of the items in the list shows that the page has a vulnerable jQuery version based on CVE-2015-9251, CVE-2019-11358, CVE-2020-11022, and CVE-2020-11023, all of which are XSS vulnerabilities.

    提示

    您的应用可能受 CVE 的直接影响,也可能不受 CVE 的直接影响。例如,2019-11358影响 Drupal 和内容管理系统CMSes)。但是,即使您的 ASP.NET Core web 应用没有受到直接影响,纠正风险仍然是一个好主意。

    • You can hit the Save button to save the information into a page. A window will appear, asking if you want to view it in a browser:

    Figure 10.8 – Saving as a file

    图 10.8–另存为文件

    • The rendered page displays the same information as what is shown in the browser add-on:

    Figure 10.9 – Saved report

    图 10.9–保存的报告

    为了解决这个安全问题,我们还需要通过更新 CDN 引用升级到 jQuery 的最新版本。

    • 打开Pages\Shared\_Layout.cshtml并注意引用外部jquery-3.0.0-rc1.jsJavaScript 文件的script标记:

    cs <script src="https://code.jquery.com/jquery-3.0.0-rc1.js"></script>

    • 重复本配方如何做部分的步骤 4-6。* Replace the reference to jquery-3.0.0-rc1.js with the content from the clipboard:

    cs <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="~/js/site.js" asp-append-version="true"></script>

    在启用扩展时重建项目并再次加载页面后,加载项将显示未发现任何漏洞:*

*Figure 10.10 – No vulnerabilities found

图 10.10–未发现任何漏洞

笔记

与任何软件一样,浏览器扩展也可能存在漏洞。使用浏览器加载项时要小心,并随时了解其最新版本和更新。

另见

您可以利用国家标准与技术研究所的NIST 的国家漏洞数据库NVD)数据源和应用编程接口API)。

NVD 保存所有已知漏洞的数据集合。其 API 的文档可在以下链接中找到:https://nvd.nist.gov/vuln/data-feeds#APIS

修复易受攻击的 NuGet 软件包的使用

库和组件可以从软件包管理器安装和使用,例如NuGet.VS Code 具有本机支持,这简化了 ASP.NET Core web 开发人员的安装过程。这样一来,它很快就引入了安装和使用易受攻击的NuGet 软件包的风险。

准备好了吗

我们将使用上一个配方中使用的网上银行应用。使用 VS 代码打开\Chapter10\vulnerable-package\before\OnlineBankingApp\处的样本OnlineBankingApp文件夹。

让我们看看如何使用工具在我们的应用中发现易受攻击的NuGet软件包。

测试易受攻击的 NuGet 软件包

要确定您的应用是否使用易受攻击的 NuGet 软件包,我们可以使用另一个工具,如Dotnet Retire。首先,我们在我们的示例网上银行应用中安装dotnet retire漏洞扫描程序:

  1. 在开始练习文件夹中,通过键入以下命令启动 VS 代码:

    cs code .

  2. 导航至菜单中的终端新终端,或在 VS 代码中按Ctrl+Shift+即可。 ** Type the following command in the terminal to install dotnet-retire:

    cs dotnet tool install -g dotnet-retire

    成功安装后,您将看到以下消息:

    cs You can invoke the tool using the following command: dotnet-retire Tool 'dotnet-retire' (version '5.0.0') was successfully installed.

    • Next, execute the tool by typing the following command:

    cs dotnet-retire

    请注意扫描的结果:

    cs info: RetireNet.Packages.Tool.Services.RetireLogger[0] Scan starting info: RetireNet.Packages.Tool.Services.RetireLogger[0] Analyzing 'OnlineBankingApp' fail: RetireNet.Packages.Tool.Services.RetireLogger[0] Found use of 1 vulnerable libs in 2 dependency paths. * Microsoft Security Advisory 4021279: Vulnerabilities in.NET Core, ASP.NET Core Could Allow Elevation of Privilege in System.Net.Http/4.3.1 https://github.com/dotnet/corefx/issues/19535 info: RetireNet.Packages.Tool.Services.RetireLogger[0] Scan complete.

    扫描结果表明存在一个易受攻击的库,即System.Net.Http包的version 4.3.1。*

*您可以执行此文件夹中的步骤来修复易受攻击的 NuGet 软件包。

怎么做…

让我们来看看这个食谱的步骤。

  1. 在启动练习文件夹中,通过键入以下命令启动 VS 代码:

    cs code .

  2. Open OnlineBankingApp.csproj. Notice that one of the packages referenced is the vulnerable version of System.Net.Http:

    cs <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="5.0.0" /> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.1" /> <PackageReference Include="SendGrid" Version="9.22.0" /> <PackageReference Include="System.Net.Http" Version="4.3.1" /> <PackageReference Include="System.Text.Encodings.Web" Version="5.0.1" />

    为了修复此安全漏洞,我们将 NuGet 包升级到最新版本。

  3. 导航至菜单中的终端新终端,或在 VS 代码中按Ctrl+Shift+即可。 ** 在终端中键入以下命令以安装最新版本的System.Net.Http软件包:

    cs dotnet add package System.Net.Http

    • 安装成功后,您会看到版本在OnlineBankingApp.csproj

    cs <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="5.0.0" /> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.1" /> <PackageReference Include="SendGrid" Version="9.22.0" /> <PackageReference Include="System.Net.Http" Version="4.3.4" /> <PackageReference Include="System.Text.Encodings.Web" Version="5.0.1" />

    中更新dotnet add package命令中省略--version-v将安装最新的 NuGet 软件包。 To test if the code fix worked, repeat Step 4 in the Testing vulnerable NuGet packages section and see the result:

    cs info: RetireNet.Packages.Tool.Services.RetireLogger[0] Scan starting info: RetireNet.Packages.Tool.Services.RetireLogger[0] Analyzing 'OnlineBankingApp' info: RetireNet.Packages.Tool.Services.RetireLogger[0] Found no usages of vulnerable libs! info: RetireNet.Packages.Tool.Services.RetireLogger[0] Scan complete.

    观察结果。 dotnet retire工具未发现任何易受攻击的软件包。*

*## 它是如何工作的…

dotnet retire是一个命令行工具,帮助开发人员理解 ASP.NET Core 应用的依赖关系。这些依赖项通常都有我们都应该知道的漏洞,因此有必要执行安全扫描。

dotnet retire中的安全扫描搜索引用的易受攻击的 NuGet 库,以防止我们的示例网上银行 web 应用被公开的漏洞利用。

修复从不可信源托管的库的使用

我们使用的库和组件的来源必须来自安全可信来源。这些库的主机大部分时间托管在 CDN 中,也可能受到攻击和滥用。

准备好了吗

我们将使用上一个配方中使用的网上银行应用。使用 VS 代码打开\Chapter10\untrusted-source\before\OnlineBankingApp\处的样本OnlineBankingApp文件夹。

您可以执行此文件夹中的步骤来修复从不受信任的源托管的包的使用。

怎么做…

让我们来看看这个食谱的步骤:

  1. 在开始练习文件夹中,通过键入以下命令启动 VS 代码:

    cs code .

  2. Open Pages\Loans\Index.cshtml and examine the script reference below the markup:

    cs <script src="http://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> <script src="~/lib/bootstrap/dist/js /bootstrap.bundle.min.js"></script> <script src="~/js/site.js" asp-append-version="true"></script>

    注意,虽然 jQuery 版本是最新版本,但协议是超文本传输协议HTTP

  3. 只需将协议从http更改为https

    cs <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> <script src="~/lib/bootstrap/dist/js /bootstrap.bundle.min.js"></script> <script src="~/js/site.js" asp-append-version="true"></script>

将协议从http更改为https可以确保对 CDN 中 JavaScript 库的引用是安全的,并且不会出现不安全传输带来的弱点。

提示

除了通过不安全的 HTTP 提供资源的主机之外,我们还必须注意利用托管在隐蔽和鲜为人知的域中的 JavaScript 库。

它是如何工作的…

ASP.NET Core web 开发人员必须确保库来自正确的来源,在我们的案例中,我们使用的是来自code.jquery.com的官方 CDN,该 CDN 是可信的。开发人员还必须通过与HTTP secureHTTPS的安全链接添加对 jQuery 库(或任何 JavaScript 库)的引用:

https://code.jquery.com/jquery-3.6.0.min.js

还有更多…

还有主机和 CDN 被破坏的风险,因此为了验证资源的完整性,开发人员必须使用子资源完整性SRI安全功能。浏览器中的 SRI 为 ASP.NET Core web 应用获取的资源提供完整性检查。它允许开发人员根据 web 应用试图从主机获取的资源的哈希值,传递从原始且未经缓冲的资源生成的哈希值:

<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej /m4=" crossorigin="anonymous"></script>

大多数 CDN 为您提供散列,但您可以使用命令行工具生成自己的散列,也可以通过在线工具生成散列,如SRI 散列生成器https://www.srihash.org/ )。

要了解更多有关 SRI 的详细信息,请阅读有关 SRI 的Mozilla 开发者网络MDN)文档,可在找到 https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity 。****