0%

悬镜技术分享笔记——灰盒测试

悬镜的一个技术分享会,大致讲了三种IAST的实现,这里做一个笔记总结。

IAST简介

IAST (Interactive Application Security Testing) 也叫灰盒测试,即介于白盒和黑盒之间的一种测试,这一场景下的技术不但关注程序输入输出信息(像黑盒程序那样),还可以(注意只是可以,后面会细说)了解部分程序内部逻辑(像白盒测试那样)。因此具备黑白盒测试的优点,被认为是下一代安全扫描技术,被各个行业所关注。许多黑白盒测试技术稍加改造和结合,就可以变为灰盒测试技术。

Image

与RASP的关系

RASP(Runtime Application Self-protection)是指在程序运行时对程序行为进行保护,可以看做是一个精确到函数级别的WAF,个人认为RASP是IAST的一部分,两者使用的技术是有重叠的,比如说后文提到的基于插桩的IAST实现。

IAST分类

在大方向上,主要有两种,而在插桩技术实现时又会有分支:

  • 基于流量
  • 基于插桩
    • 主动型IAST
    • 被动型IAST

基于流量的IAST

基于流量的IAST是指通过爬虫+被动式黑盒扫描器实现的IAST技术,比如说crawlergo+xray的配置,这类技术的主要优势在于:

  1. 基于现成技术,改造简单

  2. 不限语言,技术通用

  3. 扫描报告可以直接用于漏洞验证和利用

  4. 相较于插桩能扫描更多类型漏洞(如BAC)

基于插桩的IAST

基于插桩的IAST主要是利用代码插桩技术,在目标应用的关键类、方法中插入检测逻辑,如在Java中,可以用字节码操作框架(如:ASM、Javaassist、Aspectj等)修改类和方法,通过程序反馈检测程序漏洞,这类技术的优势在于:

  1. 无需重放、无脏数据
  2. 更高的准确性
  3. 解决签名校验、限制数据重放等问题

主动型IAST

主动型IAST是指仍然保留黑盒扫描器,只在安全敏感函数(污点分析中的sink )上插桩,通过检测函数参数是否是预定义的payload,检查程序是否有漏洞,如下图,agent端可以检测到扫描器发来的payload已经作为executeQuery()的参数,因此报告漏洞,或是拦截(RASP)。插桩程序可以同时拿到返回函数调用栈、代码行号以及请求数据。

主动型IAST

被动型IAST

被动型IAST是指使用动态污点分析技术,不需要扫描端,直接判断敏感参数是否为用户可控。个人认为是技术难度最高的一种IAST,因为插桩程序需要实现动态污点分析逻辑,实时监控程序污点数据变化,检测污点是否由source传播到sink点。

如下图所示,通过污点分析,用户产生的输入可以直接产生漏洞报告:

被动型IAST

被动型IAST的好处在于其完全不会影响正常业务,并且大大提高扫描覆盖率,然而个人认为动态污点传播也会有过污染和欠污染问题,并且其本身并不能很好的处理分支覆盖问题,可以说在这一方面还存在着诸多挑战。

总结

分享会因为有些涉及到技术细节,大佬还是有所保留,不过大致理清楚了IAST的三大工作模式和对应的技术,算是一次科普性的分享,感谢宁戈大佬!