Java 网络堆栈安全?

Java network stack security?

前段时间我和朋友又吵了一架。他声称 Java 由于其使用的网络堆栈而极度不安全。他说不管你是否使用网络,这个网络栈都是开放的 运行。在任何时候你有一个 Java 应用程序 运行,有人可以通过网络堆栈劫持 JVM 并控制你的计算机。这些有道理吗?抱歉,如果这不是 "real" 问题或细节有限,但他告诉我的就这些了。

因为这个[在这里插入你最喜欢的咒语]让我和你一样烦恼我创建了一个简短的测试程序:

public class Shullbit {
  public static void main( String[] args ) {
    while( true )  {
      System.out.println( "Still not convinced ?!?" );
      try {
        Thread.sleep(5000);
      }
      catch( Exception e ) {
        //
      }
    }
  }
}

这个程序启动后就坐在那里等待。这给我们留下了足够的时间来搜索开放端口。 我 运行 Ubuntu 14.04 上的代码与此 java 版本:

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) Server VM (build 25.45-b02, mixed mode)

当我运行带有java -Dcom.sun.management.jmxremote Shullbit的程序时,我可以看到一个端口被打开:

sudo netstat -anop | grep java
tcp6       0      0 :::56066                :::*                    LISTEN      18797/java       off (0.00/0/0)
unix  2      [ ]         STREAM     CONNECTED     30209    18797/java

但这是预料之中的,因为我们告诉 Java 这样做。并且此端口默认只能在本地使用,可以通过 SSL、密码或客户端证书进行保护。

当我 运行 同一个程序只有 java Shullbit 时,没有打开的端口:

sudo netstat -anop | grep java  | wc -l
0

所以告诉你的朋友要么回去工作要么回去上学 ;-)