alibaba / jvm-sandbox-repeater

A Java server-side recording and playback solution based on JVM-Sandbox
Apache License 2.0
2.51k stars 700 forks source link

关于不同协议的流量重放支持 #222

Open suncairong163 opened 7 months ago

suncairong163 commented 7 months ago

我是做iast的(基于javaagent的漏洞检测系统),其中有一项就是对检测漏洞进行主动验证,使用到了流量重放,

我看sandbox使用的不同协议会有不同的plugin,可能存在一些问题 比如httplugin 1.端口,ip写死,没法进行交互动态配置 2.其实http,rpc 类似的基于tcp的都可以统一实现 3.有的时候127.0.0.1 是限制访问的,会导致重放失败

iast 流量重放的场景需求 1.需要更改请求报文(添加攻击payload) 2.需要进行请求重放 3.支持多种协议(http,rpc) 我的iast是直接采用了java的socket进行请求报文的write,这里要指定port and ip ,port我是在web启动是获取对应的监听端口, ip就是应用指定的网卡

Aresxue commented 4 months ago

127.0.0.1 为啥要限制访问,本地禁止http自调用?这个问题可以通过自己选取本地网卡的ip去解决,也可以自己做一个简单的服务发现去选举,但做一个配置项去配置是没必要的(容器化下ip是会变和复用的)。 至于http、rpc基于tcp去做统一实现感觉完全没必要还可能引发一些未知的问题,往往回放除了发送请求还有其它的自定义逻辑。

suncairong163 commented 4 months ago

127.0.0.1 为啥要限制访问,本地禁止http自调用?这个问题可以通过自己选取本地网卡的ip去解决,也可以自己做一个简单的服务发现去选举,但做一个配置项去配置是没必要的(容器化下ip是会变和复用的)。 至于http、rpc基于tcp去做统一实现感觉完全没必要还可能引发一些未知的问题,往往回放除了发送请求还有其它的自定义逻辑。

1.应用本身是可以指定网卡进行启动的(指定ip),这种情况下除了指定的IP,其他的IP,还是127.0.0.1是不通的 2.至于为什么同一实现,因为所有的报文发送,只要是基于t c p的就可以统一以文本形式发送, 3.编辑自定义报文,我上面已经说了这种场景,这跟发报文没关系,我说的同一实现,不需要各种客户端,只需要文本格式报文就OK 4.IP为什么支持自定义,就是因为会变所以才支持自定义,因为流量是离线重放,之前的ip,和当前的ip可能不一样,也是场景适配问题 5.功能设计是需要适配场景的,易用,通用适配,这才是功能设计方向

Aresxue commented 2 months ago

1.127.0.0.1是被特殊处理才会不通但很少会有,这个可以改造http的回放器将这个ip从RepeatMeta传过去,对用户更友好的方式是agent启动的时候就轮询所有网卡探测通的ip后续使用该ip进行http回放; 2.基于tcp的方案业界已经有goreplay等产品了,事实已经证明它并不是非常适合java,唯一的好处就是可以以sidecar的方式挂载几乎不会对宿主造成任何影响; 3.报文不是简单的文本,http有header、body、query、path,rpc有attachment和baggage,mq有自己的properties,定时任务有隐式参数,java世界里是很复杂的,整个repeater之所以有插件这个设计就是为了抽象服用的同时能精准地处理每个框架的差异,标准如Skywalking在java实现层面也使用插件模式也是这个原因,在抽象复用和易用之间的trade off也是贯穿整个生命周期的复杂之处。