1

我正在阅读一个开源 P2P 项目* 的源代码,并且遇到了应该使应用程序完全容易受到Wikipedia中的中间人攻击的代码。

至少 ifjavax.net.ssl.X509TrustManager.getAcceptableIssuers()将空数组视为Trust Any而不是Trust Nothing

它可能会,因为据它所知,您正在充当具有匿名客户端的服务器,而不是加密的 P2P,要求两个对等方都是他们所说的身份。

class ATrustManager implements X509TrustManager { 
  public ATrustManager() {} 
  public void checkClientTrusted(X509Certificate[] certs, String authType) {} 
  public void checkServerTrusted(X509Certificate[] certs, String authType) {}

  // --- What!? ---
  public X509Certificate[] getAcceptedIssuers() {
    java.security.cert.X509Certificate[0]; 
  }
  // --------------
}

class Blah {
  SomeObject doBlah(...) {  
    // ... various code ...

    char[] password = "password".toCharArray();         
    KeyStore keystore = KeyStore.getInstance("JKS");
    keystore.load(FileInputStream("app.keys"), password);
    KeyManagerFactory aKeyManagerFactory =
        KeyManagerFactory.getInstance("SunX509");   
    aKeyManagerFactory.init(keystore, password);
    KeyManager[] aKeyManager = aKeyManagerFactory.getKeyManagers();
    TrustManager[] aTrustManager = new TrustManager[] { new ATrustManager() };
    SSLContext sslcontext = SSLContext.getInstance("SSL");
    sslcontext.init(aKeyManager, aTrustManager, null);

    SSLSocketFactory socketFactory = sslcontext.getSocketFactory();
    Socket socket = socketFactory.createSocket(hostname, port);
    OutputStream out = socket.getOutputStream();

    // ... various code ...     
}

我的问题:此代码是否对中间人开放?如果是这样,我可能应该让项目知道它。

笔记:

  • 如果远程节点的公钥未知,应用程序不会在代码中的其他位置断开连接。我已经检查过了。
  • app.keys仅存储本地节点的密钥,不存储任何远程密钥。

* 源代码匿名保护有罪。

4

1 回答 1

3

此代码是否对中间人开放?

是的。您绝对接受任何 SSL 证书,无论它是否有效、是否由受信任的 CA 签名等,以及它是否是您尝试联系的对等方的证书。这段代码永远不应该部署在生产环境中,这意味着它根本不应该被编写,除非你喜欢测试不打算在生产环境中部署的部署,并且除非你喜欢接受诸如代码泄露之类的风险进入生产环境,带来根本不安全的后果。

于 2013-09-30T10:50:20.320 回答