混沌工程工具:Chaosblade Java业务代码注入原理(5)

2023-10-10 15:12:35 浏览数 (1)

概述

上篇文章(混沌工程工具:业务代码注入原理(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腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

0 人点赞