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

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

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

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

一、引言

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

智能推荐

(亲测有效)win7安装nodejs高版本(18.8.0)_node16要win几-程序员宅基地

文章浏览阅读511次,点赞5次,收藏3次。现在学习vue3,vite,使用pnpm创建项目都需要高版本的nodejs了,win7最高只能安装13版本,好多已经不支持了。那么我们安装的16.4.0版本在写项目时基本都可以使用,当然此篇只是以安装16.4.0为例,可以替换成更高的18或者20版本,只是太高的话可能出现冲突,够用就好。希望对各位小伙伴有帮助。_node16要win几

Nordic Power Profiler Kit II(PPK2)的应用软件power profiler安装失败的一个解决方法-程序员宅基地

文章浏览阅读1.9k次。nRF Connect for Desktop是一个跨平台工具框架,用于协助nRF设备上的开发。它包含许多应用程序来测试,监控,测量,优化和编程你的应用程序。Power Profiler就是这个框架里面的其中一个应用。问题就出在安装应用的环节,如果访问Nordic的网站速度较慢,nRF Connect for Desktop安装应用经常出现ERROR,无法安装完成。_power profiler

Android开发之input子系统二之创建自己的input_android 系统添加自定义input事件-程序员宅基地

文章浏览阅读1.1k次。参考:http://blog.csdn.net/myarrow/article/details/12105973一、概略根据章节一的内容我们大致了解了android系统的input子系统的一些信息,但是有时候系统自动提供的input事件却并不能满足我们的实际需求,android系统针对这个也为我们提供了uinput。二、APIuinput_user_dev 基于Android..._android 系统添加自定义input事件

基于双V7的高性能6U VPX载板-程序员宅基地

文章浏览阅读68次。其中XC7VX690T-2FFG1761扇出2个FMC接口 ,通过每个FMC接口可向外部提供82对高速差分线(含2对差分时钟线)、 10组共20对超高速DP 差分对及2对超高速差分时钟线。其中XC7VX690T-2FFG1761搭配2组共10片(每组其中1片作为ECC校验)16bit 4Gb的DDR3-1866SD RAM, XC7VX690T-2FFG1927搭配5片(其中1片作为ECC校验)相同规格的DDR3SDRAM和1片36Mb的QDRII SRAM。—支持—个M.2 SATA接口;

Docker安装DockerUI可视化管理_dockerui安装-程序员宅基地

文章浏览阅读1.3k次。文章目录一、查找要安装的镜像版本二、安装命令详解二、Docker安装案例1、安装MySQL2、安装Redis3、安装JDK4、安装RabbitMQ一、查找要安装的镜像版本docker search $NAME其他用到的命令,参考《Docker的常用命令大全》。二、安装命令详解docker run -d -p 6379:6379 -v /data/redis:/var/redis --name redis redisdocker run:启动containerredis:要启动的image_dockerui安装

mysql有关运维的面试题_分享12道mysql 运维dba经典面试题,听说能答对一半月薪10k+...-程序员宅基地

文章浏览阅读839次。概述想知道mysql dba运维面试时都会被问到哪些问题吗?特整理出20个运维经典面试题供大家参考学习,据说知道一半答案的人,月薪能过万~1、MySQL的复制原理以及流程基本原理流程,3个线程以及之间的关联;(1)主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;(2)从:io线程——在使用start slave 之后,负责从master上拉取 binl..._dba运维面试题

随便推点

使用Leaflet.glify提升Web地图性能的技术解析与推荐-程序员宅基地

文章浏览阅读263次,点赞5次,收藏10次。使用Leaflet.glify提升Web地图性能的技术解析与推荐项目地址:https://gitcode.com/robertleeplummerjr/Leaflet.glify在GIS应用和Web地图开发中,高效、流畅的表现力是用户体验的关键。Leaflet.glify是一个非常有趣的开源项目,它将流行的 Leaflet JavaScript 库与 WebGL 技术相结合,以提供更高效的地图..._leaflet.glify

学习C++:实践者的方法(Beta1)(转)-程序员宅基地

文章浏览阅读598次。By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) 前言 我的blog以前很长一段时间关注的都是C++中的技术&细节,乃至于读者和应者都寥寥。然而5月份的时候写的一篇“你应当如何学习C++”,阅读量却达到了3万多,在blog上所有文章中却是最高的(且远远超过了第二位);评论数目也有一百多。为什么独独这篇能够激起这么多的回应,想必是国内的

CTFHUB-web-SQL注入_ctfhub sql注入-1-程序员宅基地

文章浏览阅读683次。CTFHUB SQL_ctfhub sql注入-1

Web端和App端测试的区别_app端和web端测试区别-程序员宅基地

文章浏览阅读1.6w次,点赞22次,收藏334次。Web端和App端测试的区别Web项目是B/S架构,基于浏览器的。App项目是C/S架构,必须要有客户端,用户需要安装客户端。对于更新版本,Web项目只需要更新服务端,客户端就会同步更新,而App项目需要客户端和服务端都同时更新。Web端和App端测试的区别包括以下:①从测试流程上看,基本没有区别。都是需要经历测试计划方案、用例设计、用例执行、缺陷管理、测试报告编写等相关活动。②从测试类型上,基本相似。都需要功能测试、性能测试、安全性测试、GUI测试等。web测试是基于浏览器的,所以不用考虑安装_app端和web端测试区别

python循环嵌套的内循环控制变量与外循环变量可以同名,python 实现循环定义、赋值多个变量的操作...-程序员宅基地

文章浏览阅读1.6k次。exec函数,可以循环定义、赋值多个变量exec ("temp%s=1"%1)这段代码的意思是,让exec执行temp1=1。字符串里面的%s由‘1'代替了。我们在外面再套一个循环就可以实现对多个变量的定义了。for i in range(10):exec ("temp%s=1"%i)在这里,通过一个循环来生成10个变量,i的变化从0到9。用变量i替代%s,所以在每次循环里面,分别给temp0、t..._如何在嵌套循环中使用多个循环变量?

在vue项目中使用pdf.js渲染base64编码的pdf进行预览_vue引用pdf.js 解析base64加密流文件-程序员宅基地

文章浏览阅读1.8k次。有个要在前端页面预览 pdf 的需求,于是参考了几篇网上的文章完成了需求。1.使用PDF.js实现前端和手机端网页预览PDF文件(可定制,支持本地文件、Base64编码和远程URL跨域方式)2.PDF.js直读Base64编码(间接解决跨域问题)3.vue项目中pdf预览插件---vue-pdf 使用..._vue引用pdf.js 解析base64加密流文件

推荐文章

热门文章

相关标签