cyberutopian
SAST—研发安全体系建设的核心
在软件开发过程中,研发团队需要针对产品需求进行编码实现,并通过集成、编译、部署等环节让应用程序最终稳定地运行在线上环境中。DevSecOps体系建设理念的核心就在于将安全实践无缝地嵌入至现有研发环节,以实现安全在研发全流程链路上的左移,这便是我们常说的”安全左移“。
而在一个应用程序持续运营的过程中,会不断地出现新的功能需求与对应的编码实现,这也意味着构成应用程序功能逻辑的源代码也处于不断变化的状态中,对应用源代码进行安全分析可以从源头治理安全风险,因此面向源代码的安全建设也通常是建设研发安全体系时的起点。
SAST(Static Application Security Testing,静态应用安全测试)是针对源代码及编译中间产物的一种安全测试工具,SAST主要通过静态分析的方式,在不直接运行应用程序的前提下,完成潜在安全漏洞、代码质量缺陷、编码规范等问题的提前识别。
SAST通常被集成至应用研发的CI/CD(持续集成与部署)流程中,针对每一次代码提交进行分析并生成扫描报告,为开发人员提供全自动化的实时检测。
cyberutopian
SAST技术发展历程
尽管对SAST工具的技术路线做出了发展阶段的划分,但并不意味着它们之间存在明显的替代关系,而是不同的技术阶段同时并存,持续保持发展。
在实际的SAST应用场景中,用户仍然会根据实际需求,综合考虑分析耗时、结果精度以及其他重要因素来最终选出适合自己需求的SAST工具。
cyberutopian
打破次元壁—开放式程序分析
衡量一个SAST工具是否优秀,通常会从多个方面进行,常见的评价指标包括::
随着企业发展,自研或改造类应用数量整体占比快速提高。当面临从业务场景衍生的高度自定义需求时,SAST产品在扩展性上往往捉襟见肘,业务安全团队不得不寻求定制化开发服务,或者使用有限的扩展能力进行二次开发,成本高,效果却一般。因此企业在成长到一定规模后,往往会组建起自己的研发安全团队,SAST类产品从外部商业采购逐渐转向内部自研,以满足独特的内部业务需要。
随着全球软件行业的快速发展,SAST也迎来了以CodeQL为代表的”代码知识数据化“路线,它与传统SAST最大的区别便在于”自定义能力的开放程度“,标志性特征便是用户可对核心分析过程进行高度的自定义设置。
比如在CodeQL中,用户想要自定义出模板注入漏洞的规则,则可以快速写出:
/**
* @kind path-problem
*/
import java
import semmle.code.java.security.TemplateInjectionQuery
import TemplateInjectionFlow::PathGraph
from TemplateInjectionFlow::PathNode source, TemplateInjectionFlow::PathNode sink
where TemplateInjectionFlow::flowPath(source, sink)
select sink.getNode(), source, sink, "Template, which may contain code, depends on a $@.",
source.getNode(), "user-provided value"
开放式程序分析所表示的便是”代码知识数据化“类SAST所具备的核心能力——核心能力开放,用户生产力不再受到工具的制约。而即使同为开放式程序分析方向,不同细分技术路线之间的开放程度也会存在差异,如CodeQL这种使用Datalog路线设计的工具,在开放性明显更胜一筹。
Datalog是一种声明式逻辑编程语言规范,源于Prolog,最初用于数据库领域。后以Datalog规范为基础衍生出了丰富的应用生态,如Soufflé、bddbddb、XTDB、LogicBlox、CodeQL、Datomic、Flix等都按照Datalog规范实现了自己的语言以及配套的执行引擎。
近几年,基于Datalog开发的程序分析工具在商业层面也获得了大量关注,如Semmle(后被微软收购)的CodeQL、DeepCode(后被Snyk收购整合为Snyk Code)的DeepCode AI。
CodeQL被收购仍然保持社区化运作,并通过独此一份的开放式程序分析能力,成为备受全球安全研究人员青睐的静态分析工具,其影响力也进一步扩展至企业中,吸引众多企业内部安全团队用于建设研发安全体系。目前CodeQL也是Github代码扫描能力的底层核心,这进一步证明在大规模代码分析场景下Datalog路线的可行性。
寻臻科技作为一家软件供应链安全领域新兴的技术型创业厂商,在今年一月份正式推出了国内首个开放式程序分析产品——寻径UtopianCode。我们基于Datalog规范打造了属于自己的声明式逻辑编程语言MirrorQL,并围绕MirrorQL构建起了程序分析的核心框架。
MirrorQL糅合了Datalog与现代编程语言的多种语法特性及优点,如class、package、trait、function等,表达能力远强于常见的Datalog。在MirrorQL中,我们可以通过如下的方式快速自定义出一条简单的命令执行漏洞识别规则:
use package::core::dataflow::DataFlowNode::DataFlowNode
use package::core::tainttrack::TaintConfig::TaintConfig
use package::model::sink::CommandInjection::CommandInjectionSink
use package::model::source::RemoteSource::SpringServletParameterSource
class CITaintConfig extends unit {
fn isSink(s: DataFlowNode){
s instanceof CommandInjectionSink
}
fn isSource(s: DataFlowNode){
s instanceof SpringServletParameterSource
}
}
impl TaintConfig for CITaintConfig;
[output]
fn analyze(fnode: DataFlowNode, tnode: DataFlowNode, desc: str) {
let analysis: TaintTracker[CITaintConfig];
analysis.hasFlow(fnode, tnode)
and
desc == "Command Injection"
}
随后在寻径UtopianCode的创建规则页面中导入该规则,便能够在后续新发起的扫描任务中直接配置使用,极大降低了用户进行规则二次开发的使用成本,并提供远超传统SAST的强大定制化能力。
寻径平台规则编辑页面
除了较为常见的自定义数据源函数、污点函数、传播函数的能力之外,MirrorQL还支持在代码的语义信息级别进行搜索,寻找符合指定特征的元素。比如,我们想寻找所有"使用了@RequestMapping注解,并且有一个参数名是username的方法",则可以通过MirrorQL进行编写:
...
[ ]
fn analyze(m: Method) {
m.getAnnotation().getName() == "@RequestMapping"
and
m.getAllParameters().getName() == "username"
}
cyberutopian
查询控制台—让分析触手可及
查询控制台首页
在查询控制台中,以左上角的项目列表为入口,创建待执行的MirrorQL脚本,于右侧的输入面板编辑MirrorQL脚本,执行后在MQL执行历史中便可以查看每一次执行所对应的结果:
查询控制台执行流程
关于寻臻科技
杭州寻臻科技有限责任公司成立于2023年,创始团队来自国内一线互联网公司及知名战队Nu1L Team,核心技术团队成员深耕软件供应链安全技术多年,多次获得国家级网络安全赛事冠军并在世界杯级赛事DEFCON CTF中取得佳绩,同时相关研究成果发表于BlackHat USA等会议。
寻臻科技以开发者为核心,专注于打造企业级软件供应链安全与数据安全解决方案,结合程序分析能力,探索软件供应链安全与数据安全的全新能力边界,从源头守护应用资产安全。
cyberutopian
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...