软件供应链安全工具链研究系列
SAST工具
1.工具简介
1.1 基本能力
软件供应链从软件生命周期角度可划分为开发、交付、使用三大环节,每个环节都可能会引入供应链安全风险,上游环节的安全问题会传递到下游环节。开发环节作为软件供应链的上游环节,从该环节入手,及早发现和修复安全问题非常必要。早在2005年,美国总统信息技术咨询委员会关于信息安全的年度报告中就曾指出:美国重要部门使用的软件产品必须加强安全检测,尤其是应该进行软件代码层面的安全检测。而在美国国土安全部(DHS)和美国国家安全局(NSA)的共同资助下,MITRE 公司展开了对软件源代码缺陷的研究工作,并建立了软件源代码缺陷分类库 CWE(Common Weakness Enumeration),以统一分类和标识软件源代码缺陷。美国 CERT、SANS、OWASP 等第三方研究机构也在软件源代码安全检测领域开展了许多工作,包括:CERT 发布了一系列安全编程(C/C++、Java 等)标准,SANS和 OWASP发布了严重代码缺陷TOP25和TOP10,用于指导开发人员进行安全的编码,尽量避免源代码中的安全缺陷。
以CodeSense软件源代码缺陷分析平台为例,它可以为用户提供三大方面的能力。第一提供针对源代码缺陷检测的能力,支持诸如CWE 7PK、OWASP TOP 10等;第二提供针对源代码度量的能力,支持诸如圈复杂度、扇入扇出、注释率等统计;第三提供针对源代码编码规范检测的能力,支持GJB5369-2005、GJB 8114-2013、MISRA-C 2012、MISRA-C++ 2008等行业标准与规范。
1.2 基本原理
静态安全分析基本原理如下图所示:
其中常见的静态漏洞分析技术有以下几种:
(1)语法分析技术
语法分析指按具体编程语言的语法规则处理词法,分析程序产生的结果并生成语法分析树的过程。这个过程可以判断程序在结构上是否与预先定义的 BNF 范式相一致,即程序中是否存在语法错误。程序的 BNF 范式一般由上下文无关文法描述。支持语法分析的主要技术包括算符优先分析法(自底向上)、递归下降分析法(自顶向下)和 LR 分析法(自左至右、自底向上)等。语法分析是编译过程中的重要步骤,也是其他分析的基础。
(2)类型分析技术
类型分析主要指类型检查。类型检查的目的是分析程序中是否存在类型错误。类型错误通常指违反类型约束的操作,如让两个字符串相乘、数组的越界访问等。类型检查通常是静态进行的,但也可以动态进行。编译时进行的类型检查是静态检查。对于一种编程语言,如果它的所有表达式的类型可以通过静态分析确定下来,进而消除类型错误,那么这个语言是静态类型语言(也是强类型语言)。利用静态类型语言开发出的程序可以在运行程序之前消除许多错误,因此程序质量的保障相对容易(但表达的灵活性相对弱)。
(3)控制流分析技术
控制流分析的输出是控制流图,通过控制流图可以得到关于程序结构的一些描述,包括条件、循环等信息。控制流图是一个有向图,如下图所示,图中的每个节点对应一个基本块,而边通常对应分支方向。
(4)数据流分析技术
数据流分析用于获取有关数据如何在程序的执行路径上流动的信息。在程序的控制流图上,计算出每个节点前、后的数据流信息,通过数据流分析可以生成数据流图。
数据流分析代码示例图如上所示,如参数 w 是存在漏洞的数据,则数据流路径 BB0->BB1->BB2->BB3->BB4->BB6 是不安全的。数据流分析广泛应用于静态分析中,可对变量状态(如未使用变量、死代码等)进行分析。同时,污染传播分析也是数据流分析技术的一种应用,在漏洞分析中,使用污点分析技术将所感兴趣的数据(通常来自程序的外部输入)标记为污点数据,然后通过跟踪和污点数据相关的信息的流向,可以知道它们是否会影响某些关键的程序操作,进而挖掘程序漏洞。
静态安全分析是一种针对开发过程中源代码进行安全检测的技术,内置多种缺陷检测规则,将源代码转换为易于扫描的中间数据格式,使用缺陷检测技术对其进行分析,匹配缺陷规则,从而发现源代码中存在的缺陷,并提供修复建议,帮助用户及早修复,从而降低后期缺陷修补的成本,增强软件的安全性。
缺陷类别一般分为以下三种:
(1)输入验证类
输入验证类缺陷指程序没有对输入数据进行有效验证所导致的缺陷。常见的输入验证类缺陷包括 SQL 注入、XML 外部实体注入、命令注入、XSS(跨站脚本)等。针对输入验证类缺陷,需要对输入进行验证,验证的内容包括数据是否包含超出预期的字符、数据范围、数据长度、数据类型等,若包含危险字符,如<、>、"、'、%、(、)、&、+、\、\'、\"、. 等,还需对危险字符进行转义。也可以通过验证行为净化所有不可信的输出如针对解释器的查询(SQL、XML 和 LDAP 查询)和操作系统命令,从而有效减少部分安全问题。
(2)资源管理类
资源管理类缺陷指因程序对内存、文件、流、密码等资源的管理或使用不当而导致的缺陷。常见的资源管理类缺陷包括缓冲区上溢 / 下溢、资源未释放、内存泄漏、硬编码密码等。对于此类缺陷,需要内存分配时,检查缓存大小,确保不会出现超出分配空间大小的危险。在内存、文件、流等资源使用完毕后应正确释放资源。
(3)代码质量类
代码质量类缺陷指由于代码编写不当所导致的缺陷,低劣的代码质量会导致不可预测行为的发生。常见的代码质量类缺陷包括整数问题、空指针解引用、初始化问题、不当的循环终止等。对于代码质量类缺陷,需要针对性地进行解决,如使用整数时,要避免操作结果超出整数的取值范围;使用指针时,要判断其是否为空,养成良好的编程习惯。
静态安全分析技术不需要运行程序,能够覆盖 100% 的代码库,但检查结果可能存在漏 洞或误报的情况,一般需要不断地优化检测技术和检测规则,以降低误报和漏报。
以CodeSense软件源代码缺陷分析平台为例,它集成了多种深度漏洞检测与分析引擎,应用了国防科技大学和清华大学代码静态分析技术的大量理论成果研发而成。软件安全静态分析工具贯彻把加强自主创新能力放在首要位置,突出源代码漏洞挖掘的重要能力与意义,利用先进、成熟的科学技术手段,打造科技领域的代码质量与安全检测平台。它通过语法分析、词法分析等源程序信息检查待测程序代码,从而验证程序代码是否满足规范性、安全性、可靠性、可维护性等指标;在不执行程序的情况下,分析程序路径,自动化地检测代码中难以发现、调试的重要缺陷和安全问题,并给出相应的修复建议。平台将充分利用编译抓取技术、精确数据流分析、污染传播分析、增量分析技术以及误报抑制技术,在对不同开发语言项目进行自动化分析后,通过图形化界面展示分析结果。对于查找到的每一条缺陷,可以对应展示其缺陷的详细信息,并可以通过交互式的方式定位其在源代码中的位置。结合独有的智慧减负、黑白名单技术,以最小的工作量为软件的安全与质量保驾护航。
1.3 基础实现流程
1.词法分析
2.语法分析
3.语义分析
4.中间代码生成
5.获取数据流、控制流、函数调用关系等
1.4 区分SAST/DAST/IAST
2.工具应用场景
经济全球化发展给企业发展带来了更多机遇和成长,基于价值链的实现,促进了供应链的全球化,多样化和复杂化,同时如何管理供应链的问题给企业带来了更大的挑战和威胁。软件供应链涉及环节复杂,流程和链条长,供应商众多,暴露给攻击者的攻击面越来越多,攻击者利用供应链环节的薄弱点作为攻击窗口,供应链的各个环节都有可能成为攻击者的攻击入口。既有传统意义上供应商到消费者之间供应链条中信息流的问题,也有系统和业务漏洞、非后门植入、软件预装,甚至是更高级的供应链预制问题。
从软件供应链全生命周期考虑,可以简单分为上游安全、开发安全、交付安全、使用安 全和下游安全,安全威胁存在于软件供应链的全生命周期中。
2.1 如何应用于供应链全流程中的哪些流程环节
软件供应链从软件生命周期角度可划分为开发、交付、使用三大环节,每个环节都可能 会引入供应链安全风险,上游环节的安全问题会传递到下游环节。
首先,在开发阶段,由于开发人员疏忽会在编码阶段引入漏洞,我们可以使用SAST工具Codesense对编写后的代码进行漏洞检查、规则检查等,避免在早期引入漏洞,保障开发阶段的安全。
其次,交付阶段,我们可以使用SAST工具Codesense进行检测,出具相应的检测报告来保障交付产品的安全。
最后,使用阶段,对于使用者而言亦可以使用SAST工具Codesense进行自检测,定期对资产进行安全评估,结合漏洞预警,对产品漏洞及时修复,来保证使用过程中的安全。
2.2 如何嵌入供应链安全治理流程
软件供应链安全治理依托现有的法律法规对供应链安全治理提出的指导意见与管理要求,多角度考量,将供应安全标准规范,供应链安全规章制度与供应链安全管理体系相融合,制定软件供应链安全治理顶层设计,管理范围覆盖软件供应链开发、交付到使用全生命周期及资产链条的上游研发至下游用户侧全方位覆盖。
软件供应链安全首先要树立正确的安全意识,目标是将系统打造成可信任、可评估、组成成分透明的可信实体。将安全检测结合安全可信白名单机制、风险预警、与情报收集机制保证内部环境安全。通过建立软件成分清单(如SBOM),源代码管理、漏洞库管理等安全 风险管控机制,保证软件供应链数据的安全可信。同时,配合安全检测技术、如静态代码检测SAST(比如我们的Codesense)、软件成分分析SCA、动态安全检测IAST等技术支持可评估能力建设。加快建立软件成分清单生成与使用规范,建立管理手段与工具方法库,标准化软件成分和软件成分可视化流程,保证组件透明理念的落实。
将安全理念与关键技术相融合,实现软件供应链安全技术保障,将具体方式方法抽象出可复制可执行的安全解决方案。针对具体场景实施供应链安全监督与安全管控,落实好监管部门所关注的供应链安全重点领域管理意见及建议,实现企业内部软件供应链安全防护体系化建设。
2.3 SAST工具的优势
代码覆盖率
测试的代码量是软件安全的一个关键指标。漏洞可能存在于代码库的任何部分,未经测试的部分可能使应用程序暴露在攻击之下。SAST工具,特别是那些使用模式分析规则的工具,可以提供比动态技术或手动流程高得多的代码覆盖率。它们可以访问应用程序的源代码和应用程序的输入,包括在用户界面中没有暴露的隐藏输入。
根源分析
SAST工具促进了漏洞的高效补救。静态分析安全测试可以轻松识别引入错误的精确代码行。与开发人员的集成开发环境的集成可以加速补救SAST工具发现的错误。
提高技能
开发人员在IDE中使用SAST工具时,会收到关于其代码的即时反馈。这些数据可以强化和教育他们的安全编码实践。
操作效率
开发人员在开发生命周期的早期使用静态分析,包括直接从IDE中对单个文件进行分析。在SDLC的早期发现错误,大大降低了补救的成本。它首先防止了错误的发生,因此开发人员不必在以后再去寻找和修复它们。
2.4 如何为供应链安全治理带来便利
想要大幅度降低安全风险,核心是构建和利用好应用安全工具(AST)进行自动化漏洞发掘,确保执行缺陷检测的时机准确、及时,并且不会影响研发效率。
Codesense是静态应用程序安全测试工具,技术在软件开发周期的早期就被使用,并且可以在不运行代码的情况下进行测试,这让开发团队得以在最终确定各种代码特性和功能之前使用此类扫描工具。因此,被发现的任何安全问题都可以得到及时解决。任何漏洞都会在开发的早期被发现,所以应用程序的缺陷或安全问题都难以隐藏。通过分析程序源代码以识别代码中的安全漏洞,这些漏洞包括 SQL 注入、缓冲区溢出、XML 外部实体 (XXE) 攻击和其他安全风险类型。
与许多其他安全工具相比,SAST静态检测工具Codesense可以在相对较短的时间内分析应用程序代码库,工具的检测速度已经超过每分钟10000行,并支持千万级代码检测,为开发团队节省时间提高检测效率。同时,Codesense提供标准Restful接口,可以与开发周期的其余部分可无缝集成,从而无需将代码审计任务安排到开发日程中,继而无需在源代码中花费大量时间查找安全漏洞,让软件在开发阶段更加高效与安全。
Codesense会准确报告应用程序源代码中的问题所在,在此基础上标注问题坐标,从而不必花费大量时间去查找问题以及定位检测到的安全漏洞的来源,让团队更及时解决问题。
除此之外,Codesense使用非常简单,可以一键式进行源代码检测,为技术人员和管理人员生成专业的可视化报告。
SAST作为开发安全阶段的主要技术手段之一,而Codesense作为SAST系列产品之一,功能强大、易于上手、最重要的是效率高节约安全治理时间成本。让传统安全业务化被动防御为主动防御,改善代码基因,从代码的源头解决安全问题,为软件供应链安全治理保驾护航。
工具应具备的能力建议
3.1 技术能力方面建议
1.工具应具备源代码缺陷检测的能力,支持诸如CWE 7PK、OWASP TOP 10等,且支持的缺陷库全面,并能实时或定期更新最新的缺陷。
2.工具应该具备源代码编码规则检测的能力,例如:支持GJB5369-2005、GJB 8114-2013、MISRA-C 2012、MISRA-C++ 2008等众多行业标准与规范。
3.工具应具备源代码度量的能力,支持代码行数、注释比例、 McCabe圈复杂度、基本 McCabe 圈复杂度、扇入/扇出、函数个数、代码行注释比例、可执行代码行数等指标。
4.支持语言种类要全面,比如C/C ++、C #、Java、P HP、Python、JavaScript、XML、Go、Scala、Kotlin、Ruby等主流编程语言。
3.2 可用性、便利性等能力建议
1.工具应该具备一键检测的能力,降低使用门槛,方便使用者学习。
2.工具应该支持本地、git、svn等多种形式拉取代码、创建项目。
3.工具应该具备一键生成报告的能力。
4.工具应该具备缺陷友好展示的能力,方便定位问题。
5.工具应该具备支持自定义规则集的能力。
3.3 其他具有前瞻性创新性的能力建议
1.工具应具备支持国产操作系统、国产芯片的能力,以应对国产替代。
2.工具应具备标准Rustful API的能力,以方便和CI/CD进行集成。
工具最佳实践
在互联网时代,随着数字化进程加速,针对政府、企业、机构以及个人软件系统的攻击层出不穷,以及导致大量的敏感信息泄露、系统受损、财产损失甚至人身安全危害等严重问题。软件本身的安全漏洞和质量缺陷是信息安全事件频繁发生的根源。针对此类问题,源代码静态分析技术(SAST)能够在软件开发阶段就有效解决此类问题,这是目前最好的解决方案之一。现阶段,国内SAST核心软件工具还处于被国外长期垄断的局面,国产化替代自出可控的需求迫在眉睫。
CodeSense是泛联新安新一代的软件源代码缺陷深度分析平台,结合国防科技大学、清华大学、中科院的专家团队对代码静态分析技术的深度理论研究,结合软件工程实践研发而成,现已支持10余种编程语言和开发框架,并可在多种国产平台部署。CodeSense采用业界先进的值流图分析技术,能够实现跨程序、跨文件的上下文敏感分析与对象敏感分析,精准的检测软件安全漏洞与质量缺陷,结合独有的智慧减负与黑白名单技术,高效的协助安全部门或研发团队为软件的安全与质量保驾护航。
CodeSense详细能力指标如下:
分析功能
1)检测引擎支持C/C ++、C #、Java、P HP、Python、JavaScript、XML、Go、Scala、Kotlin、Ruby等编程语言;
2)支持本地、git、svn等多种形式拉取代码、创建项目;
3)支持SpringMVC、SpringBoot、SSM、Struts2、ThinkPHP、Flask等主流开发框架;
4)支持一键批量创建检测项目;
5)内置 GJB 8114-2013、 GJB 5369-2005及其他编码规则集;
6)支持基于规则集的编码规则检查;
7)支持自定义规则集,可对内置规则集进行组合、修改等操作;
8)支持支持缺陷(违规)类型1500余条,其中,CWE 7PK覆盖率80%以上,OWASP TOP 10覆盖率100%;
9)支持对不可编译代码的检测;
10)支持C/C++缺陷类型进行漏洞触发验证,包括:生成触发漏洞的测试用例并展示,生成漏洞的触发路径并展示。缺陷类型包括但不限于:释放后再使用、双重释放,空指针解引用,除零错误;
11)支持C/C++/Java代码典型问题的检测与分析;
12)支持对代码进行增量分析,支持增量分析结果对比展示;
代码度量功能
支持软件度量分析,包含代码行数、注释比例、 McCabe圈复杂度、基本 McCabe 圈复杂度、扇入/扇出、函数个数、代码行注释比例、可执行代码行数等指标。
审计功能
1)支持在软件界面查看静态分析结果汇总与分类统计信息;
2)支持对静态分析结果的查询和过滤功能,支持对单个/多个问题进行统一标注和审计功能;
3)支持 Word 、 Excel 、 PDF 、CSV等格式的静态分析报告导出功能。
人机交互界面功能
1)支持安全规则内容查看功能,GJB8114/GJB5369中的各项规则提供正反示例展示功能;
2)支持统计各个项目的测试结果信息,包括各个级别的问题数、分布比例等,并提供可视化展示;
性能与兼容性要求
1)支持多个项目并发扫描功能;
2)在内存为8GB的计算机中流畅运行,测试执行顺利;
3)被测软件代码500000行时静态分析时间不高于2小时,被测软件代码50000行时静态分析时间不高于0.5小时;
其它
1)支持RESTFULAPI,易于嵌入DevOps;
2)支持国产芯片、国产操作系统,可在Windows、Linux、银河麒麟操作系统上部署运行;
封面:秀米
参考文献
生成长图截图
数字字体Liberation Serif
1)泛联新安《CodeSense技术白皮书》;
2)绿盟《软件供应链安全技术白皮书》;
3)Synopsys《静态应用安全测试(SAST)》
4)Gartner《Magic Quadrant for Application Security Testing 2022》
5)Wiki《Static application security testing》
6)MicroFocus《What is Static Application Security Testing (SAST)?》
7)Mend SAST《Security at the Speed of DevOps》
8)Techtarget《Static application security testing (SAST)》
9)https://codeant.valiantsec.cn/industry_detail?id=a75a5840ea574163b70f31ec43623be4
,
中文思源黑体
往期推荐
【END】
软件供应链安全治理工具链系列研究由中国信通院、中国电信联合牵头,会员单位悬镜安全、比瓴科技、默安科技、泛联新安、中兴通讯、墨菲安全、探巡科技支持开展,包含9篇软件供应链安全治理工具研究,梳理软件供应链安全治理工具链,对各类工具提出基本能力要求建议,为各国家机关、企事业单在软件供应链安全体系建设中的安全评估工具提供必要的选型参考和技术支撑,为行业内软件供应链安全治理工作的前行贡献力量。

