写点什么

每 1000 行代码有 14 个安全缺陷,开源软件的安全令人堪忧

  • 2020-04-08
  • 本文字数:2732 字

    阅读完需:约 9 分钟

每1000行代码有14个安全缺陷,开源软件的安全令人堪忧


当今,开源软件已经成为软件世界的重要组成部分。根据 Gartner 统计,99%的组织在其 IT 系统中使用了开源软件。


今年 3 月,安全公司 WhiteSource 发布了一份《开源安全年度报告》。报告表明,2019 年,公开披露的开源安全漏洞数量再创新高,总数为 6100 个。与 2018 年相比,开源安全漏洞的数量增长近 50%。这份报告表明,开源软件的安全问题非常严重。


更关键的是,开源软件的安全不仅关系自身,而且影响整个现代软件开发。“可以说,现代软件大多数是被‘组装’出来的,不是被‘开发’出来的”。事实上,现代软件开发越来越像工业生产和制造,原材料就是开源软件,加上自己写的业务代码,最后“组装”出一个软件系统。


在奇安信代码安全事业部总经理黄永刚看来,开源软件已经成为构建网络空间最基础的“砖头瓦块”,无处不在。“开源软件已经成为信息系统开发和建设的核心基础设施,开源软件安全问题应该上升到基础设施安全的高度来对待。”他说。

从 OpenSSL“心脏出血”漏洞说起

2014 年,开源软件OpenSSL Heartbleed(心脏出血)漏洞席卷全球。该漏洞不仅让整个中国互联网为之一颤,而且导致全球超过三分之二的网站“心脏出血”,可谓影响深远。据悉,这个 bug 非常严重,导致全球互联网大量私钥和其他加密信息处于暴露危险下,受影响严重的系统甚至可以从服务器中直接获取用户密码。



2017 年,美国征信巨头Equifax发生数据泄露,涉及近 1.45 亿用户。事后,该公司不仅被重罚 7 亿美元,而且 Equifax CEO 也引咎辞职。据悉,这起数据泄露事件的原因是黑客利用 Struts 开源软件的漏洞实施攻击。


无论是 OpenSSL“心脏出血”漏洞,还是 Equifax 数据泄露,都是因为开源软件出现安全问题。近年来,开源软件漏洞造成的安全事件越来越多,影响巨大,让人们开始认识到开源软件安全的严重性。


奇安信代码安全事业部总经理黄永刚表示,从另一个角度看,行业客户对安全的思考越来越系统化,很多客户开始关注信息系统全生命周期的安全。“安全开始左移,大家开始重视从源头上做好安全工作。开源软件是软件开发的原材料,是我们进行信息系统开发和建设要把住的第一道安全关口。”他说。

两个重大发现

发现 1:每 1000 行开源软件代码中就有 14 个安全缺陷,每 1400 行开源软件代码中就有 1 个高危安全缺陷。


发现 2:开源软件之间的关联依赖,导致开源软件的漏洞管理非常复杂。


2015 年,奇安信代码安全事业部发起“开源项目检测计划”。目前,该项目已经对 3000 多款开源软件进行了安全检测,并帮助许多开源项目修复了代码安全缺陷,包括 Google、Facebook、腾讯、阿里等旗下的开源项目。


据悉,通过开源项目检测计划,团队发现开源软件的安全问题确实非常严重。相关数据分析和统计显示,开源软件的代码安全缺陷密度是 14.22/KLOC,高危安全缺陷密度为 0.72/KLOC。换句话说,每 1000 行开源软件代码中就有 14 个安全缺陷,每 1400 行开源软件代码中就有 1 个高危安全缺陷。


黄永刚说,“另一个发现是,开源软件之间的关联依赖,导致开源软件的漏洞管理非常复杂。如果不用系统化的工具来做这件事,几乎不可能完成。”


2019 年,其团队检测了 935 个最新的物联网设备固件,并针对这些固件中所使用的开源软件和安全问题进行了分析。经过分析,他们发现:最新出厂的物联网设备中,还有 5%的设备使用了存在 Heartbleed(心脏出血)漏洞的 OpenSSL 版本,5 年前的超级漏洞,依然存在于最新的物联网设备中。


因此,对开源组件的梳理和漏洞分析,一定需要系统化的方法和自动化的工具,才能做到可管理、可持续,不留死角。


而开源软件最值得关注的安全问题是其放大作用。简言之,一个开源软件出现漏洞,会导致依赖它的其他开源软件受到影响,而且层层关联依赖,这就导致非常隐蔽和复杂的攻击面。


举个例子,Log4j 有一个安全漏洞——CVE-2017-5645。由于直接依赖 Log4j 的开源软件有 4000 多个,那么这 4000 多个开源软件也会受到 CVE-2017-5645 漏洞的影响。更恐怖的是,还有 46000 多个间接依赖 Log4j 的开源软件,它们则是更隐蔽的受害者。

三大原因

在软件开发上,无论是技术方面,还是流程和管理方面,任何一点疏忽都会导致开源软件出现安全问题。


具体说来,奇安信代码安全事业部总经理黄永刚总结出三方面的原因:


1.开源软件开发者自身的技术能力和安全开发知识存在问题,导致开发的代码中有安全缺陷;


2.大多数开源项目的开发缺少 SDL(安全开发生命周期)的流程和工具。并且,很多开源项目能使用的资源很有限,缺乏专业的代码安全分析工具,而大部分专业的代码安全分析工具都是收费的,价格昂贵;


3.攻击者对开源生态的攻击,比如向开源库中注入恶意代码、向包管理器仓库投放恶意组件等。


如何提高开源软件的安全性?黄永刚认为,从技术上,开源项目需要更系统地引入保障应用安全的流程、方法和工具,比如基于 SDL 的流程和理念管理开源项目的开发过程,并对开源项目开发者进行安全开发知识的普及。其次,使用源代码静态分析、动态安全测试、交互式安全测试等工具,并对开源项目开发者提交的代码进行全面的安全测试等。


从非技术角度来说,“我觉得,开源技术社区和安全技术社区可以加强交流和合作,形成互动和反馈,互相促进。开发和安全的良性互动,是解决软件安全问题非常重要的前提。”他说。

五条安全建议

针对软件开发者和企业,黄永刚建议从引入控制、资产梳理、风险识别、漏洞告警和合理修复五个方面加强开源软件的安全治理。


1.引入控制。企业应规范开源软件的引入流程,建立开源软件安全引入和退出机制。同时,对开源软件的引入需要加入安全评估因素,不仅需要评估项目团队引入的开源软件是否存在公开的漏洞,是否存在开源法律风险,而且企业应进行完整性验证,开源软件是否来自官方,避免使用被篡改的开源软件。


2.资产梳理。无论是软件开发者,还是企业,它们在软件开发过程中会引入大量开源软件。然而,企业的安全管理者和开发管理者常常不清楚自身的信息系统到底引入多少开源软件,引入了哪些开源软件。开源软件有着层层嵌套的依赖关系,软件开发者或企业很难通过人工方式进行梳理。因此,建议使用专业的自动化工具识别软件系统中含有哪些开源软件以及开源软件之间的关联关系,形成企业开源软件可视化资产清单。


3.风险识别。软件中使用的开源软件可能存在已知漏洞,且这些开源软件背后调用或依赖的其他开源软件也可能存在已知安全漏洞。在软件开发过程中,企业应及时发现存在漏洞的开源软件版本并进行升级。


4.漏洞告警。在软件运行阶段,企业应监控开源软件漏洞情报信息,及时发现开源软件的最新漏洞信息,并进行应急响应。


5.合理修复。绝大多数的开源软件是通过版本更新实现漏洞修复的。对于不能通过升级新版本或打补丁来修复漏洞,企业应引入专业的漏洞研究队伍,定制漏洞修复方案。


2020-04-08 07:005348
用户头像
万佳 前InfoQ编辑

发布了 677 篇内容, 共 352.2 次阅读, 收获喜欢 1799 次。

关注

评论 1 条评论

发布
用户头像
的确开源软件的维护和安全性在一些方面不及专业性的软件,着体现了开源软件社区的重要性,我们应该推动社区的建设和运营。

2020-04-08 17:46
回复
没有更多了
发现更多内容

这几道面试题,难倒了牛客网98%的程序员,刷完后直接斩获9个大厂offer

Java架构师迁哥

裸辞在家闭关修炼,意外发现一份据说是从阿里内部泄露出来的《Java程序员金三银四面试秘籍》

Java架构之路

Java 程序员 架构 面试 编程语言

【只要努力,方能成功。】四面字节跳动Java研发岗,成功斩获Offer。分享4面技术面真题及复习资料!

Java架构之路

Java 程序员 架构 面试 编程语言

GitHub开源:100美元自制激光雷达

不脱发的程序猿

GitHub 开源 DIY 4月日更 激光雷达

阿里员工:最惨P7,33岁才28K,感觉没有前途了。网友调侃:最美逆行者

程序员生活志

【全网首发】2021年移动开发iOS进阶提升方案,内附详细视频知识点解析和思维导图!【强烈建议收藏!】

flutter swift 数据结构与算法 ios开发 iOS逆向

裸辞还可以吊打大厂面试官?四面拿到阿里、字节offer后我还是选择了美团!

Java架构师迁哥

抢购倒计时自定义控件的实现与优化

vivo互联网技术

动画 安卓 自定义控件 倒计时

我很久没写代码了,但我是个好架构师

四猿外

Java 程序员 系统架构 架构师 代码

全球案例 | 霍尼韦尔:Atlassian 帮助我们在疫情期间拯救生命

Atlassian

敏捷 Atlassian Jira 远程协作 霍尼韦尔

聪明人的训练(二十)

Changing Lin

4月日更

面试加分项!为了跳槽强刷1000道Android真题,附小技巧

欢喜学安卓

android 程序员 面试 移动开发

破十亿浏览量的阿里最新Java架构师成长笔记开源!

Java架构追梦

Java 阿里巴巴 架构 面试 成长笔记

神级Android进阶笔记!一次关于JVM的面试经历,建议收藏

欢喜学安卓

android 程序员 面试 移动开发

Linux tree命令

一个大红包

Linux linux命令 4月日更

Rust从0到1-枚举-if let控制流

rust 枚举 if let

MySQL常用引擎及优缺点

Sakura

4月日更

腾讯万字Code Review规范出炉!别再乱写代码了

程序员生活志

疫情影响到底有多大?《2020年移动互联网报告》深度解读垂直行业变化趋势

Lily

iMazing 一款替代iTunes的数据备份软件

懒得勤快

ios Mac imazing 手机管理

Redis持久化方案介绍之RDB方案

大数据技术指南

redis 4月日更

《专访阿里研究员吴翰清:大数据时代下,如何保障网络安全和用户隐私》(采访提纲)

三掌柜

调查采访能力考核

多源数据即席查询Trino(Presto)引擎剖析

小舰

4月日更

低代码:正在改变软件的开发方式

华为云开发者联盟

软件开发 低代码 低代码平台 华为云应用魔方 AppCube

三色标记原理,我给应聘者问懵了...

华为云开发者联盟

Java 节点 三色标记 SATB算法 回收器

【签约计划】行业分析能力考核成绩公布

InfoQ写作社区官方

签约计划 热门活动

凡尔赛?拿到阿里offer只用了29天?

Java架构师迁哥

从Map和Reduce角度谈Hive优化

五分钟学大数据

hive 4月日更 hive性能优化

计算机原理学习笔记Day11

穿过生命散发芬芳

计算机原理 4月日更

华为云PB级数据库GaussDB(for Redis)揭秘第八期:用高斯 Redis 进行计数

华为云开发者联盟

redis GaussDB(for Redis) 计数器 计数

一天下载量突破9000000!限时分享:阿里Java架构师成长笔记(2021版)

比伯

Java 架构 面试 程序人生 计算机

每1000行代码有14个安全缺陷,开源软件的安全令人堪忧_开源_万佳_InfoQ精选文章