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

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

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

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

一、引言

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

智能推荐

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

分布式系统_分布式系统运维工具-程序员宅基地

文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具

用Exce分析l数据极简入门_exce l趋势分析数据量-程序员宅基地

文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量

宁盾堡垒机双因素认证方案_horizon宁盾双因素配置-程序员宅基地

文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置

谷歌浏览器安装(Win、Linux、离线安装)_chrome linux debian离线安装依赖-程序员宅基地

文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖

烤仔TVの尚书房 | 逃离北上广?不如押宝越南“北上广”-程序员宅基地

文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...

随便推点

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码

AUTOSAR基础篇之OS(下)_autosar 定义了 5 种多核支持类型-程序员宅基地

文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型

VS报错无法打开自己写的头文件_vs2013打不开自己定义的头文件-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件

【Redis】Redis基础命令集详解_redis命令-程序员宅基地

文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令

URP渲染管线简介-程序员宅基地

文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线

推荐文章

热门文章

相关标签