TongxiJi / shadowsocks-java

shadowsocks server base on netty4 , tcp & udp full support,
MIT License
275 stars 77 forks source link

rc4-md5 数组越界问题 #17

Closed mokitoo closed 5 years ago

mokitoo commented 5 years ago

看日志上面经常有IndexOutOfBoundsException抛出来,定位到错误代码具体如下 (我的Rc4Md5Crypt里面有改动过,具体行数和你的应该不一样)

在 Rc4Md5Crypt 类里面

打印出来的size如下 iv size:14, bts size:32, _keyLength:16, _ivLength:16

感觉应该是 iv 的数组越界了,但是不知道是什么情况下触发的, 感觉应该是 _ivLength 没有及时更新导致的 对加密这块不是很懂,看代码里面getIVLength固定值写死是16,不知道上面iv 的length为啥变成14了 我猜测的解决方案如下,不知道对不对。。。。?

mokitoo commented 5 years ago

大佬,你有何看法?_ivLength 应该是固定16, 感觉是传进来的 byte数组长度出了问题

mokitoo commented 5 years ago

我看了下代码 开启混淆的情况下,ByteBuf唯一有改动的地方是 HttpSimpleHandler 按照我的理解,所有的的数据都会从HttpSimpleHandler进入,流入进SSCipherCodec, HttpSimpleHandler --> SSCipherCodec

HttpSimpleHandler打了个日志看了下,发现这个下面错误日志无论如何,从来没打印出来,

但是最后依然会报IndexOutOfBoundsException的错误 2019-05-31 13:38:41.562 [nioEventLoopGroup-2-8] [ERROR] cn.wowspeeder.encryption.impl.Rc4Md5Crypt - iv size:8, bts size:32,_keyLength:16,_ivLength:16 2019-05-31 13:38:41.562 [nioEventLoopGroup-2-8] [ERROR] cn.wowspeeder.ss.SSProtocolCodec - client /195.74.76.198:21324,error :java.lang.IndexOutOfBoundsException io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException

这就有点难以理解了,难道还有别的地方数据可以进入SSCipherCodec 。。。。?

mokitoo commented 5 years ago

找到原因了

错误日志之前没仔细看,有点尴尬

SSServerCheckerReceive 里面,当是udp情况下,你传的是 udpRaw.content() ,这个返回值和tcp一样,都是ByteBuf 类型,从而造成SSCipherCodec 在decode的时候,把udp的数据错误的当成tcp的数据来处理了,造成上面的那个数组越界的错误。 我的解决方法是 SSServerCheckerReceive 里面 isUdp ==true 的时候 ctx.fireChannelRead(udpRaw);

mokitoo commented 5 years ago

而且我发现某些时候 HttpSimpleHandler 的 encodeData.readableBytes() 的size 就是0, 这种数据要不要在 SSServerCheckerReceive 里面判断下,直接return掉

mokitoo commented 5 years ago

不过我发现改完以后还是有数组越界的日志出现 cn.wowspeeder.ss.SSCipherCodec - decode buf size:6,msg type:DatagramPacket,channel id:f22364c4 此时的越界都是在udp的情况下产生的,这个是不是因为udp丢包导致的?

mokitoo commented 5 years ago

fixed 和 TongxiJi 讨论分析后认为可能是来自外部的异常流量(发送了不规范的数据到服务器) 在 SSCipherCodec 中增加数据合规性的判断