js引擎检测及热部署的OpenRASP学习
字数 1806 2025-08-05 11:39:45

OpenRASP JS引擎检测及热部署技术详解

一、OpenRASP概述

OpenRASP是百度开源的一款运行时应用自我保护(Runtime Application Self-Protection)产品,通过在应用运行时检测和阻断攻击,提供针对Web应用的安全防护能力。

核心优势

  • 高精准性,误报率低
  • 具备0day漏洞防御能力
  • 支持加密流量检测
  • 支持热部署更新

技术挑战

  • 可能造成资源消耗
  • 需要维护大量sink点
  • 存在检测覆盖不全的风险
  • 通用性解决方案设计难度大

二、OpenRASP启动流程

1. 核心Jar包结构

  • rasp.jar:主启动包
  • rasp-engine.jar:引擎模块

2. MANIFEST.MF关键属性

Premain-Class: com.baidu.openrasp.Agent
Agent-Class: com.baidu.openrasp.Agent
Main-Class: com.baidu.openrasp.Agent
Can-Redefine-Classes: true
Can-Retransform-Classes: true

3. 启动阶段关键步骤

  1. premain方法执行

    • 将rasp.jar加入BootstrapClassLoader
    • 解决双亲委派机制下的类加载问题
  2. JBoss服务器特殊处理

    • 针对JBoss环境进行特定配置
  3. 引擎模块加载

    • 获取rasp-engine.jar路径
    • 读取MANIFEST.MF中的Rasp-Module-Class属性
    • 将jar包加入classpath
    • 实例化模块主类
  4. 引擎启动

    • 调用engine类的start方法
    • 初始化V8引擎(用于跨平台规则执行)
    • 插件初始化(JSON格式栈信息保存)
    • 设置信息保存key值

三、插件热部署机制

1. 插件更新流程

  1. 获取插件绝对路径
  2. 读取目录下的js文件(默认official.js)
  3. 将文件内容和文件名存入scripts变量
  4. 使用V8引擎提取信息

2. 文件监听机制

  • 通过InitFileWatcher方法实现js配置文件实时监听
  • 支持配置变更时的动态更新

3. 检测类型加载

  • JS插件检测
  • Java本地检测
  • 安全基线检测

四、字节码插桩技术

1. 初始化流程

  1. 调用initTransformer(inst)初始化字节码转换器
  2. 通过addAnnotationHook进行插桩

2. Hook点定位

  1. 扫描com.baidu.openrasp.hook包下所有类
  2. 筛选带有@HookAnnotation注解的类
  3. 实例化并调用addHook方法插桩
  4. 调用retransform方法进行转换

3. 类匹配机制

  • 通过isClassMatched方法判断是否为需要Hook的类
  • 匹配成功的类将加载Hook点

五、检测机制实现(以XXE为例)

1. XXE Hook点

org/apache/xerces/impl/XMLEntityManager
org/apache/xerces/impl/XMLDocumentFragmentScannerImpl
org/apache/xerces/jaxp/DocumentBuilderImpl

2. 字节码改写流程

  1. 将原类文件写入classpath
  2. 调用AbstractClassHook#transformClass添加检测代码
  3. 通过XXEHook#hookMethod添加checkXXE方法调用

3. 关键方法Hook

  • expandSystemId
  • setDescription

4. 检测流程调用栈

checkXXE → GeneratedMethodAccessor9 → DelegatingMethodAccessorImpl → Method → 
expandSystemId → addExternalEntity → scanEntityDecl → scanDecls → 
scanDTDInternalSubset → dispatch → scanDocument → parse → DocumentBuilderImpl

5. 检测逻辑实现

  1. 安全让步机制:业务优先的安全检测策略
  2. 核心检测方法doRealCheckWithoutRequest
  3. 检测类型V8AttackChecker
  4. 参数检查checkParam方法检测payload

六、JS插件检测规则(XXE示例)

1. 内置检测手段

  1. 禁用外部实体
  2. 禁用特殊协议
  3. 禁用file协议

2. 协议检测规则

// 特殊协议检测
if (action == "block" && (entity.indexOf("http://") === 0 || 
                         entity.indexOf("https://") === 0 || 
                         entity.indexOf("ftp://") === 0)) {
    return "external_entity_rejected";
}

// file协议检测
if (action == "block" && entity.indexOf("file://") === 0) {
    var path = entity.substring(7);
    // 跨目录检测
    if (path.indexOf("../") !== -1 || path.indexOf("..\\") !== -1) {
        return "directory_traversal_detected";
    }
    // URL锚点检测
    if (path.indexOf("#") !== -1) {
        return "url_anchor_detected";
    }
    // 内部文件读取检测
    if (isInternalFile(path)) {
        return "internal_file_access_detected";
    }
    return "clean";
}

七、V8引擎集成

1. 设计目的

  • 实现跨平台规则执行
  • 支持热部署更新
  • 提供灵活的检测规则编写能力

2. 实现要点

  • 独立进程运行
  • 通过IPC与Java部分通信
  • 支持多线程调用

八、开发建议

1. 新增Hook点

  1. com.baidu.openrasp.hook包下创建新类
  2. 添加@HookAnnotation注解
  3. 实现isClassMatched方法定义匹配规则
  4. 实现hookMethod方法插入检测逻辑

2. 新增检测规则

  1. 在JS插件中添加新规则
  2. 定义action字段控制启用状态
  3. 实现具体的检测算法
  4. 配置相应的告警信息

九、参考资源

  1. OpenRASP官方文档:https://rasp.baidu.com/doc/
  2. OpenRASP V8引擎源码:https://github.com/baidu-security/openrasp-v8
  3. 技术社区分析文章:https://forum.butian.net/share/1959
OpenRASP JS引擎检测及热部署技术详解 一、OpenRASP概述 OpenRASP是百度开源的一款运行时应用自我保护(Runtime Application Self-Protection)产品,通过在应用运行时检测和阻断攻击,提供针对Web应用的安全防护能力。 核心优势 高精准性,误报率低 具备0day漏洞防御能力 支持加密流量检测 支持热部署更新 技术挑战 可能造成资源消耗 需要维护大量sink点 存在检测覆盖不全的风险 通用性解决方案设计难度大 二、OpenRASP启动流程 1. 核心Jar包结构 rasp.jar :主启动包 rasp-engine.jar :引擎模块 2. MANIFEST.MF关键属性 3. 启动阶段关键步骤 premain方法执行 : 将rasp.jar加入BootstrapClassLoader 解决双亲委派机制下的类加载问题 JBoss服务器特殊处理 : 针对JBoss环境进行特定配置 引擎模块加载 : 获取rasp-engine.jar路径 读取MANIFEST.MF中的Rasp-Module-Class属性 将jar包加入classpath 实例化模块主类 引擎启动 : 调用engine类的start方法 初始化V8引擎(用于跨平台规则执行) 插件初始化(JSON格式栈信息保存) 设置信息保存key值 三、插件热部署机制 1. 插件更新流程 获取插件绝对路径 读取目录下的js文件(默认official.js) 将文件内容和文件名存入scripts变量 使用V8引擎提取信息 2. 文件监听机制 通过 InitFileWatcher 方法实现js配置文件实时监听 支持配置变更时的动态更新 3. 检测类型加载 JS插件检测 Java本地检测 安全基线检测 四、字节码插桩技术 1. 初始化流程 调用 initTransformer(inst) 初始化字节码转换器 通过 addAnnotationHook 进行插桩 2. Hook点定位 扫描 com.baidu.openrasp.hook 包下所有类 筛选带有 @HookAnnotation 注解的类 实例化并调用 addHook 方法插桩 调用 retransform 方法进行转换 3. 类匹配机制 通过 isClassMatched 方法判断是否为需要Hook的类 匹配成功的类将加载Hook点 五、检测机制实现(以XXE为例) 1. XXE Hook点 2. 字节码改写流程 将原类文件写入classpath 调用 AbstractClassHook#transformClass 添加检测代码 通过 XXEHook#hookMethod 添加 checkXXE 方法调用 3. 关键方法Hook expandSystemId setDescription 4. 检测流程调用栈 5. 检测逻辑实现 安全让步机制 :业务优先的安全检测策略 核心检测方法 : doRealCheckWithoutRequest 检测类型 : V8AttackChecker 参数检查 : checkParam 方法检测payload 六、JS插件检测规则(XXE示例) 1. 内置检测手段 禁用外部实体 禁用特殊协议 禁用file协议 2. 协议检测规则 七、V8引擎集成 1. 设计目的 实现跨平台规则执行 支持热部署更新 提供灵活的检测规则编写能力 2. 实现要点 独立进程运行 通过IPC与Java部分通信 支持多线程调用 八、开发建议 1. 新增Hook点 在 com.baidu.openrasp.hook 包下创建新类 添加 @HookAnnotation 注解 实现 isClassMatched 方法定义匹配规则 实现 hookMethod 方法插入检测逻辑 2. 新增检测规则 在JS插件中添加新规则 定义action字段控制启用状态 实现具体的检测算法 配置相应的告警信息 九、参考资源 OpenRASP官方文档:https://rasp.baidu.com/doc/ OpenRASP V8引擎源码:https://github.com/baidu-security/openrasp-v8 技术社区分析文章:https://forum.butian.net/share/1959