基于DevSecOps的软件供应链安全治理技术简析

2022-11-15 08:27张小梅苏俐竹中国联通研究院北京100048
邮电设计技术 2022年9期
关键词:污点开源漏洞

张小梅,苏俐竹(中国联通研究院,北京 100048)

0 前言

在数字化转型背景下,作为云原生技术不可或缺的持续交付、DevOps、微服务和容器技术正在被广泛使用,面对软件交付周期所带来的压力,DevSecOps 理念被提出,DevSecOps 是一种融合了开发、安全及运营理念的全新的安全管理模式,其核心理念是:业务应用生命周期的每个环节都需要为安全负责,安全是整个IT 团队(包括开发、测试、运维及安全团队)所有成员的责任,并且需要贯穿到从研发至运营的全过程。

传统研发运营安全侧重于在测试及运营阶段,进行安全威胁排除,漏洞修复,更多的是被动式安全防御。面对云原生时代业务需要频繁调整、上线,亟需进行安全左移,在需求、研发阶段便进行安全介入,从源头处降低安全风险,实现主动式安全防御,从而构建覆盖软件应用服务全生命周期的安全体系。本文基于DevSecOps 理念,在明确业务系统安全需求的前提下,制定贯穿软件系统全生命周期的实践方案,通过在软件开发的不同阶段将安全工具或安全活动进行整合,将各个信息安全孤岛进行串联,协同作战,实现安全设计、安全编码、安全测试和安全运营的统一融合,在提升软件系统研发过程标准化与自动化的同时,降低对效率的影响,也降低安全的成本。

1 软件供应链安全治理思路

依托DevSecOps 理念,通过构建安全工具链、整合安全流程、嵌入安全自动化检查等方式,将安全贯穿设计、开发、测试、运营生命周期的每个环节,推动研发运营安全体系向敏捷化、自动化演进,应对新的云服务开发运维模型,提高业务系统安全问题修复效率、降低安全运营成本。图1 所示为软件供应链安全治理体系。

图1 软件供应链安全治理体系

2 软件供应链安全治理方案

2.1 设计安全

应用软件安全设计是保证软件安全的最根本前提,需要根据业务安全策略、合规需求、应用系统的特性等进行快速的分类分级,并根据系统分类分级情况分别定义不同的安全策略,进而选取合适的安全活动(见图2)。在计划阶段通常涉及的安全活动主要包含安全培训、威胁建模、安全开发衡量指标制定。

图2 安全设计活动

a)安全培训。DevSecOps 流程方面需要让项目组成员清楚了解各个阶段需要承担的责任与义务,并进一步对DevSecOps 体系整体过程进行学习。DevSec-Ops 工具使用方面需要对项目组成员进行培训,如对开发人员、安全人员进行安全工具的使用培训,对运维管理人员进行安全基线工具、资产安全管理等工具的使用培训。

b)威胁建模。为满足DevOps 快速敏捷要求,可采用轻量级威胁建模方式,主要包括如下几个步骤:首先,通过动态调查问卷快速收集有关业务系统、部署环境和合规性要求等方面的重要且详细的信息,根据收集到的信息自动识别风险、威胁和潜在弱点;其次,根据预定义的安全和合规性策略对整体风险进行分类管理;最后,输出安全设计方案,并对安全问题进行跟踪。

c)衡量指标。根据业务应用系统的不同安全级别,制定对应的安全开发衡量指标,用于评估实施效果。

2.2 编码安全

应用软件编码阶段是业务安全问题修复成本最低的时期,依靠安全编码规范、安全基础库SDK 的调用以及开源组件安全检测,最大程度地保证在编码阶段消除安全风险,保证软件的原生安全(见图3)。

图3 安全编码方案

首先,针对OWASP TOP10 2021 和OWASP TOP10 2017 涉及的漏洞类型制定安全编码规范,为应用系统的代码编写提供安全编码方法、安全编码用例、缺陷代码示例和安全接口函数等,保证应用系统的编码安全。下面给出几个SQL注入漏洞安全编码规范示例。

a)采用预编译方式,使用占位符接收数据替换为SQL语句(见图4)。

图4 使用占位符接收数据替换为SQL语句示意

b)采用转义用户输入方式,将可能恶意执行的字符转义为无法执行的字符串(见图5)。

图5 将可能恶意执行的字符转义为无法执行的字符串示意

其次,开发安全基础库接口函数,打造安全基础库SDK 即安全软件开发工具包,安全SDK 集成了为软件工程师在开发过程中防御安全漏洞的一系列安全API,供软件项目直接引用。基于安全编码的SDK 库,方便研发人员安全编码,提高开发效率,同时通过为代码漏洞修复提供安全接口,避免漏洞的二次引入。下面以防范SQL 注入漏洞为例,介绍SDK 包调研过程。

a)在项目中导入安全基础库SDK包(见图6)。

图6 项目中导入安全基础库SDK包示意

b)输入与输出结果对比,可以看到安全SDK的方法将用户输入的有害字符都做了相应的转义,可以防止SQL注入(见图7)。

图7 输入与输出结果对比示意

最后,对编译后的二进制包和源码包进行分析,识别出项目包中引用的开源组件,检测软件系统的开源软件组成成分、开源组件安全漏洞、开源组件许可证风险等,提高软件开源组件风险整改效率。

2.3 测试安全

应用软件测试阶段利用智能动态污点跟踪技术,实现安全测试工作左移,将安全赋能至开发测试阶段,在软件的功能测试阶段同步开展安全测试,提高安全漏洞的发现效率和准确性,使交付更安全的产品成为可能(见图8)。

图8 交互式应用安全检测方案

首先,智能动态污点跟踪技术依赖于字节码插桩技术,将安全检测Agent 融入到应用程序中,代理程序Agent 通过ASM 框架等方式可以对Class 字节码加载至JVM 中时进行修改,从而插入跟踪的逻辑内容,达到污点跟踪的目的。图9 为插桩后的StringBuilder.append()方法,插桩程序植入了Void.dance 的代码作为埋点程序,后续对此方法的调用都会经由插桩程序接管。

图9 插桩后的StringBuilder.append()方法示意

其次,当Agent完成Class插桩后,在被测应用运行时,会由埋点代码进行智能动态污点跟踪。一次污点跟踪过程是在一个HTTP 请求中进行的,污点跟踪随着HTTP 请求一起开始,HTTP 请求的结束也标志着一次污点跟踪的结束(见图10)。智能动态污点跟踪的漏洞检测架构分为3 个部分:污点源(Source)、传播过程(Propagator)和规则触发(Sink)。污点源是获取外部输入数据的地方,传播过程是污点数据进行传播的地方,规则触发是风险方法所在处。在应用程序运行过程中,Agent 将会跟踪污点数据在应用程序中执行的程序上下文,并分析外部进入的数据在程序内部的传播过程,判断其是否经过了安全过滤或者安全验证机制,由此进行漏洞分析检测。

图10 污点跟踪过程时序图

2.4 运营安全

应用发布运营阶段利用JavaAgent 技术,在应用程序运行时动态编辑类字节码,将自身防御逻辑注入到Java 底层API 和Web 应用程序当中,获取代码执行流程,监控敏感函数的调用,从而与应用程序融为一体,能实时分析和检测Web 攻击,使应用程序具备自我保护能力。该技术能够利用请求的行为来判断是否为攻击请求,弥补WAF不能利用行为而仅用规则来判断请求及无法获取Web 应用运行时环境的缺陷,并且不会受加密影响,可直接定位到漏洞代码文件和代码行号,补充了东西向防护能力,与边界防护能力联动,实现纵深安全防御,可实时监测Web 攻击行为,增强0day漏洞应对能力。图11为SQL注入漏洞防御示例。

图11 com.mysql.jdbc.ConnectionImpl 类继承关系图

在Java 中,所有的数据库读写操作都需要使用JDBC 驱动来实现,JDBC 规范中定义了数据库查询的接口,例如Mysql 驱动包实现数据库连接的实现类是:com.mysql.jdbc.ConnectionImpl,该类实现了com.mysql.jdbc.MySQLConnection 接口,而com.mysql.jdbc.MySQLConnection 类是java.sql.Connection 的子类,也就是说com.mysql.jdbc.ConnectionImpl 接口必须实现java.sql.Connection 定义的数据库连接和查询方法。当com.mysql.jdbc.ConnectionImpl 类被JVM 加载后会因为配置了应用自保护的Agent,该类的字节码会传递到应用自保护的Agent 处理,应用自保护经过分析后得出ConnectionImpl 类符合应用自保护内置的Connection-PrepareStatementHook 类设置的Hook 条件(父类名/方法名/方法参数完全匹配),那么应用自保护就会使用ASM动态生成防御代码并插入到被Hook的方法中。

图12给出了未修改的ConnectionImpl 类代码片段示意,图13 给出了经过应用自保护Agent 修改后的代码片段示意。

图12 未修改的ConnectionImpl类代码片段示意

图13 经过应用自保护Agent 修改后的代码片段示意

通过应用自保护Agent 增强后的ConnectionImpl类执行任何SQL 语句都会被应用自保护Agent 捕获,并检测其合法性,从而实现了彻底的SQL 注入攻击防御。应用自保护Agent 除了会在开发语言底层重要的API(如文件读写、命令执行、SQL 注入等API)中设置防御点(API Hook 方式)以外,还能关联应用上下文及请求的行为,对正常请求进行放行或不触发Hook直接正常通过,对恶意请求(包含但不限于OWASP TOP10涉及的攻击类型、后门攻击、反序列化攻击、内存马攻击等)进行清洗,同时会对有风险的请求进行记录并输出相关特定加密日志,以便安全监控平台进行分析、溯源,快速定位攻击信息及相关漏洞点。

3 软件供应链安全治理方案价值

本文基于DevSecOps 理念,构建了覆盖软件应用设计、编码、测试、运营全过程的防御方案,能够精准定位漏洞风险点,检测、防御和监控分析粒度深入代码级,不受业务加密与链路加密的影响。该方案主要有以下4个方面的价值。

a)主动防御:进行安全左移,研发阶段便进行安全介入,运营阶段植入原生安全能力,进行贴身防护,不受业务加密与链路加密的影响,与边界防护联动,实现主动式安全防御。

b)测试高效:覆盖加密应用场景,在软件的功能测试阶段同步开展安全测试,提升安全测试的覆盖率及准确性,动态发现应用软件组件漏洞,减少安全人员投入。

c)深度识别:不依赖于对攻击请求单一的规则判断,防御和监控分析粒度深入代码执行逻辑及触及的周边对象。

d)精准拦截:可对攻击进行精准捕获,输出建议处置方案,有效防护应用程序或其底层平台上的0Day漏洞,防止未知威胁爆发。

4 结束语

为夯实网络与信息安全技术,提高软件应用系统和网络环境的安全水平,抵御开源和云原生时代所带来的新型风险,本文基于DevSecOps 理念,运用安全编码、开源组件安全分析、智能动态污点跟踪、应用运行时自保护等新技术,构建覆盖应用软件设计、编码、测试、运营全生命周期的安全防护体系,精准定位漏洞风险点,检测、防御和监控分析粒度深入代码级,且不依赖于单一规则,不受业务加密与链路加密的影响,能有效降低漏洞检测误报率,弥补网络云化后“边界安全防护”技术体系的不足,降低业务应用被攻陷的风险,推进安全能力原生化、服务化。

未来DevSecOps 应用发展将呈现出自动化、智能化的趋势,DevSecOps 的目标是在不影响效率的前提下提升软件系统安全性。随着人工智能在多个领域的应用,人工替代效能逐渐突出,这与DevSecOps 在软件供应链安全治理领域的目标高度一致,人工智能在未来将是DevSecOps必不可缺少的基础能力。

猜你喜欢
污点开源漏洞
漏洞
基于代码重写的动态污点分析
黑蚂蚁
五毛钱能买多少头牛
2019开源杰出贡献奖
基于selenium的SQL注入漏洞检测方法
污点
侦探推理游戏(二)
漏洞在哪儿
大家说:开源、人工智能及创新