Ostorlab 的检测引擎
Ostorlab 所提供检测能力的概览
Ostorlab 的漏洞检测技术依赖于 3 个关键组件:静态分析引擎、动态与行为分析引擎,以及后端分析引擎。

静态分析引擎执行以下功能:
-
配置检查:例如检查应用是否禁用了调试模式、是否具有正确的生产环境框架设置(如安全的 Apache Cordova 白名单),或是否具有安全的网络安全策略。
-
依赖检查:重点识别依赖项及其版本,既可以通过某些框架贴心提供的版本文件,也可以通过在二进制文件中检索由 Ostorlab 团队手工编写的特定标识符来实现。随后会扫描这些依赖项是否存在已知漏洞。
-
污点分析:Ostorlab 提供的高级且独特的功能之一,是一个高性能、可用于生产环境的污点分析引擎。该引擎覆盖 Android 字节码等一系列技术,能够对整个应用进行分析,搜寻隐藏在数十层方法调用之后的漏洞。这些漏洞包括使用不安全的加密(如使用 ECB 分组模式或 DES 算法)、通过 URL scheme 或 Content Provider 暴露的 SQL 注入,以及通过 Service 或 Content Provider 暴露的命令执行。

动态分析引擎执行以下几项操作:
-
应用准备:重新打包应用以便分析,包括启用调试模式、对应用重新签名,以及禁用可能妨碍分析的问题检查。
-
设备准备:将应用安装到真机上,并将应用设置为等待调试器连接,Android 和 iOS 均适用。Ostorlab 依靠真机来保证性能和可复现性。
-
调试协议分析:使用 JDWP 或 LLDB 等调试协议对应用进行插桩。Ostorlab 维护着自己的技术栈,从而能够在底层与应用交互。插桩是指在关键 API 上设置跟踪点,这些 API 被称为 source(不可信输入的来源)和 sink(可能导致漏洞的位置)。出于稳定性和可扩展性的考虑,Ostorlab 依靠调试协议进行分析,而不是采用内存内分析。与通过操作内存来 Hook API 相比,调试协议的风险更低,而且在新的操作系统版本中也能保持稳定。调试协议会拖慢应用,带来性能损耗,但在漏洞检测的场景下,这种损耗仍是可以接受的。可扩展性则来自调试器所提供的功能,例如理解 Swift 或 Objective-C 的内存布局,从而可以编写清晰简洁的插桩代码。
-
跟踪与分析:实时收集跟踪数据并分析其中已知的漏洞模式,例如以不安全的方式调用加密 API,或使用硬编码密钥。此步骤还会通过直接 Hook TLS/SSL API 和 Socket API 来收集流量。这种方法可以绕过 SSL Pinning。收集到的流量随后被发送到后端分析引擎,报告示例请见此处。
-
Monkey 测试:测试 Monkey 开始与应用交互,或者使用一组启发式规则来检测身份验证页面,或者在应用中随机点击。对于复杂的界面交互,则使用 BDD 编写 UI 自动化规则来编排交互过程。


后端分析引擎依靠动态分析来收集流量,然后执行以下操作:
-
被动检测:通过分析请求和响应的属性(如正文和标头)来发现漏洞,例如缺失的 Cookie 属性、不安全的 CORS、根据推断出的版本识别存在漏洞的组件等。
-
主动检测:Ostorlab 作为一款移动优先的安全扫描器,专注于理解移动应用中常用的多种序列化协议,例如 GraphQL 或 Protobuf。我们会对这些序列化协议进行模糊测试,以发现 SQL 注入、XXE、模板注入等漏洞。
这些阶段并非按顺序执行,因为每个阶段背后都有多个专门负责特定任务的微型 Agent。这些 Agent 通过共享总线进行通信,并采用基于事件的架构。
在每一项分析过程中,都会收集各种产物,例如应用截图、设备日志和反编译后的源代码。

这三个分析引擎全面覆盖了应用的攻击面,并弥补了每种分析单独使用时固有的不足。例如,静态分析能很好地覆盖应用的攻击面,但同时可能因复杂的执行路径或死代码而产生误报。动态分析通过观察真实行为,产生的误报要少得多,但无法保证完全覆盖应用的攻击面;而后端分析则检测后端固有的漏洞,在大多数情况下,该后端是专门为移动应用服务的。