开源软件漏洞安全风险分析-程序员宅基地

技术标签: 区块链  安全  安全漏洞  编程语言  微软  

 聚焦源代码安全,网罗国内外最新资讯!

作者:冯兆文、刘振慧 / 西北工业大学、中国航空工业发展研究中心

一、引言

2020年2月,国家信息安全漏洞共享平台(CNVD ) 发布了关于Apache Tomcat 存在文件包含漏洞的公告,该漏洞可以造成Tomcat上所有webapp目录下的重要配置文件或源代码等敏感数据的泄露,若同时存在文件上传功能,则可以进一步实现远程代码执行(RCE),直接控制服务器。

Tomcat是Apache软件基金会下的一个重要的开源软件,在全球范围内被广泛使用,根据FOFA系统最新的测绘数据显示全球范围内有将近300万个Tomcat服务对外开放,根据腾讯T-Sec系统提供的数据显示,国内受影响的采用AJP协议的IP数量约是4万个。近年来,随着软件开源化趋势成为主流,开源软件已经成为软件供应链的重要环节,是软件生态不可或缺的组成部分。然而,一旦具有大规模用户基础的开源软件存在安全漏洞,势必会影响整个软件行业的安全。

二、开源软件认识误区

(一)开源软件等于免费软件

开源软件指源代码可以被公众使用的软件,源代码公开是开源软件的主要特点之一。虽然大部分的开源软件可以免费获得,但是开源软件并不全是免费软件,仍有大量的开源软件对用户是收费的。

开源软件要求软件发行时附带源代码,但并不意味着它就一定是免费的;同样免费软件也只是软件免费提供给用户使用,但并不一定是开源的。

(二)开源软件可以随便使用

每一个开源软件都需要包含开源许可证去规定开源软件的使用范围和权利义务,开源软件并非完全没有限制可以随意使用,其最基本的限制就是开源软件强制任何使用和修改该软件的人承认发起人的著作权和所有参与人的贡献。

开源软件的许可证比较繁多而且复杂,经常遇到的开源许可证主要有GPL和BSD两种。如果不恰当地使用开源软件,未能充分理解和研究许可证规定的权利和义务,往往会埋下知识产权的风险隐患,甚至会被强制要求公开自家产品的私有代码。

(三)开源软件比闭源软件安全

开源不能作为判定软件产品安全与否的指标,开源并不意味着一定安全。事实上,近年来开源软件的安全性事件频发,也打破了人们传统观念中的“开源等于安全”的认知。根据Snyk公司发布的《2019 年开源安全现状调查报告》显示,“过去两年内应用程序的漏洞数量增长了88%,仅2018年包管理器(NPM )的漏洞数量就增长了47%”。

开源软件具有开放、共同参与、自由传播等特性,一方面由于开发者自身安全意识和技术水平不足容易产生软件漏洞,另一方面也无法避免恶意人员向开源软件注入木马程序进行软件供应链攻击等安全风险引入行为。

三、开源软件使用现状

(一)绕不开、躲不掉的软件开源趋势

当前,软件代码全部自行开发的公司几乎没有,大量企业通过使用免费的开源软件创建商用软件产品。根据安全与能力管理开源平台White Source发布的《开源漏洞管理现状》,只有极少数开发人员由于公司的政策要求而没有使用开源软件,96.8%的开发人员依赖于开源软件。用户往往以为自己购买的是商业软件,但实际上很多商业软件是基于开源做二次开发后以闭源形式提供给用户的。

另据Gartner的调查显示,99%的组织在其信息系统中使用了开源软件,如图1所示。Sonatype公司对3000家企业的开源软件使用情况展开过调查,结果表明每年每家企业平均下载5000多个开源软件。随着开源技术快速形成生态,企业用户引入开源软件已成大势所趋,绕不开、躲不掉。

图1 开源组件的使用频率

(二)难以分辨商业产品中的开源成分

从软件产品的使用者角度来看,企业购买的很多商业软件往往是开源软件的商业版或者发行版。如果用户没有明确地提出要求,商业软件供应商一般不会说明其产品中是否涉及开源组件,甚至对用户宣称是完全自主研发,导致用户的信息系统中被动地引入了开源软件。例如,号称自主开发的某某浏览器,经过专业测试后却发现其内核是开源软件Chrome。

从软件产品供应商的角度来看,当前的软件开发模式中包管理器替程序员做了很多他并没有意识到的决定,使得商业软件中引入开源软件的数量难以做到完全准确的统计。更有甚者,部分企业在软件开发过程中,对开源软件的使用比较随意,管理者常常不清楚自己的团队在开发过程中使用了哪些开源软件,就连程序员自己也无法完整地列出开源软件使用清单。等到商业软件流转到用户手中后,系统的运维人员更是无法完全知晓正在运行的软件产品中是否包含了开源软件,包含了哪些开源软件,这些开源软件是否存在安全漏洞等,这就无形中给企业的信息系统带去了安全风险。

(三)谁该站岀来为开源软件安全负责

随着大型软件开发过程中,开源组件的占比越来越高,加之软件开发人员往往只关注自己开发的那部分代码的安全性,忽视了采用的开源组件的安全质量,最终导致成型软件产品的系统安全问题越来越多。根据Snyk公司2019年的调查报告,81 %的用户认为开发者应负责开源软件的安全性,如图2所示。

图2 开发者该为开源软件安全负责

大部分开源软件的使用者认为软件代码经过了很多机构和人员的测试和审查。然而,现实情况是并没有多少人对开源软件的代码安全进行测试,“心脏滴血”漏洞就是最好的例证。软件供应商对外售卖的商业软件中采用了开源软件,但安全责任并未从开源代码提供者转移到软件供应商,导致最终还是由用户承担了软件漏洞的风险。

四、开源软件漏洞安全分析

由于开源软件使用与获取的便利性,加之部分软件开发人员的安全意识淡薄,可能导致忽略开源软件带来的风险。总体来看,开源软件存在的安全问题比较严重,安全漏洞是主要的问题,软件供应链攻击呈现上升趋势,同时缺少系统的安全审查机制。

(一)开源项目维护者的安全意识和技术能力参差不齐

Snyk公司通过扫描数以百万计的Github代码库和程序包和对超过500个开源项目的维护者进行调查发现:只有8% 的开源项目维护者自认为有较高的信息安全技术,接近半数的开源项目维护者从来不审计代码,只有11%的维护者能做到每季度审核代码。另据Linux基金会发布的《开源软件供应链安全报告》显示,大量开发人员在开发软件时并未遵守应用程序安全最佳实践。开源项目维护者对代码安全质量重视不够和技术能力水平不足,是当前造成开源软件安全漏洞的主要原因。

奇安信代码安全实验室发起“开源项目检测计划”,通过对3000余款使用比较广泛的开源项目进行检测,发现所有检测项目的总体平均缺陷密度为14.22/ KLOC,高危缺陷密度为0.72/KLOC。路径遍历、空指针相关、密码管理、跨站脚本XSS、注入类缺陷、XML外部实体注入、缓冲区溢出、资源管理、HTTP响应截断、日志伪造等是开源软件主要的安全风险。

2019年,Unit42安全团队分析了 24000多个公开的GitHub开源项目,共识别出2328个硬编码密码,2464个API密钥和1998个OAuth令牌。对于关系社会安全稳定的企业单位,如银行等金融机构,信息系统中如果采用了上述的开源组件将会对社会经济安全造成恶劣的影响。图3中的这段代码[5]来自一个开源系统,它硬编码了用于支付的私钥,通过反编译可以直接查看相关配置数据。

在密钥管理中最常见的错误,就是将密钥硬编码在代码里。一旦攻击者获得密钥,再通过审计分析支付系统的加密算法就可以破译所有的加密数据。

functiiontoSubmit( $ pay m ent) I


Smerld- St hi s->getConf( $ pay montCM_Ord c rldl/memb or .id'); 账户


SpKey = S th is->getConKSp ay me nt[' M _Orderl di.' PmatcKcyR}:


Skey = SpKey=r? 'afsvq2mqwc7j0ivukqexrzdQjqBhr:$p Key;


Sret.uri = $this-^>callhackUrl:


Sserver.url - $this^>serverCallbackUrl;

图3 用于支付的密钥被硬编码在源代码中

(二)越来越多的黑客组织开始盯上开源软件

软件生产过程中,代码复用程度越来越高,各种开发包、核心库的应用越来越广泛。很多黑客组织也意识到了这一点,逐渐把目光放在了开源软件上,利用开源代码植入后门。这些代码的复用度越高,其中的后门影响范围就越广,从而实现对软件供应链上游的攻击。

2019年8月,Webmin被爆存在高风险远程命令执行漏洞,根据Webmin开发人员的说法,该漏洞不是编码错误的结果,而是“恶意代码注入受损的构建基础架构中”导致的。Webmin是一个用于管理Linux和UNIX系统的基于Web的开源软件,互联网上大约有13万台机器使用Webmin。根据Shodan搜索引擎收集到的统计数据显示,有近10万台服务器曾运行过存在“后门代码”版本的Webmin软件,对整个互联网安全造成了巨大的影响。

(三)开源软件缺少系统的代码安全审查机制

美国最先认识到开源软件安全问题的重要性,早在2006年美国国土安全部就开展过“开源软件代码测试计划”,对大量开源软件进行安全隐患的筛选和加固。

根据Snyk公司的报告显示,37%的开源开发者在持续集成(CI )期间没有实施任何类型的安全测试,54 %的开发者没有对Docker镜像进行任何的安全测试。

开源代码中不断发现新的安全漏洞,而很多项目没有查找并修复漏洞的响应机制。开源项目的安全记录方式也没有明确的标准可以遵循,GitHub上排名前40 万的公共代码库中,仅2.4%的项目有安全文档。

开源软件在实际的流通过程中,各个环节间缺乏系统的安全审查机制,部分企业内部也缺少必要的安全检测要求和规范,导致一旦底层开源组件出现安全漏洞,这些问题组件将传染给哪些商业产品、影响哪些业务领域,没人能给出一个准确的答案。

五、风险控制措施

(一)国家层面组织开展开源软件源代码检测工程

随着开源趋势的不可逆以及开源软件在商业软件中占的比重越来越高,开源软件俨然已经成为软件开发的关键基础设施,因此开源软件的安全问题应该上升到国家安全的角度来对待。

建议国家相关部门组织有业务基础的科研机构开展开源软件源代码检测工程,并将检测的成果以一种安全可控的方式向商业软件制造商及关键岗位的企业共享,尽可能降低开源软件漏洞对社会各行各业的影响。

(二)企业层面建设开源软件安全治理体系

企业应该建立开源软件安全治理体系,明确开源软件使用的安全准入条件,从软件开发阶段就建立开源软件使用的统一策略,实现开源软件引入和使用的标准化、规范化和合规化。

对于明确需要引入的开源软件,在加强版本控制的基础上,一方面开展安全风险评估检测;另一方面持续跟踪相关的漏洞情报,时刻提防软件供应链攻击。

(三)用户侧建立软件安全渗透测试机制

从已经发生的软件供应链攻击案例来看,非常有必要开展软件上线前的渗透检测。通过采用良性的攻防渗透的方法、思路和手段,及时发现软件系统中存在的安全漏洞和隐患,降低新软件上线给系统带来的风险。

企业在开展软件采购时,应向供应商明确要求提供软件中包含的开源组件,“用了什么,什么版本,软件来源”,并在验收时进行细致核查。

(四)检测机构加强对安全产品中开源组件的检测

信息安全产品是重要信息系统安全防护的重要组成部分,其自身的安全性将影响重要信息系统的安全。检测机构应要求软件供应商准确提供产品中包含的开源组件等信息,并针对开源组件开展专门的安全检测。这样一旦某个开源软件被爆出重大的安全漏洞,产品检测机构可以及时迅速地发布安全预警,并要求相关产品厂商尽快开展修复,甚至对修补不力的产品予以禁用处置。

六、结语

几乎每个商业软件都使用开源软件节省开发时间、降低公司成本、避免重复造车轮,但软件公司对这些代码的品质和来源却未必都给予了足够的关注和重视。

开源软件已经成为网络空间的重要基础设施,应积极开展开源软件源代码检测工程,推动建设开源软件安全治理体系,形成软件安全渗透测试的长效机制。

(注:本文原载于《保密科学技术》杂志2020年2月刊)

推荐阅读

2020年十大开源漏洞回顾

GitHub 发布 Octoverse 开源软件安全趋势报告(超详)

RiskSense Spotlight:全球知名开源软件漏洞分析报告

BCS 2019议题分享|开源软件安全实践与思考

题图:Pixabay License

转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。

奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的

产品线。

    觉得不错,就点个 “在看” 或 "赞” 吧~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/smellycat000/article/details/113904312

智能推荐

js获取文本高度和屏幕高度_js计算文字高度-程序员宅基地

文章浏览阅读4.8k次,点赞2次,收藏2次。网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offsetWidth (包括边线的宽) 网页可见区域高: document.body.offsetHeight (包括边线的高) 网页正文全文宽: document.body.scrollWidth ..._js计算文字高度

c语言的快速排序,C语言实现快速排序-程序员宅基地

文章浏览阅读162次。#include#include#include#define RANDOM(i) (rand()%i)#define N 15//划分函数int partion(int a[],int p,int r){int x = 0;int j;int i;int temp;i = p-1;x = a[r];for ( j = p; j <=r-1; j++){if (a[j] <= x..._使用快速排序实现输入数据的升序排列c语言

C#笔记-----串口类(异步发送,接收)_vs c# 串口非堵塞接收-程序员宅基地

文章浏览阅读3.7k次。using System;using System.Collections.Generic;using System.IO.Ports;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace WindowsFormsApp1{ class Comm { public..._vs c# 串口非堵塞接收

vasp计算之输入输出文件_vasp自旋极化磁矩为负-程序员宅基地

文章浏览阅读8.6k次,点赞11次,收藏75次。一、vasp文件:INCAR in **STOPCAR instout outPOTCAR in **KPOINTS in **IBZKPT outPOSCAR in **CONTCAR outEXHCAR in (should not be used ..._vasp自旋极化磁矩为负

地大计算机历年分数线,中国地质大学武汉历年分数线 2021中国地质大学武汉录取分数线...-程序员宅基地

文章浏览阅读513次。一、2019年中国地质大学(武汉)各省录取分数线及录取位次统计表1、中国地质大学(武汉)2019年在重庆录取分数线如下:文科录取批次本一批589分,最低录取位次为2331名、理科录取批次本一批590分,最低录取位次为12910名;2、中国地质大学(武汉)2019年在甘肃录取分数线如下:文科录取批次本一批571分,最低录取位次为1600名、理科录取批次本一批545分,最低录取位次为9913名;3、中..._中国地质大学计算机录取分数线

pool win10提示bad_大师讲解win10蓝屏重启代码BAD,POOL,CALLER修复方法-程序员宅基地

文章浏览阅读9k次,点赞2次,收藏2次。大家在操作电脑时一定会遇到很多问题,比如说win10蓝屏重启代码BAD,POOL,CALLER修复方法就是我们经常会遇到的,小编及身边的朋友也遇到过win10蓝屏重启代码BAD,POOL,CALLER修复方法很多次,针对win10蓝屏重启代码BAD,POOL,CALLER修复方法这样的问题,应该怎么解决呢,其实很简单,小编制作了较为简单的教程,我们只需要按照如果我们使用的电脑安装的是win10操作..._bad caller 修复

随便推点

同一局域网下自己能ping通别人,别人ping不通自己_局域网我可以ping a,a ping不了我-程序员宅基地

文章浏览阅读6.8k次,点赞2次,收藏2次。更改自己本地的网络状况为如下图所示:_局域网我可以ping a,a ping不了我

全网最全最细的PLSQL下载、安装、配置、使用指南、问题解答,相关问题已汇总-程序员宅基地

文章浏览阅读2.6w次,点赞92次,收藏401次。双击之后,这里选择安装目录,你安装目录选的哪里,这里就填哪里。后面点下去就可以,弄好之后重新打开PLSQL,就已经是中文界面了。对没有语言包的PLSQL可以直接在软件里面调,有语言包的下载Chinese语言安装包。我下载的是有语言包的,但是怎么配置,我看了其它博主的教学,也不难,找到地方就行。大家都有自己熟悉的快捷键设置,只要不冲突就行,其它快捷键可自行摸索。这个感觉还是有必要的,每次登录都不需要再输口令了,勾选带口令存储。就我个人而言,全屏模式挺友好的,原始界面看着太小,使用起来会眼花。........._plsql下载

OpenGL之纹理过滤的四种方式_opengl 纹理滤波-程序员宅基地

文章浏览阅读8.3k次。I.纹理过滤:当三维空间里面的多边形经过坐标变换、投影、光栅化等过程,变成二维屏幕上的一组象素的时候,对每个象素需要到相应纹理图像中进行采样,这个过程就称为纹理过滤。II.纹理过滤通常分为2种情况:a) 纹理被缩小 GL_TEXTURE_MIN_FILTER 比如说一个8 x 8的纹理贴到一个平行于xy平面的正方形上,最后该正方形在屏幕上只占4 x 4的象素矩阵,这种情况下一个象素对应着多个纹理单元。b) 纹理被_opengl 纹理滤波

LeetCode 119. Pascal's Triangle II(杨辉三角II) -- c语言_力扣119. 杨辉三角|| c语言具体思路-程序员宅基地

文章浏览阅读313次。119. Pascal's Triangle IIGiven a non-negativeindexkwherek≤33, return thekthindex row of the Pascal's triangle.Note that the row index starts from0.In Pascal's triangle, each number is ..._力扣119. 杨辉三角|| c语言具体思路

Python3 中 bytes 和 string 之间的互相转换_bytes to string-程序员宅基地

文章浏览阅读8.7w次,点赞11次,收藏49次。因为这是原来不知道 Markdown 时写的文章,富文本编辑器不知道怎么用脚注,所以参考资料显得有些孤立了,见谅。Table of Contents前言创建 bytes 型数据创建字符串相互转换string to bytes按 utf-8 的方式编码,转成 bytes按 gb2312 的方式编码,转成 bytesbytes to string解码成 stri..._bytes to string

售前工程师、实施工程师、运维、技术支持这些岗位的具体区别是什么?他们的工作内容大致都是什么?_技术支持和交付工程知乎-程序员宅基地

文章浏览阅读2.1w次,点赞27次,收藏102次。作者:大胆草民链接:https://www.zhihu.com/question/23793594/answer/27388387来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。售前:在产品销售过程中,和客户接洽的除了销售人员,就是这个售前工程师了。销售人员,我们从一般来说,门槛都是比较低的,很少会对销售人员的技术能力有所要求。然后问题就出现了,如果客户问到技..._技术支持和交付工程知乎

推荐文章

热门文章

相关标签