避免开源代码漏洞的4个最佳实践
公共存储库中的开源代码可能包含着恶意软件或⽆意的漏洞。以下是如何最好地发现和缓解潜在问题的⽅法。
今年对确保开源⽣态系统的完整性和安全性提出了更⼤的挑战。开源对开发者来说有⾮常⼤的好处,因为⼏乎任何⼈都可以免费地使⽤和定制它,并为社区做出贡献。这种能够确保更⼤透明度、安全性和促进开发⼈员跨项⽬协作的⽅式,也为对⼿从中获利铺平了道路。
作为⼀名安全研究⼈员,我在今年遇到并分析了700多个被植⼊了的RubyGems软件包,除了挖掘⽐特币之外没有任何其他⽤途。还有⼀个很受欢迎的例⼦是章鱼扫描仪,这是⼀种恶意软件,它已经悄悄地把它的触⾓注⼊到了⾄少26个GitHub项⽬当中。这些事件强调了这样⼀个事实,即任何对公众开放的系统也会对对⼿开放,并且容易被滥⽤。
上⾯的例⼦集中在恶意组件上⾯。那些没有被注意到的拥有安全漏洞的合法开源包呢?
⼀个易受攻击或恶意的软件包进⼊流⾏的存储库,并最终进⼊你的软件供应链,可能会对你的客户造成严重破坏。在npm、PyPI、NuGet和Fedora等流⾏的开源存储库中,已经检测到了脆弱的和恶意的组件。
“在过去的⼏年⾥,我们已经看到了在整个⽣态系统的开源包中所发现的所有漏洞,传统上,Node.js和Jav
a每年都显⽰出了最⼤数量的新漏洞,”Snyk开源安全报告2020的作者说。
该报告还表明,在软件开发过程早期实施的安全措施是2019年报告的新漏洞⽐2018年少的原因。“如果这⼀趋势持续下去,这可能是⼀个积极迹象,表明提⾼开源软件安全性的努⼒正在开始取得成效,”报告继续说道。
下⾯是⼀些提⾼开源代码安全性的最佳实践。
1.了解你的软件
Sonatype进⾏的2020年DevSecOps社区调查显⽰,⼤多数公司--即使是那些在其⼯作流程中内置了某种程度的DevSps 实践的公司,也缺乏对其软件应⽤程序所使⽤的所有开源组件以及应⽤于它们的漏洞的全⾯了解。
“当⼀个开放源代码的项⽬中发现⼀个漏洞时,你应该⽴即问两个问题:我们是否曾经使⽤过该开源组件,以及(如果是的话)它在哪⾥?”报告作者说。
Sonatype对5000多名开发⼈员的调查显⽰,只有45%拥有成熟DevOps实践的组织为其应⽤程序保留了完整的软件物料清单(SBOM)。“调查结果显⽰,在有‘不成熟实践’的组织中,多达74%的组织⽆法知道⼀个新披露的开源组件中的漏洞是否适⽤于他们的软件,”该报告说。这意味着那些拥有完整SBOM的不成
熟实践的组织将⽆法知道他们是否使⽤了易受攻击的开源代码,也不知道在他们的环境中哪⾥可以到新发布的漏洞。
考虑到每天在NVD、GitHub和其他托管⽹站上发布的⼤量漏洞,如果没有⼀些⾃动化的解决⽅案,开发者和安全专家将很难跟上这些数据。历史表明,⼤多数组织都是等到安全事件发⽣后才会加强他们的安全措施。然⽽,俗话说,⼀分预防胜于⼀分。
通过在软件开发⽣命周期中采⽤“左移”的⽅法,在早期实现的安全性可以获得⼗倍的回报,并提⾼开发⼈员的整体意识。
2.解决依赖性问题
Veracode的2020年软件安全状态报告强调了⼀个常见的软件安全问题。与开发⼈员本⾝不同,“相互关联的依赖关系”会间接地在应⽤程序中引⼊潜在的风险,这些风险可能会被⼤多数开发⼈员所忽略。“我们的数据显⽰,⼤多数有缺陷的库都间接地变成了代码。应⽤程序中有47%的缺陷库是可传递的--换句话说,它们不是由开发⼈员直接引⼊的,⽽是由某个库所引⼊的(42%是直接引⼊的,12%是两者兼⽽有之)。这意味着开发⼈员引⼊的代码会⽐他们预期的要多,⽽且往往是有缺陷的代码。”
然⽽,根据Veracode的说法,纠正这个问题似乎并不是⼀项重⼤的任务:“解决这些库中的安全缺陷通常
不是⼀项重要的⼯作。应⽤程序中⼤多数库所引⼊的缺陷(将近75%)都可以通过较⼩的版本更新来解决。通常不需要主要库的升级!这⼀数据表明,问题的关键在于发现和跟踪,⽽不是⼤规模的代码重构。”
数据表明,问题的关键在于发现和跟踪,⽽不是⼤规模的代码重构。”
3.⾃动进⾏代码扫描以查未知项
章鱼扫描事件和其他形式的开源⽣态系统的滥⽤,如typosquatting,已经促使像GitHub这样的库维护者必须强制对他们所托管的开源项⽬进⾏⾃动扫描。正如今年所报道的那样,GitHub现在已经集成了基于CodeQL的开源存储库的⾃动扫描。
GitHub⾼级产品经理Justin Hutchings告诉Register⽹站,“事实证明,这种能⼒在安全⽅⾯是⾮常有⽤的。⼤多数安全问题都只是错误的数据流或错误的数据使⽤。”开放源代码意味着什么
除了识别出隐藏的漏洞和bug之外,还可以定期扫描开放源码的项⽬,以寻出数据泄漏的迹象,⽐如贡献者⽆意中公开的私钥和凭证。从去年开始,⼀些供应商就已经在他们的产品中集成了⾃动扫描功能,以识别发布到合法开源存储库中的恶意软件。这些技术会将⾏为分析与机器学习相结合,以主动搜寻“假冒部件”。
独⽴开发⼈员在较⼩规模上发布的实验性开源扫描器(npm-scan)也出现了,可以使⽤启发式⽅法检测易受攻击的组件。
在组件进⼊供应链之前,使⽤⾃动化⼯具实现这种⼴泛的安全审计可以帮助增加开源⽣态系统中的信任度和完整性问题。
4.⼩⼼许可风险
使⽤开源软件的关键好处是它的许可证所提供的⾃由。如果你在开源包中发现了⼀个尚未修复的bug,你可以选择⾃⼰修复它,⽽不是等待供应商。你可以在你的项⽬中定制⼀个你认为合适的开源应⽤程序,并将定制的版本交付给你的客户。
但是,要了解使⽤开源组件可能产⽣的任何潜在的许可冲突,就可能需要更多的技巧了。Synopsys发布的2020年开源安全与风险分析报告指出:
当⼀个代码库包含开源组件,⽽其许可证可能与代码库的总体许可证发⽣冲突时,声明的许可证冲突就会出现。例如,GNU通⽤公共许可证v2.0(GPLv2)下的代码在编译成⼀个正常分布的商业软件时通常就会引起冲突问题。但对于被认为是软件即服务(SaaS)的软件来说,相同的代码就不是问题。”
对于在不同上下⽂中使⽤相同的开源应⽤程序的开发⼈员来说,这些相互冲突的术语可能会造成混淆。
除了漏洞和恶意组件之外,⼀些⾃动化解决⽅案还可以识别出⼤量的许可证和由它们所引起的潜在冲突。
Black Duck的⼀份报告发现,2019年审计的代码库中有67%包含有许可证冲突的组件。对于某些⾏业,如互联⽹和移动应⽤程序,这⼀⽐例还要⾼得多(93%)。“GPL是⽐较流⾏的开源许可之⼀,它的各种版本也可能会与代码库中的其他代码产⽣许可冲突。事实上,前10个有冲突的许可证中有5个就是GPL及其变体,”该报告称。
备注:⽂章分享⾃企业⽹D1Net,转载的⽬的在于信息的分享,如有侵权请删除。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论