Intro摘要:这次 .NET Conf China 我分享了一个关于 NuGet Audit 的一个话题 “NuGet Audit 让你的应用更安全” ,之所以分享这个话题,我们公司最近安全部门对我们的系统做安全审计以避免引入有漏洞的依赖来保证我们的系统安全性,而 NuGe
这次 .NET Conf China 我分享了一个关于 NuGet Audit 的一个话题 “NuGet Audit 让你的应用更安全” ,之所以分享这个话题,我们公司最近安全部门对我们的系统做安全审计以避免引入有漏洞的依赖来保证我们的系统安全性,而 NuGet Audit(审计)可以帮助我们更好地发现代码中有漏洞的依赖,所以想抛出这个话题希望也能对大家有所帮助
这次分享的内容大概分成四部分
什么是 NuGet Audit
为什么我们需要 NuGet Audit
如何使用配置 NuGet Audit
NuGet Audit 后面的一些计划
What首先我们来看一下什么是 NuGet Audit,在升级到 .NET 8/9 之后,如果你的项目有一些老的 NuGet 包没有升级可能会看到类似下面这样的警告
这里我截了两个 VS 里的截图,中间这个是使用 dotnet-cli 还原 NuGet 包时出现的警告,这个表示引用的 NuGet 包有安全漏洞,可能要升级到新的版本解决。
从下面的两个警告信息里可以看到这里有一个 Github 的链接,这个链接打开之后是 GitHub 安全专家们建立的一个安全建议数据库,NuGet Audit 警告信息就是基于 GitHub 的已经经过审核之后的安全建议数据来触发警告的,使用 GitHub 比较多的朋友可能会注意到 Github 有一个 Dependabot 它也是基于这个数据库对用户开源项目提醒安全漏洞风险的。
那为什么我们需要这个功能呢?为什么会引入这个功能呢?用一个词来总结就是安全 Security。
在企业运营的过程中会有供应链的概念,产品从一个个零件到加工运输到最后交付到客户手上。
在软件系统中也会有一个软件供应链的概念,一个开源项目可能会被打包分发到世界各地的各个系统中,如果这个开源项目依赖有漏洞那么就会导致很多系统都有安全风险
现在有一个词比较流行,这个词就是 “左移” 是什么意思呢,就是说在软件工程和 IT 管理里,要在流程时间线的早期解决任务和问题。看这个图可以看出来源代码和依赖出于最左侧,也就意味着我们注重安全的话应该更加注意这一环节,从源头避免安全漏洞的引入。
对于安全团队来说,从新建项目开始到编写第一行代码开发测试到部署到项目上线运作每个环节都有安全风险,所以我们开发者所在的第一个环节更要注重安全的问题。
在我们的项目相信也肯定会有一些开源项目的依赖,如何能够及时发现系统中的依赖是否有安全漏洞呢?NuGet Audit 就是帮助我们发现安全风险的,我们在还原项目依赖的时候就会可以触发 NuGet Audit 的检查
前两年有一个比较出名的漏洞问题就是 JAVA 里的 log4j 的漏洞,是一个典型的软件供应链安全的例子
因为被使用的比较广泛,之前热议全球,我们公司的安全团队之前也曾要求我们公司检查所有的 JAVA 应用是否有使用 log4j,不知道大家公司有没有 JAVA 应用,有没有受到影响,还是 dotnet 清真哈
.NET 8 引入了 NuGet 审计的支持,.NET 9 引入了更多配置的支持,之后的 .NET 10 中也还会再继续在 NuGet 的审计上投入
今天我们演示的示例是基于 .NET 9 的毕竟我们 .NET 9 已经发布了一个月了,也鼓励大家有条件的话升级到 .NET 9
默认审计的信息是警告,我们能不能让他变成错误呢,而不是 warning 因为有些朋友不会注意警告,直接变成错误来就能引起大家的注意了,我们可以借助 MSBuild 的特性来将警告信息变成错误,这里展示了两种方式
WarningsAsErrors第二种方式是设置TreatWarningsAsErrors=true这种方式会将所有的警告都视为警告,对于项目有质量要求的项目推荐设置,对于某些不想 warning 的可以设置NoWarn如果我们自己的私有 NuGet package 源也支持 Audit,也可以配置在 nuget.config 的 Audit Source 里
最后我们来一些 NuGet Audit 接下来的一些计划和功能
NuGet 团队准备支持一个命令来修复项目中的安全漏洞,从开始 Github 漏洞的界面可以看到是有修复版本的信息的,是有可能自动升级到没有漏洞版本的,这样有多个安全风险的话我们就不用一个一个检查一个个升级了,期待!
前面我们提到了可以配置 audit source,后面也将会支持基于本地文件的 audit source,感觉主要是为了本地 folder nuget source 吧
另外在安装一个有安全漏洞的 nuget 依赖时后面也会发出警告,你正在安装一个有漏洞的包版本,避免引入不安全的依赖
最后再提一个 SBOM 的支持,SBOM 全称是 Software Bill of Materials 软件物质清单,会生成一个依赖清单,帮助安全团队更好的理解和审计依赖,在打包 nuget package 的时候可以生成一个依赖清单在 nuget package 里,目前 SDK 层面还不支持,可以单独引用Microsoft.Sbom.Targets可以参考:https://github.com/WeihanLi/SamplesInPractice/blob/main/NuGetSamples/NuGetSamples.csprojMore信息安全审计(英语:Information security audit)是对组织的信息安全水平进行审计的过程,其工作主要是对系统活动纪录和相关系统文件的独立审查。信息安全审核的目的在于提高系统信息安全水平,避免存在风险的系统设计,并优化安全措施和安全流程的效率。
信息安全审计的范围十分广泛,其目的亦可根据企业在不同阶段的发展目标而存在不同的侧重点,在以下领域均可进行开展:
信息安全管理组织与制度;
访问控制管理;
网络安全、漏洞扫描、渗透测试、代码安全扫描、机房及设备物理安全、应用系统安全、信息系统日志管理、加密传输和加密设备管理、补丁管理、IT 项目开发管理;
隐私数据安全、数据库和操作系统安全、信息资产分级和管理、数据资产全生命周期管理评估、信息安全事件管理、业务连续性;
人力安全、IT 外包安全管理、信息安全意识教育
软件包管理器如 NuGet 的安全审计是一个涉及分析软件项目中包含的软件包安全性的过程。这包括识别漏洞、评估风险和提出改进安全性的建议。审计可以包括对软件包本身的审查,以及任何依赖及其相关风险。审计的目标是识别和减轻任何可能被攻击者利用的安全漏洞,例如代码注入或跨站脚本攻击。
第三方或开源依赖项中可能存在的漏洞可能是您无法像您编写的代码那样严格控制的依赖项,这可能会在供应链中造成潜在的安全风险。
如果这些依赖项之一存在漏洞,那么就有可能存在漏洞。这可能很可怕,因为依赖项之一可能会在我们不知情的情况下发生变化。即使现在依赖项中存在漏洞,但无法利用,将来也可以利用。
最后有一些更多 NuGet Audit 相关内容的参考链接分享给大家,谢谢对大家有所帮助
Referenceshttps://github.com/advisories?query=type:reviewed+ecosystem:nuget
https://www.youtube.com/watch?v=Nw9ouFSiMjk
https://github.com/NuGet/Home/issues?q=is:open+is:issue+label:Area:NuGetAudit
来源:opendotnet