1

私はオープン ソースの P2P プロジェクト* のソース コードを読んでいて、ウィキペディアによると、中間者攻撃に対してアプリケーションを完全に脆弱にするコードに遭遇しました。

少なくとも ifjavax.net.ssl.X509TrustManager.getAcceptableIssuers()は空の配列をTrust NothingではなくTrust Anyとして扱います。

暗号化された 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