概述
上篇文章(混沌工程工具:业务代码注入原理(4)-腾讯云开发者社区-腾讯云),讲了Java程序从源代码到Native code的流程、JVM字节码修改的基本原理。本节分析Chaosblade的几个经典注入项Servelet、Redis Jedis库、MySQL JDBC库故障注入的原理。
混沌工程工具系列传送门:
1、 混沌工程工具:Chaos-mesh与Chaosblade技术实现与原理分析(1)-腾讯云开发者社区-腾讯云
2、 混沌工程工具:chaos-mesh注入项原理分析(2)-腾讯云开发者社区-腾讯云
3、 混沌工程工具:chaosblade在服务器上注入项原理分析(3)-腾讯云开发者社区-腾讯云
4、 混沌工程工具:业务代码注入原理(4)-腾讯云开发者社区-腾讯云
5、 混沌工程工具:Chaosblade Java业务代码注入原理(5)-腾讯云开发者社区-腾讯云
6、 混沌工程工具:混沌工程实施过程及持久价值(7)-腾讯云开发者社区-腾讯云
7、 混沌工程工具:混沌工程定位及原则梳理(8)-腾讯云开发者社区-腾讯云
8、 混沌工程工具:一个混沌工程设计的例子(9)-腾讯云开发者社区-腾讯云
Servlet delay工作流程展示
对/login接口注入,指定请求URL即可完成注入。
下面是命令:
代码语言:javascript复制# 参数展示
Flags:
--effect-count string The count of chaos experiment in effect
--effect-percent string The percent of chaos experiment in effect
--querystring string The query string that is contained in the request URL after the path.
--querystring-regex-pattern string regex match the query string that is contained in the request URL after the path.
--requestpath string equal RequestUri without ContextPath
--requestpath-regex-pattern string regex match RequestUri without ContextPath
--offset string delay offset for the time
# 命令
blade create servlet delay --time 3000 --requestpath /login --effect-percent 20
Servelet注入原理
注入点匹配
涉及几个常用框架,简述如下:
spring framework注入class是:org.springframework.web.servlet.FrameworkServlet
ALIBABA_WEBX_FRAMEWORK注入class是:com.alibaba.citrus.webx.servlet.WebxFrameworkFilter
SPRING_HTTP_SERVLET_BEAN注入class是:org.springframework.web.servlet.HttpServletBean
HTTP_SERVLET注入class是:javax.servlet.http.HttpServlet
注入方法统一为:doGet/doPost/doDelete/doPut/doFilter
启动试验匹配
1、 通过反射机制,获取每个Servelet请求的URI/method,
2、 与用户输入的实验参数进行匹配。如果匹配成功,则开始执行注入。
执行动作
延迟:执行默认的DefaultDelayExecutor class/sleep方法,具体的语句:TimeUnit.MILLISECONDS.sleep(timeInMillis)
抛异常:执行默认的DefaultThrowExceptionExecutor class/throwCustomException/throwDeclaredException方法。
Redis-Jedis库注入原理
原理:通过jedis连接库,进行故障注入
注入点匹配
注入class是redis.clients.jedis.Protocol,注入method是sendCommand
启动试验匹配
1、 分流Jedis3.X与Jedis4.X:根据参数长度及参数类型区分。Jedis4.x参数长度是3,类型是redis.clients.jedis.CommandArguments,Jedis3.x参数长度是2,类型是byte[]
2、 根据入参,获取当前指令操作的key值,及执行的命令名称。
3、 与用户输入的实验参数进行匹配。如果匹配成功,则开始执行注入。
执行动作
延迟:执行默认的DefaultDelayExecutor class/sleep方法,具体的语句:TimeUnit.MILLISECONDS.sleep(timeInMillis)
抛异常:执行默认的DefaultThrowExceptionExecutor class/throwCustomException/throwDeclaredException方法。
MySQL注入原理
原理:通过jdbc连接库,进行故障注入。
注入点匹配
MySQL5:注入class是com.mysql.jdbc.MysqlIO;注入method是sqlQueryDirect
MySQL8:注入class是com.mysql.cj.NativeSession,注入method是execSQL
启动试验匹配
1、 分流MySQL5与MySQL8:根据连接mysql的jdbc类名,匹配com.mysql.jdbc.MysqlIO,匹配成功就走到MySQL5,否则走到MySQL8.(两个版本获取第二步的参数方式不一样)
2、 利用反射机制,获取host/port/database/table/sql/sql类型等参数
3、 与用户输入的实验参数进行匹配。如果匹配成功,则开始执行注入。
执行动作
延迟:执行默认的DefaultDelayExecutor class/sleep方法,具体的语句:TimeUnit.MILLISECONDS.sleep(timeInMillis)
抛异常:执行默认的DefaultThrowExceptionExecutor class/throwCustomException/throwDeclaredException方法。
我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表