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. 启动阶段关键步骤
-
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点
org/apache/xerces/impl/XMLEntityManager
org/apache/xerces/impl/XMLDocumentFragmentScannerImpl
org/apache/xerces/jaxp/DocumentBuilderImpl
2. 字节码改写流程
- 将原类文件写入classpath
- 调用
AbstractClassHook#transformClass添加检测代码 - 通过
XXEHook#hookMethod添加checkXXE方法调用
3. 关键方法Hook
expandSystemIdsetDescription
4. 检测流程调用栈
checkXXE → GeneratedMethodAccessor9 → DelegatingMethodAccessorImpl → Method →
expandSystemId → addExternalEntity → scanEntityDecl → scanDecls →
scanDTDInternalSubset → dispatch → scanDocument → parse → DocumentBuilderImpl
5. 检测逻辑实现
- 安全让步机制:业务优先的安全检测策略
- 核心检测方法:
doRealCheckWithoutRequest - 检测类型:
V8AttackChecker - 参数检查:
checkParam方法检测payload
六、JS插件检测规则(XXE示例)
1. 内置检测手段
- 禁用外部实体
- 禁用特殊协议
- 禁用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点
- 在
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