Tomcat StandardServer问题

时间:2016-09-05 07:58:08

标签: tomcat

我现在正在阅读tomcat源代码并找到一段StandardServer代码:

                    // Read a set of characters from the socket

                    int expected = 1024; // Cut off to avoid DoS attack
                    while (expected < shutdown.length()) {
                        if (random == null)
                            random = new Random();
                        expected += (random.nextInt() % 1024);
                    }
                    while (expected > 0) {
                        int ch = -1;
                        try {
                            ch = stream.read();
                        } catch (IOException e) {
                            log.warn("StandardServer.await: read: ", e);
                            ch = -1;
                        }
                        if (ch < 32)  // Control character or EOF terminates loop
                            break;
                        command.append((char) ch);
                        expected--;
                    }

我只是想知道为什么会这样。为什么我们不这样写:

int expected = shutdown.length();

有谁可以说出这背后的原因是什么?

1 个答案:

答案 0 :(得分:0)

  

更新:根据我的评论,请参阅线程中的http://marc.info/?l=tomcat-dev&m=99842024409593&w=2和接下来的3条消息,以解释为什么编写此代码的原因。

     

它的基本要点是当使用shutdown.length时   预期,攻击者知道shutdown命令的长度,这是不可取的。

     

所以,预期从1024开始然后,如果   预期&lt; shutdown.length,随机整数值生成并添加到预期,直到预期&gt; = shutdown.length。

     

所有这一切都是如此,代码可以只读取套接字所需的字符数,以确定它是否收到了正确的关闭命令   防止攻击者通过网络发送x千兆字节的数据   socket,导致OOM异常

     

通过使用预期增加来自(random.nextInt()%1024)的负整数值,代码可能会有所改善> random.nextInt(1024)而不是(random.nextInt()%1024),但我认为没有人遇到过问题,因为没有人使用超过1024的关机命令字符

你有没有想过这个?因为我遇到了同样的问题。

从它看起来,它们试图阻止攻击者向套接字发送非常大的消息进行DoS攻击。他们试图通过不从套接字中读取更多字符来实现这一点,然后需要确定发送到套接字的值是否与关闭命令字符串相匹配

但我不明白这里的逻辑...... 例如,下面的代码生成-1024到+1024之间的整数,那么为什么他们使用它来增加预期,而(期望&lt; shutdown.length()打败我:

  

(random.nextInt()%1024)

此外,shutdown.length()通常只有8,因为默认命令字符串是“shutdown”,所以代码永远不会进入第一个 while 循环。是否有人会将默认的关闭命令字符串覆盖为1024个字符?

为什么预期默认为1024而不仅仅是shutdown.length()(或者shutdown.length()+ 1)对我来说也是一个谜。

我认为这段代码甚至是错误的,因为代码(random.nextInt()%1024)也会生成负整数值,所以从理论上讲,执行可能永远不会超出第一个while循环(如果它首先进入它)

第二个while循环的代码,虽然对我来说都很有意义。

希望你已经明白了,并且可以对此有所了解。

Tia,保罗