我有一项服务,其中要解析的域名来自不受信任的来源。最近,它一直因内存不足而崩溃。我缩小了可能的原因,得出的结论一定与最近的 DNS 请求流量有关。但是,该服务在解析域名后不存储任何内容,所以这似乎不太可能,但我尝试向我的服务发送垃圾邮件,请求导致它解析域名,以防万一。它确实因此而死。在得出没有代表我的代码存储内存的结论后,我将代码缩小到此范围:
import java.math.*;
import java.net.*;
class A {
static {
try {
for (BigInteger i = BigInteger.ZERO; i==i; i = i.add(BigInteger.ONE))
Inet4Address.getByName("a"+i+".dog");
} catch (Exception e) {throw new RuntimeException(e);}
}
}
我用这条线设置了 dnsmasq/etc/dnsmasq.conf
以使分辨率更快:
address=/dog/127.0.0.1
起初,当我运行它时,它存活了好几天,所以这似乎不是问题所在。但是后来我用我用来启动我的服务的脚本运行了它,它启用了安全管理器,它崩溃了:
$ javac A.java && java -Xmx80m -Djava.security.manager A
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Could not find the main class: A. Program will exit.
安全管理器使我的程序容易受到这种拒绝服务攻击。为什么?如何解决?
$ java -version
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (Gentoo build 1.6.0_27-b27)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)