MicroRASP 是一个轻量级的 Java 运行时应用自我保护(RASP)Agent,基于 Byte Buddy 实现,提供零侵入式的实时安全防护能力。
- 🚀 零侵入部署 - 通过 Java Agent 方式加载,无需修改应用代码
- 🛡️ 多维度防护 - 覆盖反序列化、JNDI 注入、RMI、进程执行、Native 库加载等攻击面
- 🔧 灵活扩展 - 基于注解的 Hook 机制,支持快速添加自定义防护规则
- ⚡ 性能优化 - 精准匹配目标方法,最小化运行时开销
- 🌐 跨版本兼容 - 支持 JDK 8 / JDK 11 / JDK 17+
- 🎯 上下文感知 - 只在 HTTP 请求上下文中拦截,避免误杀正常流程
| 攻击类型 | Hook 点 | 描述 | 状态 |
|---|---|---|---|
| Java 反序列化 | ObjectInputStream.resolveClass |
拦截危险类的反序列化操作 | ✅ 已实现 |
| JNDI 注入 | NamingManager.getObjectFactoryFromReference |
检测远程 codebase 和危险工厂类 | ✅ 已实现 |
| RMI 远程加载 | LoaderHandler.lookupLoader |
阻止 RMI codebase 远程类加载 | ✅ 已实现 |
| 命令执行 | ProcessImpl.create / forkAndExec |
阻止 HTTP 请求上下文中的进程执行 | ✅ 已实现 |
| Native 库加载 | NativeLibraries.load / NativeLibrary.load |
阻止动态加载恶意 Native 库 | ✅ 已实现 |
| HTTP 请求跟踪 | HttpServlet.service |
记录请求上下文,实现上下文感知防护 | ✅ 已实现 |
| 攻击类型 | 计划 Hook 点 | 描述 | 优先级 |
|---|---|---|---|
| SQL 注入 | Statement.execute* / PreparedStatement.execute* |
检测和阻止 SQL 注入攻击 | 🔥 高 |
| 文件操作 | FileInputStream / FileOutputStream / RandomAccessFile |
防止任意文件读写 | 🔥 高 |
| XXE 攻击 | DocumentBuilder.parse / XMLReader.parse |
防止 XML 外部实体注入 | 🔥 高 |
| SSRF 攻击 | URL.openConnection / HttpURLConnection.connect |
防止服务端请求伪造 | 🔥 高 |
| 表达式注入 | ScriptEngineManager.eval / OGNL / SpEL |
防止代码注入和表达式注入 | 🔶 中 |
| 反射调用 | Method.invoke / Class.forName |
监控危险的反射调用 | 🔶 中 |
| 文件上传 | FileUpload / MultipartFile |
检测恶意文件上传 | 🔶 中 |
| 模板注入 | Freemarker / Velocity / Thymeleaf | 防止模板注入攻击 | 🔶 中 |
| WebSocket | WebSocket 连接和消息处理 | WebSocket 安全防护 | 🔷 低 |
| GraphQL | GraphQL 查询执行 | GraphQL 注入防护 | 🔷 低 |
# 克隆项目
git clone https://github.com/yourusername/MicroRASP.git
cd MicroRASP
# 使用 Maven 构建
mvn clean package
# 生成的 JAR 位于 target/ 目录
# MicroRASP-0.1-shaded.jarjava -javaagent:/path/to/MicroRASP-0.1-shaded.jar -jar your-application.jarimport com.sun.tools.attach.VirtualMachine;
public class AttachAgent {
public static void main(String[] args) throws Exception {
String pid = "12345"; // 目标 JVM 进程 PID
String agentJar = "/path/to/MicroRASP-0.1-shaded.jar";
VirtualMachine vm = VirtualMachine.attach(pid);
vm.loadAgent(agentJar);
vm.detach();
}
}启动应用后,控制台会输出:
[MicroRASP] ========================================
[MicroRASP] MicroRASP Agent Starting...
[MicroRASP] ========================================
[MicroRASP] Injecting 3 class(es) to Bootstrap ClassLoader...
[MicroRASP] Discovered 6 hook handler(s) in package com.h2tg.rasp.hooks
[MicroRASP] Registered hook: target=java.io.ObjectInputStream#resolveClass
[MicroRASP] Registered hook: target=javax.naming.spi.NamingManager#getObjectFactoryFromReference
[MicroRASP] ========================================
[MicroRASP] MicroRASP Agent Installed Successfully
[MicroRASP] ========================================
MicroRASP
├── Agent.java # Java Agent 入口,负责初始化和安装
├── annotation/
│ └── HookHandler.java # Hook 注解,标记拦截点
├── core/
│ ├── HookRegistry.java # Hook 注册中心,自动扫描和注册
│ └── HookListener.java # 转换监听器,记录插桩日志
├── bootstrap/
│ ├── RequestContext.java # HTTP 请求上下文(Bootstrap ClassLoader)
│ ├── SerialHelper.java # 反序列化黑名单(Bootstrap ClassLoader)
│ └── JndiHelper.java # JNDI 安全检查(Bootstrap ClassLoader)
├── hooks/
│ ├── SerialHook.java # 反序列化防护
│ ├── JndiHook.java # JNDI/RMI 注入防护
│ ├── ProcessHook.java # 命令执行防护
│ ├── JNIHook.java # Native 库加载防护
│ └── RequestHook.java # HTTP 请求上下文跟踪
└── log/
└── MicroLogger.java # 日志工具(基于 java.util.logging)
1. Agent.premain/agentmain
↓
2. 注入 Bootstrap 类到 Bootstrap ClassLoader
↓
3. HookRegistry 扫描 @HookHandler 注解
↓
4. 构建 AgentBuilder(Byte Buddy)
↓
5. 注册所有 Hook 到 AgentBuilder
↓
6. 安装 Agent 到目标 JVM
↓
7. 运行时拦截目标方法,执行安全检查
package com.h2tg.rasp.hooks;
import com.h2tg.rasp.annotation.HookHandler;
import com.h2tg.rasp.bootstrap.RequestContext;
import net.bytebuddy.asm.Advice;
public class CustomHook {
@HookHandler(
hookClass = "com.example.TargetClass",
hookMethod = "dangerousMethod",
parameterTypes = {"java.lang.String"}
)
public static class DangerousMethodAdvice {
@Advice.OnMethodEnter
static void onEnter(@Advice.Argument(0) String input) {
Object request = RequestContext.getCurrentRequest();
if (request == null) {
return; // 非 HTTP 请求,放行
}
// 自定义安全检查逻辑
if (isBlacklisted(input)) {
System.err.println("[MicroRASP] [BLOCKED] Dangerous input: " + input);
RequestContext.logRequestInfo(request);
throw new SecurityException("MicroRASP blocked dangerous input: " + input);
}
}
private static boolean isBlacklisted(String input) {
// 实现黑名单检查
return input.contains("malicious");
}
}
}| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
hookClass |
String | 目标类的完全限定名 | - |
hookMethod |
String | 目标方法名 | - |
parameterTypes |
String[] | 方法参数类型(完全限定名) | {"*"} |
isConstructor |
boolean | 是否为构造方法 | false |
isNative |
boolean | 是否为 Native 方法 | false |
mvn clean package
java -javaagent:target/MicroRASP-0.1-shaded.jar -jar your-app.jar编辑 SerialHelper.java 中的 denyClasses 数组:
public static final String[] denyClasses = {
"com.sun.rowset.", // JNDI 注入
"org.apache.commons.collections.functors.", // Commons Collections
"org.springframework.beans.factory.", // Spring RCE
"java.lang.Runtime", // 命令执行
// 添加自定义黑名单...
};编辑 JndiHelper.java 中的 denyFactories 数组:
public static final String[] denyFactories = {
"org.apache.naming.factory.",
"com.alibaba.druid.pool.DruidDataSourceFactory",
"org.apache.tomcat.jdbc.pool.DataSourceFactory",
// 添加自定义黑名单...
};| Hook 类型 | Spring Boot 2.x + JDK8 | Spring Boot 2.x + JDK17 | Spring Boot 3.x + JDK17 | Tomcat 9.x + JDK8 | Tomcat 10.x + JDK17 |
|---|---|---|---|---|---|
| SerialHook | ✅ 测试通过 | ✅ 测试通过 | ✅ 测试通过 | ||
| JndiHook | ✅ 测试通过 | ✅ 测试通过 | ✅ 测试通过 | ||
| RMIHook | |||||
| ProcessHook | ✅ 测试通过 | ✅ 测试通过 | ✅ 测试通过 | N/A | |
| **JNIHook ** | |||||
| **RequestHook ** | ✅ 测试通过 | ✅ 测试通过 | ✅ 测试通过 |
图例: ✅ 测试通过 | ❌ 测试失败 |
- 生产环境部署前请充分测试,确保不影响业务逻辑
- 上下文感知防护仅在 HTTP 请求中生效,非 Web 应用需调整逻辑
- 黑名单规则需根据实际业务场景调整,避免误报
- Native 方法 Hook 可能影响部分 JVM 优化,建议性能测试
- 日志输出使用
System.err,生产环境建议配置日志重定向