RASP hook插桩原理解析
- javaagent技术,实现提前加载类字节码
- 实现hook,插桩技术
- javassist技术
- ASM字节码技术
- 像加载jar,有两种方式
- premain启动前加载:每次变动jar包内容,都需要进行重启服务器
- 利用java的动态attch加载原理,采用probe技术,实现动态加载jar包:容易重写方法
十分清晰的插桩流程图(使用了javaAgent、插桩技术)
java文件运行原理
OpenRASP是怎么进行插桩操作
- 启动时候进行了插桩操作,当有类被 ClassLoader 加载时候,所以会把该类的字节码先交给自定义的 Transformer 处理
- 自定义 Transformer 会判断该类是否为需要 hook 的类,如果是会将该类交给 javassist 字节码处理框架进行处理,javassist
- javassist 框架会将类的字节码依照事件驱动模型逐步解析每个方法,当触发了我们需要 hook 的方法,我们会在方法的开头或者结尾插入进入检测函数的字节码
- 把 hook 好的字节码返回给 transformer 从而载入虚拟机
个人理解【插桩】
- 无论是哪种插桩方式,都是以类加载后,修改class文件的字节码为主;
- 可以看出来,OpenRasp是借助javassist进行对关注类两头监听,查看里面的行为是否违规;
- 大致流程就是一个关注类被加载了,拿这个类的class文件,对文件的字节码进行修改成自己想要的class,然后在放回去,载入JVM,进行执行,原本那个class文件就直接放弃了;
- 好处就是源代码没有修改,只是修改了class文件。
注意:OpenRASP是启动前加载的,所以所有的类模块加载都是在启动前就已经换成自己想要的字节码了,每当调用关注类时,就不会调用原来的代码,而是调用编写好的代码强化的代码模块
OpenRasp是如何进行请求处理
- 服务器收到一个请求,从而进入了服务器的请求 hook 点
- 服务器发起SQL查询
- 进入 SQLStatementHook 点,我们挂钩了 execute、executeUpdate、executeQuery 等方法,从该方法进入检测流程如下:
- 判断当前线程是否为请求线程(第一步标记的),如果是继续下面检测
- 采集 connection_id(这个字段仅JDBC支持)、SQL 语句以及数据库类型 等信息
- 构建参数信息,调用本地插件和 JS 插件进行安全检测,JS 插件由 Rhino 引擎执行,Rhino 引擎执行是 mozilla 为 java 提供的 JavaScript引擎,该引擎会将 JS 代码编译为 java 的 class 字节码在 JVM 中运行,Rhino 引擎文档
- 根据插件的执行结果决定是拦截请求、放行还是仅打印日志
- 进入 SQLResultSetHook 点,我们挂钩了 resultSet.next 方法
- 调用本地插件检查是否发生拖库行为,默认策略为一次查询结果超过500条就报警
- 若决定拦截攻击
- 输出报警日志到 logs/alarm.log
- 如果header还没有发出,默认使用 302 跳转到拦截页面
- 如果body还没有发出,则重置未发送的body
- 输出自定义拦截页面跳转js脚本
javassist技术
在一个测试jar包执行前,提前执行编写好的permain函数,将原本的测试jar的字节码,替换成自己想要的字节码,然后再放回去,JVM只执行我修改好的class文件,转义后,这个代码就拥有自我监控和拦截功能,就达成了无入侵自我保护。
ASM技术和Javassist技术的差异
先说说相同点
这两个技术都是java字节码修改技术,都可以对未加入JVM的class文件,进行修改。
不同之处
ASM主要是通过字节码进行修改,而javassist是通过java代码进行修改的
直接看下他们之间代码,就懂了
同一份java代码,看下他们二者的区别
// 修改前public void test(String args) {System.out.println("rasp Test,正常通过!!");}
// 修改后
public void test(String var1) {SqlFilter var3 = new SqlFilter();if (var3.filter(var1)) {throw new SQLException("invalid sql because of security check");} else {System.out.println("rasp Test,正常通过!!");}}// 添加部分SqlFilter var3 = new SqlFilter();if (var3.filter(var1)) {throw new SQLException("invalid sql because of security check");} else {// 原本代码 XXXX}
看下ASM进行插桩
mv.visitTypeInsn(NEW,"com/wu/javaagent01/filter/SqlFilter");mv.visitInsn(DUP);mv.visitMethodInsn(INVOKESPECIAL,"com/wu/javaagent01/filter/SqlFilter","<init>","()V",false);mv.visitVarInsn(ASTORE,3);mv.visitVarInsn(ALOAD,3);mv.visitVarInsn(ALOAD,1);mv.visitMethodInsn(INVOKEVIRTUAL,"com/wu/javaagent01/filter/SqlFilter", "filter","(Ljava/lang/Object;)Z",false);mv.visitJumpInsn(IFEQ, l92);mv.visitTypeInsn(NEW, "java/sql/SQLException");mv.visitInsn(DUP);mv.visitLdcInsn("invalid sql because of security check");mv.visitMethodInsn(INVOKESPECIAL, "java/sql/SQLException", "<init>", "(Ljava/lang/String;)V", false);mv.visitInsn(ATHROW);mv.visitLabel(l92);mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
再看看javassist对这个代码如何插桩的
ClassPool classPool = ClassPool.getDefault();
CtClass ctClass = classPool.get("YourClassName"); // 替换成你的类名CtMethod ctMethod = ctClass.getDeclaredMethod("checkListFiles");CtClass exceptionClass = classPool.get("java.sql.SQLException");// 创建异常抛出代码块
CtConstructor exceptionConstructor = exceptionClass.getDeclaredConstructor(new CtClass[] { classPool.get("java.lang.String") });
CtConstructor ctConstructor = ctClass.getClassInitializer();
ctConstructor.insertAfter("{" +"if (condition) {" +" try {" +" throw new java.sql.SQLException(\"invalid sql because of security check\");" +" } catch (java.sql.SQLException e) {" +" e.printStackTrace();" +" }" +"}");// 保存修改后的字节码ctClass.writeFile();
} catch (Exception e) {e.printStackTrace();
}
相关文章:

RASP hook插桩原理解析
javaagent技术,实现提前加载类字节码实现hook,插桩技术 javassist技术ASM字节码技术 像加载jar,有两种方式 premain启动前加载:每次变动jar包内容,都需要进行重启服务器利用java的动态attch加载原理,采用pr…...
Pygame中Sprite的使用方法6-5
3 碰撞检测 蓝色方块会随着鼠标移动,当碰到绿色方块时,则当前分数加1,当碰到红色方块时,当前分数减1。因为要随时进行碰撞检测,因此需要在while True循环中实现以下功能。 3.1 蓝色方块随鼠标移动 将蓝色方块的位置…...

浅谈为什么多态只能是指针或引用
其实在很早之前,我一直没有注意到这个问题,直到今天碰见了一道题,顺便前面的博客中,继承写到,子类中不包含父类,子类只是继承了父类的成员变量和函数,由这一点,引发了我对切片以及赋…...
js看代码说输出
目录 原型 Function与Object new fn() 原型链 constructor function.length 默认参数:第一个具有默认值之前的参数个数 剩余参数:不算进length 闭包 循环中 函数工厂:形参传递 IIFE:匿名闭包 let:闭包 forEach()&am…...
Java笔记:使用javassist修改class文件内方法
1.前言 在工作突然有一个需求。线上运维的一个tomcat的web项目,运行的程序不正常。需要修改代码。可是这个项目代码非常的老,并且公司存储的源代码跟线上的不一致。 我了个擦,没有源代码但是还要结局客户的问题。只能到线上将对应程序的clas…...

华为云云耀云服务器L实例评测 |云服务器性能评测
通过上一篇文章华为云云耀云服务器 L 实例评测 |云服务器选购,我已经购买了一台 Centos 系统的云耀云服务器 L 实例。 在获得云耀云服务器 L 实例后,首要任务是熟悉云耀云服务器 L 实例的性能,对云耀云服务器 L 实例的性能进行测…...

iphone的safari浏览器实现全屏的pwa模式,并修改顶部状态栏背景颜色
要想修改顶部背景颜色,需要用到这个属性:content就是你要设置的颜色 <!-- 状态栏的背景色 --><meta name"theme-color" content"#f8f8f8" /> 然后再加上下面的设置: <!-- 网站开启对 web app 程序的支持…...

springboot对接rabbitmq并且实现动态创建队列和消费
背景 1、对接多个节点上的MQ(如master-MQ,slave-MQ),若读者需要自己模拟出两个MQ,可以部署多个VM然后参考 docker 安装rabbitmq_Steven-Russell的博客-CSDN博客 2、队列名称不是固定的,需要接受外部参数&…...

Spring的后处理器-BeanFactoryPostprocessor
目录 Spring后处理器 Bean工厂后处理器-BeanFactoryPostProcessor 修改beanDefinition对象 添加beanDefiniton对象 方法一 方法二 自定义Component Spring后处理器 Spring后处理器是Spring对外开放的重要拓展点(让我们可以用添加自己的逻辑)&…...

Flutter 必备知识点
Flutter 升级 确保在项目根目录下(含有 pubspec.yaml 的文件夹) 在命令行中输入命令: flutter channel输出: Flutter channels: * mastermainbetastable这个可以在 pubspec.yaml 中查看: 切换分支也很简单…...

什么是FMEA(失效模式和影响分析)?
失效模式和影响分析(FMEA)是一个在开发阶段,用于确定产品或流程可能的风险和失败点的有条理的过程。FMEA团队会研究失效模式,也就是产品或流程中可能出错的地方,以及这些失效可能带来的影响(如风险、损害、…...
Redis面试题(三)
文章目录 前言一、怎么理解 Redis 事务?二、Redis 事务相关的命令有哪几个?三、Redis key 的过期时间和永久有效分别怎么设置?四、Redis 如何做内存优化?五、Redis 回收进程如何工作的?六、 加锁机制总结 前言 怎么理…...
Python错误处理指南:优雅应对异常情况
目录 一. 异常是什么?二. 使用 try 和 except三. 捕获多个异常四. 使用 else五. 使用 finally六. 自定义异常七.Python中常见异常处理类型八.Python中常见异常处理实例九.异常处理最佳实践十.结论 当编写Python代码时,错误处理是一个重要的方面ÿ…...

MySQL学习笔记12
MySQL 查询语句: 1、查询五子句:(重点) mysql> select */字段列表 from 数据表名称 where 子句 group by 子句 having 子句 order by 子句 limit 子句; 1)where 子句;条件筛选。 2)group…...

【owt】构建m79的owt-client-native:使用vs2017
家里电脑换成了台式机,拷贝代码发现了三年前的owt客户端mfc工程。 不用下载第三方库,试着构建下: owt-client-native 我这里有3年前的代码,思索了下还是用vs2017构建吧: 重新构建一下 选用x86 的 vs2017 vs的命令行控制台 cls可以清理屏幕 之前构建过vs2022的webrtc原版 …...

Cpp/Qt-day020918Qt
目录 完善登录框 点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两…...

Spring面试题10:Spring的XMLBeanFactory怎么使用
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring的XMLBeanFactory怎么使用 XmlBeanFactory是Spring框架中的一个实现类,它是BeanFactory接口的一个具体实现。XmlBeanFactory的主要作用是通…...

自定义数据类型
前言:小伙伴们又见面啦,今天这篇文章,我们来谈谈几种自定义数据类型。 目录 一.都有哪些自定义数据类型 二.结构体 结构体内存对齐 1.如何对齐 2.为什么要对齐 3.节省空间和提升效率的方法 (1)让占用空间小的成员…...
产品团队的需求验证和确认
需求核实过程是确保软件满足特定的规格要求,而验证则侧重于软件是否达到了最终用户的期望和需求。 如果你正在开发一种医疗产品,这种区别也可能在法规和标准中有所体现,例如: 820.30(f):设计验证应确认设计的成果符合…...

【JVM】类加载的过程
文章目录 类的生命周期加载验证准备解析初始化简要概括 类的生命周期 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载 (Loading)、验证(Verification)、准备…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...