IAST技术进阶系列(一)_关键语言支持

导语新一代IAST灰盒安全测试技术凭借其极高的检出精度、深度的业务透视能力及高度自动化CI/CD支持能力正快速由行业头部用户的场景化探索实践向广大中小型用户规模化应用实践演进。由于其特殊的技术原理使得该项新技术对业务语言的覆盖支持成为关键落地因素之一。

广告如何搞定毕业论文查重?×

今年6月中国信息通信研究院以下简称“中国信通院”正式发布《交互式应用程序安全测试工具能力要求》行业标准以下简称“IAST标准”并于首届DevSecOps敏捷安全大会DSO 2021首次公开标准解读。目前中国信通院已完成首批评估测试悬镜灵脉IAST是全球首个通过该项专业测评认证的IAST工具。

自IAST标准发布起中国信通院同步启动了首批IAST工具的测试工作。依托标准要求中的34个功能指标项在统一并发的场景下进行性能检测记录。通过对测试结果分析发现各厂商IAST工具在以下三方面存在较大差异

1、对主流编程语言支持的覆盖率

2、对不同安全漏洞类型及结果的定义规范

3、配置缺陷和弱密码等低危漏洞或信息漏洞的检测结果。

其中首当其冲的是对主流编程语言的覆盖率问题。在IAST标准当中“支持的编程语言”被标定为全标准的第一条测试要求由此可见其重要性。IAST工具是否支持多种主流编程语言直接决定了其是否能适配客户各种各样的实际开发场景进而满足助力客户业务发展的需求。

广告考会计初级职称应怎样复习?×

多种编程语言的支持对用户的意义不是够不够好而是能不能用。如果用户核心业务使用的语言没有被IAST探针支持即使IAST产品有100分的其它功能对用户来说也是0分。

01、IAST工具介绍

IASTInteractive Application Security Testing, 交互式应用安全测试是应用程序在进行自动化测试、人工测试等任何与应用程序进行“交互”的同时能自动分析应用程序安全风险的技术。它可以实时返回结果因此不会额外增加CI/CD的时间。

相比于其他AST技术IAST只会分析“交互”产生时所影响到相关代码的安全风险而不是扫描所有代码、配置文件或遍历整个站点。IAST更适合在QA环节使用让安全团队在相对不影响开发、测试现有流程的情况下较早地发现应用程序中存在的安全风险。

需要注意的是与其他AST技术相比IAST还是一个比较新的概念其基于请求、代码数据流/控制流来综合分析应用程序的安全风险。IAST运行时插桩技术可以发现更多应用程序本身的安全弱点以及应用程序中第三方组件的公开漏洞。由于该技术针对不同语言需要研发不同的插桩探针因此对于厂商而来其IAST工具每增加对一种语言的支持即相当于开发一款新产品也就意味着IAST工具支持的编程语言越多厂商所需投入的人力成本和经济成本也就越大。

支持多种编程语言插桩是IAST技术未来发展的必然趋势原因在于不同行业由于属性不同对开发语言有特殊要求。例如金融行业普遍以Java语言为主互联网行业则是多语言环境的典型代表使用的语言五花八门Java占比较高同时也会使用Python、Go、Node.js、.Net等语言来适配多种业务场景。如此一款好的IAST工具支持多语言插桩是必要基础也是IAST工具厂商在技术上必然的拓展方向。

02、主流编程语言分析

截至2021年7月TIOBE发布的编程语言指数报告排在前十名的编程语言中常见的应用开发语言主要有Java、Python、C#、JavaScript、PHP这5种VB.Net 随着 .Net Core 和 .Net 5.0 的推出跨平台方面优势将不再明显因此不再讨论。

广告利兄:从哪些网站可以找到免费高清的ppt图片素材?×

根据TIOBE指数排行这里列出了百度指数、Google Trends以及Stack Overflow Trends近年内对Java、PHP、Node.js、Python、C#这些语言的热度检测趋势

广告python在金融,数据分析,和人工智能中的应用×广告会计两大必备技能:做账+报税!送你超实用秘籍,从入门到精通×广告【技术培训】创业,学习技术好选择×

通过对比上述各平台的趋势发现对着数据科学、人工智能等领域的兴起Python的热度扶摇直上。作为一种动态类型语言使用Python作为Web应用程序的主要开发语言可以在初期为项目节省大量的时间和成本。例如早期的YouTube、知乎平台等均使用Python作为主要的Web开发语言。

但是由于Python在多线程上的硬伤和动态类型语言后期不易维护的特点很多企业在完成初期的用户积累后都会选择使用一门静态类型的语言来重构他们的应用例如Java、C#或者Golang。

Java凭借其简单易懂的语言、活跃的社区支持、以及JVM优秀的跨平台支持使其成为全球使用最多、最广泛的Web应用程序编程语言。

C#背靠Microsoft凭借ASP.NET、Razor、良好的社区、宇宙级IDEVisual Studio再加上语法和Java、C等语言相近的特点也在Web应用程序编程语言中占有一席之地但在国内热度相对较低。

PHP 与 Python 一样也是一种动态类型语言。由于一定的历史原因PHP 作为“世界上最好的语言”在国内热度一直较高。低学习门槛、易于开发和部署的特点让很多企业选择使用 PHP 来编写公司官方网站或者与开放平台对接。

Node.js在严格意义上来说并非一门语言而是使用JavaScript引擎构建的平台。Java、C#契合Web应用程序开发的一部分原因是其能够和JavaScript/TypeScript友好地融合例如Jsp技术和Razor技术而Node.js作为直接使用JavaScript来构建的平台在这方面有天然优势。同时由于JavaScript引擎的更迭其效率越来越高加上原生支持异步处理等特点非常适合快速构建Web应用因此热度也在不断上涨。

目前国内面向互联网的Web应用程序主要以Java、PHP来编写内网应用则呈现出多元化的态势以快速实现功能为主要目标因此使用Python、Node.js、Golang、C# 来开发的应用占比也相对更高。

03、主流语言插桩原理简述

IAST 插桩探针想要分析数据流需要做两件事情。第一点是如何“理解”代码。我们需要根据不同语言来区分需要关注哪些函数这些函数里哪些是污点输入哪些是污点传播哪些是污点清洗以及又有哪些是污点汇聚这个我们可以根据不同的漏洞原理来做分析第二点我们如何捕获关键函数的调用情况这需要我们从各种语言底层做突破使得我们能读取到关键函数何时被调用、传入了什么参数、数据传递给了谁。下面将针对不同语言浅析 IAST 插桩捕获关键函数的原理。

广告环境工程,环境方面的顶级期刊有哪些?×

作为全球首款通过中国信通院交互式应用程序安全测试工具IAST能力认证的产品灵脉IAST是国内唯一支持Java、PHP、Node.js、Python、.Net、Go等全部主流语言的IAST工具其中各语言具体支持的部分中间件及框架如上图所示。以下将结合灵脉IAST工具简述主流语言插桩原理。

Java

如果语言本身提供了插桩的接口那么探针开发的难度将会大大降低。例如Java提供了一个instrumentation 接口。通过该接口可以以一种标准的方式在启动应用时添加javaagent参数来加载插桩探针从而实现动态数据流污点追踪。大致流程如下

广告初学c语言,有什么好书推荐?×

如图所示通过红色的JVM Agent路径就可以获取到Hello类中的方法何时被调用、接受到了哪些参数等信息。更进一步就可以阻断它的执行RASP的功能甚至修改它的执行逻辑。当然即便官方已经提供了标准做法让插桩探针的研究少走弯路但是构建成熟的Java探针并非易事。

除Java外其他一些语言也使用了JVM虚拟机例如Scala、Kotlin等这些语言的插桩原理比较类似不再赘述。

PHP

PHP Core使用C语言编写默认情况下PHP开发者使用的所有函数都在PHP Core和C中定义。当PHP程序在运行时有三个主要组件进行交互

l 用户代码用户自有代码、框架等

l 扩展数据库驱动、cURL等

l PHP Core。

PHP程序通常有如下两种主要运行方式

l Web模块如Apache mod_php

l 独立进程如PHP-FPM常用于与反向代理通信。

在PHP中没有多线程的概念每一个请求都会生成一个新的进程。因此很多PHP服务器上同时会处理成百上千个PHP进程。一个进程可以理解为一条请求。当一条请求进行PHP应用程序后将会经历如下生命周期

1、 MINIT模块初始化

2、 RINIT请求初始化

3、 执行响应PHP代码逻辑生成相应并返回

4、 RSHUTDOWN请求关闭

5、 MSHUTDOWN模块关闭

PHP插桩检测的主要方式是替换内部函数将原始请求暂存在特定的位置并触发探针分析分析引擎通过比对函数列表检索出被调用的函数并记录然后释放原始请求再以同样的方式继续执行分析之后的内容。流程如下

广告如何把自己的知识变现卖钱?一个小程序帮你搞定!×

如上图所示PHP插桩探针包装了原始函数就像安检一样你和你的行李原始数据需要通过安检仪器后才能进入下一阶段。但在早期的实践中我们发现过多的“安检”会造成很大的性能损失因此在灵脉IAST中研发团队针对性插桩关键函数配合主动验证功能在保证对业务影响最小的情况下实现高效检出。

Node.js

JavaScript的灵活性为Node.js动态插桩检测提供了便利。但是由于Node.js有着众多版本很多版本之间API变化很大因此对于不同Node.js版本插桩探针的构建将会有不少的坑要踩。对于Node.js插桩探针通常采用和 PHP 类似的方法 ——包装函数。要构建一个Node.js插桩探针至少需要从以下几个方面着手研究

1、跟踪导入的模块

2、构建包装器

3、构建Hooks。

首先由于Node.js导入模块时会将模块保存在本地位置如node_modules。通过require语句或者遍历本地模块目录可以检索出所有需要跟踪/监听的模块。然后根据上一步得到的模块列表针对性地筛选出需要包装的方法/函数。接着将构建的Hooks置于包装后的方法中。最后当Hooks被触发时调用引擎对其进行分析。至此分析引擎将能获取到原始数据根据需要我们可以对数据流进行阻断、处理、放行等操作。

与PHP不同的是在Node.js中导入模块是一个同步的操作添加一个跟踪器来跟踪模块导入的开销可以忽略不记。触发Hooks会影响代码逻辑的执行时间但这是不可避免的和PHP一样需要筛选出关键函数来进行监控。

Python

得益于Python内建的自省机制使得在Python上构建插桩探针变得安全可靠。和PHP、Node.js类似构建Python插桩探针的主要方法同样是包装底层函数。PEP 302提供了import hook的方式在被引用的模块被加载前就可以动态地对特定函数添加装饰器也避免了在其他位置重复引用而导致装饰器失效的糟心问题。

虽然对于使用Python定义的函数进行包装相对容易但在常用的CPython解释中很多类都是由C定义例如大多数的DB Driver。好在绝大多数的DB DriverSQLite、MySQL等都遵循 PEP 249 这样就有机会顺着DB Driver的调用链一路打补丁。对于未遵循DBApi2的DB DriverNoSQL等则需要更多的工作量。

.Net

众所周知.Net技术体系与Java高度重叠。表现在探针产品层面就是.Net探针与 Java探针在作用原理与产品架构上高度相似。所不同的是.Net CLR并未提供类似java.lang.instrument包那样易于使用的接口。实际上.Net探针的主要技术难度集中在如何像Java改写bytecode一样动态地改写JIT阶段的CIL编码。

在实际实现时.Net探针利用了CLR的Profiling接口通过C++实现一套类似JVM Instrumentation API的IL改写机构以将基于C#安全保障业务逻辑注入到关键方法之中。除去这套IL改写机构带来的麻烦外GAC、mscorlib/System.Private.CoreLib等 .Net特性都最终使得探针在形态上与前述各语言区别较大。

目前一场变革正在.Net技术世界中发生无论是转向开源的.Net Core还是作为“下一代”的.Net5/6都在底层上引入了不少变动。幸运的是在CLR层次上的变动仍然相对保守。因此目前探针同时具备对传统的 .Net Framework、.Net Core 与最新的 .Net 5/6 环境的适应性。之后我们也会持续跟踪该领域内的各项进展。

GO

Go 语言是近几年兴起的技术门类其核心优势在于开发/运行效率高、工具链完善且二进制易于部署。然而对这种直接编译为二进制的技术体系利用 Runtime 机制进行插桩的方式就不再有效。因而Go 探针在形态上与使用体验上与其他探针云泥之别。得益于Go的开源特性可以直接对Go工具链的源码进行改写。我们通过将 `go build`命令逻辑进行改写实现`xmirror-go build`命令即可在项目构建过程中将安全保障逻辑加入关键方法之中。

对Go语言的支持是灵脉IAST全覆盖主流编程语言的最后一公里灵脉IAST Go探针已进入测试验证阶段很快将在正式版产品中与大家见面。

04、灵脉IAST探针的特点

悬镜灵脉IAST在银行、证券、保险、能源、电力、运营商、智能制造及泛互联网等不同行业的复杂业务场景下进行了广泛的应用和落地实践沉淀出了高适配、低消耗高检出、低误报等综合技术优势。目前灵脉IAST探针具有以下特点

插桩规则动态更新插桩检测规则并非静态在探针内定义而是以动态的方式下检测规则集并且检测规则及规则集均支持自定义最大程度上避免误报、漏报的产生

无需修改现有代码无需修改现有代码只需在启动时添加参数应用插桩探针启动时加载或者在应用启动后通过进程IDpid动态加载热加载即可完成插桩

开源组件依赖分析运行时动态分析应用程序依赖链通过指纹、同源代码片段匹配等多种手段分析应用程序引入第三方开源组件的风险

性能优化经过大量客户验证对性能影响极小。并提供熔断开关当阶段内CPU占用超过设定时自动停用优先业务顺畅运行当CPU空闲时自动恢复工作

多功能探针主动插桩、被动插桩甚至RASP插桩共用同一个探针可以通过Web界面随时切换工作模式

脏数据处理主动模式下可通过Web界面上的开关控制是否释放脏数据

自动回归测试被动模式下可通过Web界面启动回归测试再次触发请求如果漏洞已修复将自动更新漏洞状态为“已修复”。

05、IAST语言支持的发展

从2012年首次被提出到近年成为软件安全领域的技术焦点IAST工具正在向规范化和规模化应用发展。随着IAST行业用户的快速增长对应用编程语言的覆盖率、IAST检测精度及业务全场景支持已成为评判IAST工具成熟度的主要标准。

目前对Java、PHP、Node.js、Python、.Net、Go等主流语言的覆盖率相比国内其他厂商仅支持一两款语言Contrast、悬镜安全和Synopsys处于全面领跑地位。对主流语言的覆盖率是当前绝大多数IAST工具需要在未来很长一段时间内持续弥补的技术短板。

广告如何学习嵌入式?嵌入式linux学习方法步骤。×