私はオープン ソースの 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
リモートキーではなく、ローカルノードのキーのみを保存します。
*有罪を保護するために匿名化されたソースコード。