背 景
随着《数据安全法》和《个人信息保护法》在2021年的相继出台并施行,整个社会对个人信息保护与数据安全的重视程度达到了前所未有的高度。好大夫在线收录了国内正规医院的88多万名医生信息(其中24万名医生实名注册),已向全国7600万患者提供了线上医疗服务,累积了大量的健康信息、病情描述和病历处方等医疗健康数据(这些数据类型在GB/T 35273-2020《信息安全技术个人信息安全规范》被举例判定为个人敏感信息)。持续为用户提供安全、稳定的医疗服务,保护医生和患者的隐私,是好大夫在线运行和发展的基础,也是公司自成立以来就最为重视的事情之一。
根据Verizon(威瑞森)发布的《2021年数据泄露调查报告》来看,Web应用攻击仍然是数据泄露的最常见手段。好大夫安全团队在应用安全方面持续做了实践尝试,结合好大夫项目管理流程及研发模式,打造了好大夫的SDL架构体系。从管理规范、安全活动、安全工具等几方面来提升安全工程能力,贯穿于项目开发流程中。
好大夫在线SDL架构体系,经历了安全人员徒手漏洞挖掘、静态应用程序安全测试、利用安全测试用例集将安全融入功能测试、基于轻量级安全评估开展半自动化黑盒测试、基于开源IAST打造 CI/CD黄金管道流水线等各种措施。从适用场景、开发模式、准确度、覆盖度、投入产出等几方面因素综合考虑,使用开源IAST解决非逻辑安全漏洞是值得推崇的。本文将重点阐述针对开源IAST在应用过程中的容器环境适配、性能提升改造以及在应用系统CI/CD流水线的自动化集成部署实践经验,希望对此领域感兴趣的同学能够起到一定的借鉴作用。
IAST:交互式应用程序安全测试(Interactive Application Security Testing),是一种实时动态交互的漏洞检测技术,通过在应用程序服务端部署Agent程序,收集、监控Web应用程序运行时函数执行、数据传输,并与扫描器端进行实时交互,高效、准确地识别安全缺陷及漏洞。IAST最显著的特性是它使用插桩方式来收集安全相关信息,持续地从内部监控应用程序运行过程中的代码安全缺陷,在整个开发生命周期中实时地提供报警。
好大夫在线产品开发采用小瀑布 + 部分敏捷实践模式,产品迭代速度很快。许多项目按周、天、甚至小时部署上线代码。SAST(静态源代码安全检测)、DAST(动态应用安全测试)、人工渗透测试、人工安全代码审计无法满足应用开发上线的速度和代码规模。同时SAST工具检测误报率高,DAST工具覆盖率差,并且都需要大量人力进行二次验证,无法完美适配CI/CD自动化流水线。IAST的以下几大优势则可以解决这些困局:
经过调研,洞态IAST具有准确率高、易安装部署、完全开源等特点,使用应用程序运行时数据流分析,进而识别可被利用的安全漏洞。最终我们选择使用洞态IAST作为好大夫的灰盒测试工具。
洞态IAST采用轻代理,重服务端的技术架构。具体架构及原理如下:Web服务器上安装 IAST Agent,用户(开发、测试或安全人员)对web服务发起功能性访问后,Agent 便开始采集访问数据,并与 OpenAPI 服务通信上报数据和Hook规则的拉取。OpenAPI 将数据存储到数据库中(MySQL 和 Redis),Engine 会在分析后这些数据后,识别漏洞信息并保存下来。安全人员可以通过WebAPI来查看漏洞信息。
洞态IAST基于“值匹配算法”和“污点跟踪算法”对漏洞进行检测。这种算法检测准确率高,无需采集和重放流量,不会产生脏数据,可以适配各种场景下的漏洞检测(如 API 网关、分布式、微服务等架构下的后端服务漏洞检测)。
IAST在好大夫的演进
IAST改造优化
在好大夫容器环境中部署洞态IAST并不能直接使用,需要做一系列的改造优化,以解决兼容和性能问题。因为IAST的测试依赖测试的流量,如果测试的流量打的不全,那么会导致某些面覆盖不到,从而导致漏报。因为IAST采用的是插桩的串行方式,所以可能会出现性能等问题。
好大夫在线容器环境使用了自定义的RPC协议,我们发现原生的IAST Agent不兼容RPC协议。通过排查发现环境中的RPC协议有一个自定义的Host头,在高版本的JDK中,如果不人工进行设置,这些头都不能进行重新赋值。
因为这块代码放在了静态块,静态块只会初始化一次。IAST Agent在最开始会初始化httpurlconnection类进行其他Agent包的下载,所以导致了RPC调用不通。
容器环境全量部署IAST Agent后,发现整体性能有一定下降,测试同学也反馈应用系统响应慢,无法满足功能和验收测试的要求。经过对IAST Agent的分析后,发现其心跳检测每秒钟就会发送一次,如果环境中存在大量的Agent,IAST Server就需要处理大量的心跳,导致报告队列经常出现积压,从而使IAST Server和应用服务响应速度变慢,整体拖慢了性能。心跳检测接口不存在安全漏洞,可以通过过滤心跳包来减轻IAST Server和应用服务的压力。与此同时我们也发现测试同学会经常进行性能测试,发送大量的测试报文,导致IAST Server非常慢,这些多余的性能测试包对漏洞分析没有帮助,所以也需要过滤掉性能测试的请求。下图为在没有过滤相关数据前的报告队列经常出现积压,导致IAST Server和应用服务变慢。
前面的url代表心跳的包,也就是url中存在此url不检测,标志位为1;
isTest 表示出现此头,我们就不检测,标志位为2;
IAST与SDL融合
为了进一步提升部署效率,实现自动化集成部署,我们将IAST与现有应用系统CI/CD流水线进行融合,同时考虑到Agent发生异常时,需要及时将Agent关停下线,避免对应用产生影响,我们制定了降级方案,在服务发布前设置了一个“开关”,可以及时进行降级。最终打造出应用与安全相结合的CI/CD黄金管道流水线。
为了提高部署效率,以及后续推广的便捷,我们将IAST Agent打包通过gitlab提交代码后生成如下展示版本号,以便Jenkins构建镜像时可直接调用。
考虑到IAST可能出现的异常情况,基于应用环境稳定性考虑,在容器管理平台服务发布前设置了一个“开关”,如果Agent出现故障,应急处理人员可将标签改为java,重新发版,Jenkins在构建镜像时将不再打包IAST Agent,及时避免影响,实现彻底降级处理。
下图为好大夫目前集成开源IAST的流程图。在项目立项以后进入需求评审,安全人员参与评审后决定是否需要评估此项目,然后开发人员进行编码,编码后提交gitlab会进行白盒扫描,结果反馈给安全人员,安全人员跟进检测结果。当测试人员通过ops系统进行测试环境的应用发版时候,IAST Agent会与开发人员提交的应用代码合并打包镜像,应用发版后IAST Agent会自动进行注册,通过采集分析功能测试数据自动化测试安全漏洞,若发现漏洞会将结果发送给安全人员确认。至此IAST就融入了现有的CI/CD流程中。
在SDL中加入开源IAST覆盖后端开发语言,提早融入测试环节,开展功能测试的同时完成安全扫描,极大提升了效率,洞态IAST在好大夫SDL架构体系中扮演着重要的角色。开源IAST技术已可以在企业应用安全建设中发挥作用,但还有很多功能需要完善,下面是对IAST的几点的技术展望。
与黑盒工具结合
IAST与黑盒工具结合,进行联动测试,可以弥补各个AST的缺点,能够更加准确全面地发现漏洞。比如一些越权检测,对于一些中台的系统来说,本身的设计就无鉴权,鉴权在前端的controller层做,这时候使用IAST来做的话会明显出现弊端,所以对于IAST来说做到链路的跟踪,然后来联合黑盒一起做,能够取得不错的效果。
对于一些庞大的应用系统,由于IAST采用的是插桩方式,会侵入代码内部,并且需要与IAST Server不断地通讯,会造成对Server端和Agent端的压力变大,使应用程序端变慢,所以这部分需要更加细致的优化。
IAST应丰富敏感信息检测的规则模型,能够在应用开发过程中发现应用对个人敏感信息的传输、处理、存储方式并进行监测跟踪,辅助分析敏感信息暴露面及信息泄露风险点。
由于应用系统开发人员会针对特定的漏洞写一些安全过滤功能,这一点IAST还不能准确识别。安全人员针对这种情况需要结合内部使用的框架、程序员的编码习惯来开展定制化运营,过滤掉一些常见的规则减少误报。
作者简介:
伍雄:好大夫在线安全工程师,善于代码审计、安全开发,主要负责好大夫-SDL安全体系建设。
你也「在看」吗?👇