技术干货 | 解构开源IAST 打造好大夫安全灰盒利器

admin 2022年4月13日22:21:13评论161 views字数 4854阅读16分10秒阅读模式

本公众号发布的文章均转载自互联网或经作者投稿授权的原创,文末已注明出处,其内容和图片版权归原网站或作者本人所有,并不代表安世加的观点,若有无意侵权或转载不当之处请联系我们处理,谢谢合作!


欢迎各位添加微信号:asj-jacky

加入安世加 交流群 和大佬们一起交流安全技术


1 背景

着《数据安全法》和《个人信息保护法》在2021年的相继出台并施行,整个社会对个人信息保护与数据安全的重视程度达到了前所未有的高度。好大夫在线收录了国内正规医院的88多万名医生信息(其中24万名医生实名注册),已向全国7600万患者提供了线上医疗服务,累积了大量的健康信息、病情描述和病历处方等医疗健康数据(这些数据类型在GB/T 35273-2020《信息安全技术个人信息安全规范》被举例判定为个人敏感信息)。持续为用户提供安全、稳定的医疗服务,保护医生和患者的隐私,是好大夫在线运行和发展的基础,也是公司自成立以来就最为重视的事情之一。

根据Verizon(威瑞森)发布的《2021年数据泄露调查报告》来看,Web应用攻击仍然是数据泄露的最常见手段。好大夫安全团队在应用安全方面持续做了实践尝试,结合好大夫项目管理流程及研发模式,打造了好大夫的SDL架构体系。从管理规范、安全活动、安全工具等几方面来提升安全工程能力,贯穿于项目开发流程中。

技术干货 | 解构开源IAST 打造好大夫安全灰盒利器


好大夫在线SDL架构体系,经历了安全人员徒手漏洞挖掘、静态应用程序安全测试、利用安全测试用例集将安全融入功能测试、基于轻量级安全评估开展半自动化黑盒测试、基于开源IAST打造 CI/CD黄金管道流水线等各种措施。从适用场景、开发模式、准确度、覆盖度、投入产出等几方面因素综合考虑,使用开源IAST解决非逻辑安全漏洞是值得推崇的。本文将重点阐述针对开源IAST在应用过程中的容器环境适配、性能提升改造以及在应用系统CI/CD流水线的自动化集成部署实践经验,希望对此领域感兴趣的同学能够起到一定的借鉴作用。


2 IAST探究

IAST:交互式应用程序安全测试(Interactive Application Security Testing),是一种实时动态交互的漏洞检测技术,通过在应用程序服务端部署Agent程序,收集、监控Web应用程序运行时函数执行、数据传输,并与扫描器端进行实时交互,高效、准确地识别安全缺陷及漏洞。IAST最显著的特性是它使用插桩方式来收集安全相关信息,持续地从内部监控应用程序运行过程中的代码安全缺陷,在整个开发生命周期中实时地提供报警。


2.1 我们为什么需要IAST?

好大夫在线产品开发采用小瀑布 + 部分敏捷实践模式,产品迭代速度很快。许多项目按周、天、甚至小时部署上线代码。SAST(静态源代码安全检测)、DAST(动态应用安全测试)、人工渗透测试、人工安全代码审计无法满足应用开发上线的速度和代码规模。同时SAST工具检测误报率高,DAST工具覆盖率差,并且都需要大量人力进行二次验证,无法完美适配CI/CD自动化流水线。IAST的以下几大优势则可以解决这些困局:

  • 准确性:传统黑盒/白盒扫描工具误报率非常高,因此需要投入大量人力去验证漏洞,IAST的最大优势是降低漏洞误报率,提高项目中自动化漏洞发现的准确性;

  • 敏捷性现代软件开发模型融合了敏捷模式和DevOps理念,迭代速度快。IAST弥补了传统工具耗时久的不足,让开发和测试人员在执行功能测试的同时,无感知的完成安全测试;

  • 流程适合IAST多部署在测试环境中,在测试早期阶段,IAST已经开始工作,在功能测试过程中发现安全问题,及时修复处理,实现安全左移;

  • 覆盖度高在做API接口安全测试时,很容易漏掉一些隐藏较深的接口,IAST在服务端部署Agent程序收集测试数据,可以完全覆盖功能测试的所有接口,提高安全测试覆盖面。

经过调研,洞态IAST具有准确率高、易安装部署、完全开源等特点,使用应用程序运行时数据流分析,进而识别可被利用的安全漏洞。最终我们选择使用洞态IAST作为好大夫的灰盒测试工具。


2.2 洞态IAST架构及原理

洞态IAST采用轻代理,重服务端的技术架构。具体架构及原理如下:Web服务器上安装 IAST Agent,用户(开发、测试或安全人员)对web服务发起功能性访问后,Agent 便开始采集访问数据,并与 OpenAPI 服务通信上报数据和Hook规则的拉取。OpenAPI 将数据存储到数据库中(MySQL 和 Redis),Engine 会在分析后这些数据后,识别漏洞信息并保存下来。安全人员可以通过WebAPI来查看漏洞信息。

洞态IAST Agent端仅用于实现数据监听,漏洞检测全部在Server端完成。这样的好处是Agent端的代码逻辑简单,单点故障率更低也极少需要升级,降低了维护成本。另外,将检测数据保存在Server端后,当产品出现新的检测策略后可以轻松在Server端进行回归测试,进而可以发现新的漏洞。

技术干货 | 解构开源IAST 打造好大夫安全灰盒利器

 

洞态IAST基于“值匹配算法”和“污点跟踪算法”对漏洞进行检测。这种算法检测准确率高,无需采集和重放流量,不会产生脏数据,可以适配各种场景下的漏洞检测(如 API 网关、分布式、微服务等架构下的后端服务漏洞检测)。


3 IAST在好大夫的演进

3.1 IAST改造优化

在好大夫容器环境中部署洞态IAST并不能直接使用,需要做一系列的改造优化,以解决兼容和性能问题。因为IAST的测试依赖测试的流量,如果测试的流量打的不全,那么会导致某些面覆盖不到,从而导致漏报。因为IAST采用的是插桩的串行方式,所以可能会出现性能等问题。


3.1.1 RPC适配改造

好大夫在线容器环境使用了自定义的RPC协议,我们发现原生的IAST Agent不兼容RPC协议。通过排查发现环境中的RPC协议有一个自定义的Host头,在高版本的JDK中,如果不人工进行设置,这些头都不能进行重新赋值。


技术干货 | 解构开源IAST 打造好大夫安全灰盒利器



因为这块代码放在了静态块,静态块只会初始化一次。IAST Agent在最开始会初始化httpurlconnection类进行其他Agent包的下载,所以导致了RPC调用不通。


技术干货 | 解构开源IAST 打造好大夫安全灰盒利器


 
随后我们给洞态提交了issue后,修复此bug。

技术干货 | 解构开源IAST 打造好大夫安全灰盒利器


 

3.1.2 Agent性能优化

容器环境全量部署IAST Agent后,发现整体性能有一定下降,测试同学也反馈应用系统响应慢,无法满足功能和验收测试的要求。经过对IAST Agent的分析后,发现其心跳检测每秒钟就会发送一次,如果环境中存在大量的Agent,IAST Server就需要处理大量的心跳,导致报告队列经常出现积压,从而使IAST Server和应用服务响应速度变慢,整体拖慢了性能。心跳检测接口不存在安全漏洞,可以通过过滤心跳包来减轻IAST Server和应用服务的压力。与此同时我们也发现测试同学会经常进行性能测试,发送大量的测试报文,导致IAST Server非常慢,这些多余的性能测试包对漏洞分析没有帮助,所以也需要过滤掉性能测试的请求。下图为在没有过滤相关数据前的报告队列经常出现积压,导致IAST Server和应用服务变慢。


技术干货 | 解构开源IAST 打造好大夫安全灰盒利器

 
所以基于以上两点原因我们对IAST Agent更新了一个feature。

技术干货 | 解构开源IAST 打造好大夫安全灰盒利器


 
只需要维护更新blackurl.txt,就可以做到对于心跳包和性能测试的数据包不检测。对于性能测试我们自定义了一个http header用于标识,只要带着这个header,IAST Agent就不会采集数据进行上报。

  • 前面的url代表心跳的包,也就是url中存在此url不检测,标志位为1;

  • isTest 表示出现此头,我们就不检测,标志位为2;


技术干货 | 解构开源IAST 打造好大夫安全灰盒利器

 

洞态对Java Agent 进行更新,增加请求管理的功能,针对性能测试和健康检查的 API 请求,业务方配置特定的 URL 或Header 头,Java Agent 对这些请求进行 Bypass,避免这类请求带来的性能损耗和IAST Server 端计算的资源消耗。优化后我们的IAST Server队列几乎没有出现积压的消息,IAST Server端和应用服务的速度也得到了显著的提高。

技术干货 | 解构开源IAST 打造好大夫安全灰盒利器


 

3.2 IAST与SDL融合

为了进一步提升部署效率,实现自动化集成部署,我们将IAST与现有应用系统CI/CD流水线进行融合,同时考虑到Agent发生异常时,需要及时将Agent关停下线,避免对应用产生影响,我们制定了降级方案,在服务发布前设置了一个“开关”,可以及时进行降级。最终打造出应用与安全相结合的CI/CD黄金管道流水线。


3.2.1 自动化部署

为了提高部署效率,以及后续推广的便捷,我们将IAST Agent打包通过gitlab提交代码后生成如下展示版本号,以便Jenkins构建镜像时可直接调用。


技术干货 | 解构开源IAST 打造好大夫安全灰盒利器

 
在测试容器环境进行服务发布时选择java_gray标签,Jenkins在构建镜像时会自动带上gitlab上已经打包好的Agent,实现自动化部署。

技术干货 | 解构开源IAST 打造好大夫安全灰盒利器

 

3.2.2 降级策略

考虑到IAST可能出现的异常情况,基于应用环境稳定性考虑,在容器管理平台服务发布前设置了一个“开关”,如果Agent出现故障,应急处理人员可将标签改为java,重新发版,Jenkins在构建镜像时将不再打包IAST Agent,及时避免影响,实现彻底降级处理。


技术干货 | 解构开源IAST 打造好大夫安全灰盒利器


 

3.2.3 集成方案

下图为好大夫目前集成开源IAST的流程图。在项目立项以后进入需求评审,安全人员参与评审后决定是否需要评估此项目,然后开发人员进行编码,编码后提交gitlab会进行白盒扫描,结果反馈给安全人员,安全人员跟进检测结果。当测试人员通过ops系统进行测试环境的应用发版时候,IAST Agent会与开发人员提交的应用代码合并打包镜像,应用发版后IAST Agent会自动进行注册,通过采集分析功能测试数据自动化测试安全漏洞,若发现漏洞会将结果发送给安全人员确认。至此IAST就融入了现有的CI/CD流程中。


技术干货 | 解构开源IAST 打造好大夫安全灰盒利器

 

3.2.4 运行效果

洞态IAST在好大夫测试环境部署完成后,经过一段时间的试点推广,已接入大部分JAVA应用系统,在此过程中没有发生因IAST Agent导致测试环境性能瓶颈和其他应用系统故障。洞态IAST上线后,发现了一部分高质量安全漏洞,通过后台提供的污点流图中的污点来源和传播方法,结合源代码来确认定位安全漏洞。


技术干货 | 解构开源IAST 打造好大夫安全灰盒利器


 

4 IAST技术展望

在SDL中加入开源IAST覆盖后端开发语言,提早融入测试环节,开展功能测试的同时完成安全扫描,极大提升了效率,洞态IAST在好大夫SDL架构体系中扮演着重要的角色。开源IAST技术已可以在企业应用安全建设中发挥作用,但还有很多功能需要完善,下面是对IAST的几点的技术展望。


4.1 与黑盒工具结合

IAST与黑盒工具结合,进行联动测试,可以弥补各个AST的缺点,能够更加准确全面地发现漏洞。比如一些越权检测,对于一些中台的系统来说,本身的设计就无鉴权,鉴权在前端的controller层做,这时候使用IAST来做的话会明显出现弊端,所以对于IAST来说做到链路的跟踪,然后来联合黑盒一起做,能够取得不错的效果。


4.2 性能优化

对于一些庞大的应用系统,由于IAST采用的是插桩方式,会侵入代码内部,并且需要与IAST Server不断地通讯,会造成对Server端和Agent端的压力变大,使应用程序端变慢,所以这部分需要更加细致的优化。


4.3 隐私检测能力

IAST应丰富敏感信息检测的规则模型,能够在应用开发过程中发现应用对个人敏感信息传输、处理、存储方式并进行监测跟踪,辅助分析敏感信息暴露面及信息泄露风险点。


4.4 减少误报

由于应用系统开发人员会针对特定的漏洞写一些安全过滤功能,这一点IAST还不能准确识别。安全人员针对这种情况需要结合内部使用的框架、程序员的编码习惯来开展定制化运营,过滤掉一些常见的规则减少误报。

 
 
 
------- END -------



【作者简介】
  • 伍雄:好大夫在线安全工程师,善于代码审计、安全开发,主要负责好大夫-SDL安全体系建设。

原文始发于微信公众号(安世加):技术干货 | 解构开源IAST 打造好大夫安全灰盒利器

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月13日22:21:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   技术干货 | 解构开源IAST 打造好大夫安全灰盒利器http://cn-sec.com/archives/907043.html

发表评论

匿名网友 填写信息