OpenRASP浅析
字数 2163 2025-08-26 22:11:45

OpenRASP 技术深度解析与教学文档

一、RASP 技术概述

1.1 RASP 定义

RASP(Runtime Application Self-Protection)即运行时应用程序自我保护技术,通过JavaAgent将代码注入到应用程序方法中,使应用程序具备实时检测和阻断安全攻击的能力。

1.2 RASP 与 WAF 对比

特性 WAF RASP
防护层面 网络层 应用层
检测方式 特征匹配 代码行为分析
检测时机 HTTP请求阶段 代码执行阶段
误报率 较高 较低
性能影响 较小 较大
栈堆信息 无法获取 可获取详细调用栈

1.3 相关安全测试技术

  • DAST:动态应用程序安全测试,模拟黑客行为进行攻击测试
  • SAST:静态应用程序安全测试,分析源代码或二进制文件
  • IAST:交互式应用程序安全测试,结合DAST和SAST的优势

二、OpenRASP 架构设计

2.1 系统架构

OpenRASP Java版本采用JavaAgent机制实现,主要组件:

  1. Agent模块:负责初始化和加载
  2. Engine模块:核心检测引擎
  3. JS插件系统:基于V8引擎的检测规则

2.2 技术特点

  • 使用V8引擎加载JS并实现热加载
  • 支持多语言(PHP、.NET、NodeJS等)
  • 通过编写JS规则进行攻击检测

三、OpenRASP 启动流程

3.1 初始化阶段

public static void premain(String agentArg, Instrumentation inst) {
    init(START_MODE_NORMAL, START_ACTION_INSTALL, inst);
}
  1. Bootstrap加载:通过appendToBootstrapClassLoaderSearch将自身添加到BootstrapClassLoader
  2. 模块加载:加载rasp-engine.jar并初始化引擎
  3. 版本信息读取:获取MANIFEST.MF中的版本信息

3.2 引擎启动

private void initTransformer(Instrumentation inst) throws UnmodifiableClassException {
    transformer = new CustomClassTransformer(inst);
    transformer.retransform();
}
  1. V8引擎初始化:加载JS解释器
  2. 配置加载:初始化日志、云控等配置
  3. 插件系统:加载plugins目录下的JS检测规则
  4. 文件监控:实现JS规则热更新

四、Hook 机制实现

4.1 Hook 原理

  1. 使用JavaAgent的Instrumentation API
  2. 通过Javassist进行字节码修改
  3. 在敏感方法前后插入检测代码

4.2 Hook 流程

  1. 类匹配:通过isClassMatched判断是否需要Hook
  2. 字节码修改:使用transformClass方法插入检测代码
  3. 类重定义:加载修改后的字节码

4.3 典型Hook示例

以SSRF检测为例:

protected void hookMethod(CtClass ctClass) throws IOException, CannotCompileException, NotFoundException {
    // 检查是否实现HttpClient接口
    if (inter.getName().equals("org.apache.http.client.HttpClient")) {
        // 获取execute方法
        LinkedList<CtBehavior> methods = getMethod(ctClass, "execute", null, null);
        // 插入检测代码
        String afterSrc = getInvokeStaticSrc(HttpClientHook.class, "exitCheck", "$1,$_", Object.class, Object.class);
        // 根据参数类型插入不同检测
        if (method.getSignature().startsWith("(Lorg/apache/http/client/methods/HttpUriRequest")) {
            String src = getInvokeStaticSrc(HttpClientHook.class, "checkHttpUri", "$1", Object.class);
            insertBefore(method, src);
            insertAfter(method, afterSrc, true);
        }
    }
}

五、检测流程分析

5.1 检测调用链

  1. AbstractSSRFHook.checkHttpUrl()
  2. HookHandler.doCheck()
  3. HookHandler.doCheckWithoutRequest()
  4. HookHandler.doRealCheckWithoutRequest()
  5. CheckerManager.check()
  6. AbstractChecker.check()
  7. V8AttackChecker.checkParam()
  8. JS.Check()
  9. V8.Check()

5.2 检测类型

OpenRASP支持三种检测方式:

  1. JS插件检测:通过V8引擎执行JS检测规则
  2. Java本地检测:直接调用Java代码检测
  3. 安全基线检测:检查服务器配置安全性

六、插件系统设计

6.1 JS插件加载

  1. 读取plugins目录下所有JS文件
  2. 过滤大于10MB的文件
  3. 加载到V8引擎中
  4. 使用commonLRUCache实现并发幂等

6.2 热更新机制

  1. 初始化JnotifyWatcher文件监控
  2. 监控JS文件变更
  3. 文件变化时重新加载所有插件

七、性能与安全考量

7.1 性能优化

  1. CPU使用率超过90%时禁用所有Hook点
  2. 使用缓存机制减少重复检测
  3. 异步检测减少对业务影响

7.2 安全防护

  1. 云控注册成功前不进入任何Hook点
  2. 白名单机制
  3. 详细的攻击日志记录

八、开发实践指南

8.1 添加新Hook点

  1. 创建继承AbstractClassHook的类
  2. 添加@HookAnnotation注解
  3. 实现isClassMatched方法
  4. 实现hookMethod方法插入检测代码

8.2 编写JS检测规则

  1. 在plugins目录下创建JS文件
  2. 实现检测逻辑
  3. 定义攻击类型和参数处理

九、潜在绕过方式

  1. CPU负载攻击:使CPU超过90%禁用Hook
  2. 未注册云控:在云控注册前执行攻击
  3. 线程绕过:在新线程中执行危险操作
  4. 全局开关:尝试关闭RASP检测
  5. 未Hook的底层函数:使用非常用危险函数

十、总结与展望

OpenRASP作为开源的RASP实现,通过Hook敏感操作和JS插件系统提供了灵活的攻击检测能力。其架构设计考虑了性能、安全性和扩展性,是应用运行时防护的优秀解决方案。

未来发展方向:

  1. 更多语言的全面支持
  2. 性能优化降低开销
  3. 更智能的检测规则
  4. 云原生环境适配

参考资源

  • OpenRASP官方文档
  • 《OpenRASP学习笔记》- turn1tup
  • 《OpenRASP核心源码浅析》- threedr3am
OpenRASP 技术深度解析与教学文档 一、RASP 技术概述 1.1 RASP 定义 RASP(Runtime Application Self-Protection)即运行时应用程序自我保护技术,通过JavaAgent将代码注入到应用程序方法中,使应用程序具备实时检测和阻断安全攻击的能力。 1.2 RASP 与 WAF 对比 | 特性 | WAF | RASP | |------|-----|------| | 防护层面 | 网络层 | 应用层 | | 检测方式 | 特征匹配 | 代码行为分析 | | 检测时机 | HTTP请求阶段 | 代码执行阶段 | | 误报率 | 较高 | 较低 | | 性能影响 | 较小 | 较大 | | 栈堆信息 | 无法获取 | 可获取详细调用栈 | 1.3 相关安全测试技术 DAST :动态应用程序安全测试,模拟黑客行为进行攻击测试 SAST :静态应用程序安全测试,分析源代码或二进制文件 IAST :交互式应用程序安全测试,结合DAST和SAST的优势 二、OpenRASP 架构设计 2.1 系统架构 OpenRASP Java版本采用JavaAgent机制实现,主要组件: Agent模块 :负责初始化和加载 Engine模块 :核心检测引擎 JS插件系统 :基于V8引擎的检测规则 2.2 技术特点 使用V8引擎加载JS并实现热加载 支持多语言(PHP、.NET、NodeJS等) 通过编写JS规则进行攻击检测 三、OpenRASP 启动流程 3.1 初始化阶段 Bootstrap加载 :通过 appendToBootstrapClassLoaderSearch 将自身添加到BootstrapClassLoader 模块加载 :加载rasp-engine.jar并初始化引擎 版本信息读取 :获取MANIFEST.MF中的版本信息 3.2 引擎启动 V8引擎初始化 :加载JS解释器 配置加载 :初始化日志、云控等配置 插件系统 :加载plugins目录下的JS检测规则 文件监控 :实现JS规则热更新 四、Hook 机制实现 4.1 Hook 原理 使用JavaAgent的Instrumentation API 通过Javassist进行字节码修改 在敏感方法前后插入检测代码 4.2 Hook 流程 类匹配 :通过 isClassMatched 判断是否需要Hook 字节码修改 :使用 transformClass 方法插入检测代码 类重定义 :加载修改后的字节码 4.3 典型Hook示例 以SSRF检测为例: 五、检测流程分析 5.1 检测调用链 AbstractSSRFHook.checkHttpUrl() HookHandler.doCheck() HookHandler.doCheckWithoutRequest() HookHandler.doRealCheckWithoutRequest() CheckerManager.check() AbstractChecker.check() V8AttackChecker.checkParam() JS.Check() V8.Check() 5.2 检测类型 OpenRASP支持三种检测方式: JS插件检测 :通过V8引擎执行JS检测规则 Java本地检测 :直接调用Java代码检测 安全基线检测 :检查服务器配置安全性 六、插件系统设计 6.1 JS插件加载 读取plugins目录下所有JS文件 过滤大于10MB的文件 加载到V8引擎中 使用commonLRUCache实现并发幂等 6.2 热更新机制 初始化JnotifyWatcher文件监控 监控JS文件变更 文件变化时重新加载所有插件 七、性能与安全考量 7.1 性能优化 CPU使用率超过90%时禁用所有Hook点 使用缓存机制减少重复检测 异步检测减少对业务影响 7.2 安全防护 云控注册成功前不进入任何Hook点 白名单机制 详细的攻击日志记录 八、开发实践指南 8.1 添加新Hook点 创建继承 AbstractClassHook 的类 添加 @HookAnnotation 注解 实现 isClassMatched 方法 实现 hookMethod 方法插入检测代码 8.2 编写JS检测规则 在plugins目录下创建JS文件 实现检测逻辑 定义攻击类型和参数处理 九、潜在绕过方式 CPU负载攻击 :使CPU超过90%禁用Hook 未注册云控 :在云控注册前执行攻击 线程绕过 :在新线程中执行危险操作 全局开关 :尝试关闭RASP检测 未Hook的底层函数 :使用非常用危险函数 十、总结与展望 OpenRASP作为开源的RASP实现,通过Hook敏感操作和JS插件系统提供了灵活的攻击检测能力。其架构设计考虑了性能、安全性和扩展性,是应用运行时防护的优秀解决方案。 未来发展方向: 更多语言的全面支持 性能优化降低开销 更智能的检测规则 云原生环境适配 参考资源 : OpenRASP官方文档 《OpenRASP学习笔记》- turn1tup 《OpenRASP核心源码浅析》- threedr3am