十、使用已知漏洞的组件
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 和 XML(AJAX)。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 应用中测试过时且易受攻击的第三方库:
-
Using your preferred browser, install the
Retire.js
browser extension. The steps to installRetire.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
并点击进入:图 10.1–Chrome Web Store 中的 Retire.js
c) 从搜索结果中选择
retire.js
。您现在将被重定向到Retire.js
扩展页面,在那里您可以安装扩展。点击添加到 Chrome按钮开始安装:图 10.2–Retire.js 扩展页面
d) 安装后,会弹出消息,通知您retire.js 已添加到 Chrome中:
图 10.3–Retire.js 成功安装
-
在开始练习文件夹中,通过键入以下命令启动 VS 代码:
cs code .
-
导航至菜单中的终端新终端,或在 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:
图 10.4–Retire.js 正在运行
retire.js
插件将显示一个弹出窗口,显示 CVE 信息。我们的网上银行解决方案使用的是jQuery version 3.4.1
,已知该漏洞具有中等严重性。*
- 打开浏览器并转到
*在此配方中,我们将使用库的最新版本修复易受攻击的第三方组件。
怎么做…
让我们来看看这个食谱的步骤:
-
在开始练习文件夹中,通过键入以下命令启动 VS 代码:
cs code .
-
Open
Pages\Shared\_Layout.cshtml
and notice the script tag referencing an externaljquery-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攻击)。
-
为了消除这种安全风险,我们将 jQuery 脚本引用更新为 jQuery 团队建议的最新版本,即升级到 3.5.0 版(或使用最新版本)。
- 在浏览器中,转至https://code.jquery.com/jquery/ 。
-
Scroll down until you find the latest version of jQuery Core (as of this writing, it is jQuery Core 3.6.0):
图 10.5–jQuery CDN 参考
-
点击缩小链接,显示 jQuery 3.6.0 缩小版的代码集成弹出窗口,然后点击复制到剪贴板图标,将整个脚本标记引用复制到 jQuery CDN。
-
一旦我们有了对 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并查看结果:
图 10.6-未发现任何漏洞
请注意,Retire.js
插件不再显示页面易受攻击。
它是如何工作的…
Retire.js
是一个有用的免费开源浏览器插件,它可以扫描网页以查找易受攻击的 JavaScript 库。Retire.js
对页面中加载的资源执行被动扫描,并基于统一资源定位器(URL)、文件名、文件内容或哈希识别易受攻击的 JavaScript 库。
我们安装此浏览器加载项是为了识别我们的贷款页面易受基于CVE-2020-11022
的 XSS 攻击。我们通过将 jQuery 库更新到最新版本来弥补 XSS 被利用的风险。
还有更多…
让我们使用Retire.js
浏览器插件发现并修复另一个漏洞:
- 打开
\Chapter10\jquery2\before\OnlineBankingApp\
处的样本OnlineBankingApp
文件夹。 -
导航至菜单中的终端新终端,或在 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 theRetire.js
icon and the extension will display a pop-up window that shows the vulnerability information:
图 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
, andCVE-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:
图 10.8–另存为文件
- The rendered page displays the same information as what is shown in the browser add-on:
图 10.9–保存的报告
为了解决这个安全问题,我们还需要通过更新 CDN 引用升级到 jQuery 的最新版本。
- 打开
Pages\Shared\_Layout.cshtml
并注意引用外部jquery-3.0.0-rc1.js
JavaScript 文件的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>
在启用扩展时重建项目并再次加载页面后,加载项将显示未发现任何漏洞:*
- 打开浏览器并转到
*
图 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
漏洞扫描程序:
-
在开始练习文件夹中,通过键入以下命令启动 VS 代码:
cs code .
-
导航至菜单中的终端新终端,或在 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 软件包。
怎么做…
让我们来看看这个食谱的步骤。
-
在启动练习文件夹中,通过键入以下命令启动 VS 代码:
cs code .
-
Open
OnlineBankingApp.csproj
. Notice that one of the packages referenced is the vulnerable version ofSystem.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 包升级到最新版本。
-
导航至菜单中的终端新终端,或在 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
文件夹。
您可以执行此文件夹中的步骤来修复从不受信任的源托管的包的使用。
怎么做…
让我们来看看这个食谱的步骤:
-
在开始练习文件夹中,通过键入以下命令启动 VS 代码:
cs code .
-
Open
Pages\Loans\Index.cshtml
and examine thescript
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。
-
只需将协议从
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 secure(HTTPS的安全链接添加对 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 。****
版权属于:月萌API www.moonapi.com,转载请注明出处