
EagleEyes Lite Androidアプリケーションにおける不適切なホスト名検証
EagleEyes Lite(バージョン2.0.0)は、HTTPS通信中にSSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIERを使用してホスト名検証を無効にします。
その結果、アプリケーションはCommon Name(CN)またはSubject Alternative Name(SAN)の値にかかわらずTLS証明書を受け入れるため、攻撃者は任意の有効な証明書または自己署名証明書を使用して正当なサーバーになりすますことができます。
同じネットワーク上にいる攻撃者は、この脆弱性を悪用してMITM攻撃を実行し、アプリケーションとAVTECHバックエンドサービス間の機密通信を傍受または改ざんする可能性があります。
Android 8.0より前のバージョンでデバイスが動作する場合、つまりSDK_API_26がfalseに設定されている場合、メソッドはGetHttpsUrlResponse()を返しません。
代わりに、tryブロック内の脆弱なロジックを実行します。
public static String GetHttpsResponse(String str) {
if (SDK_API_26) {
return GetHttpsUrlResponse(str);
}
try {
...
X509HostnameVerifier x509HostnameVerifier = SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier(x509HostnameVerifier);
...
}
...
}
ここで、SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIERを使用すると、適切なホスト名検証が無効になり、サーバー証明書のCN(Common Name)またはSAN(Subject Alternative Name)が要求されたホスト名と一致しない場合でもTLS接続が成功します。
その結果、攻撃者は偽造証明書を使用して正当なサーバーになりすまし、MITM攻撃を開始して機密通信を傍受または変更する可能性があります。
Fridaフックスクリプトhook.jsを実行することで、SDK_API_26の値を強制的にfalseに設定し、より低いAndroidバージョンをエミュレートしました。これにより、GetHttpsResponse()メソッドが呼び出されたかどうかを監視できました。
その結果、実行中にGetHttpsResponse()が正常に呼び出されることを確認しました。

パラメータ内の機密情報の暗号化が不十分な点については、CVE-2025-50110を参照してください。
アプリケーションは、SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIERの使用を削除し、すべてのHTTPS接続に対して厳格なホスト名検証を適用する必要があります。サーバーのCommon Name(CN)またはSubject Alternative Name(SAN)フィールドは、要求されたホスト名と照合して検証する必要があります。HttpsURLConnection.getDefaultHostnameVerifier()または同等の厳格な検証器を使用してください。
さらに、古いAndroidバージョンでホスト名チェックを無効にするレガシーフォールバックロジックは、一貫したTLS検証を確実にするために削除するか、安全な実装に置き換える必要があります。