Hello there, ('ω')ノ
🔐 通信の暗号化=SSL/TLSって何?
スマホアプリがインターネットに接続する際、多くはHTTPS(SSL/TLS)という暗号化通信を使います。
これにより、以下のような攻撃を防ぐことができます:
- 通信内容の盗聴(スニッフィング)
- 通信内容の改ざん
- 偽サイトへの誘導(なりすまし)
ただし、「HTTPSを使っている=安全」ではありません。設定ミスや検証漏れがあると、中間者攻撃(MITM)の餌食になる可能性があります。
👀 SSL診断で何をチェックする?
| チェックポイント | 内容 |
|---|---|
| 通信がHTTPSになっているか | HTTP通信は平文(暗号化なし)で危険 |
| サーバー証明書を検証しているか | 偽のサーバーと通信してしまわないか |
| 証明書ピンニングが行われているか | 攻撃者が用意した偽CAをブロックできるか |
| TLSのバージョン・暗号スイート | 古いバージョンや脆弱な暗号方式を使っていないか |
🧪 通信内容を確認する方法(動的解析)
実際にアプリが送受信しているデータを盗聴(キャプチャ)して、暗号化されているかどうかをチェックします。
✅ 使用ツール例:
- Burp Suite(バープスイート)
- Charles Proxy
- mitmproxy
これらは「プロキシサーバー」としてスマホとインターネットの間に入り、通信内容を横取りして解析できます。
🔧 診断環境の構築手順(Burp Suite例)
① PCにBurp Suiteをインストール
② スマホとPCを同一Wi-Fiに接続
③ スマホのプロキシ設定を変更
設定 → Wi-Fi → 詳細設定 → プロキシ手動 → PCのIPアドレス + ポート番号(通常は8080)
④ Burpの証明書をインストール(テスト用端末限定)
http://burpにアクセスcacert.derをダウンロード- 端末に証明書をインストール(設定 → セキュリティ → 証明書をインストール)
※ Android 7以降はユーザー証明書がシステムに適用されないため、アプリ側が明示的にユーザー証明書を許可していない限りMITM不可です。
🔍 実際に盗聴してみよう
スマホで対象アプリを操作して、Burp上に通信が表示されるかを確認します。
- 表示されたら → SSL検証なし、盗聴可能=危険!
- 表示されない → アプリが証明書検証やピンニングで保護されている可能性大
🛠 診断ツールでも確認できる
MobSFのレポートにも、以下のようなSSL関連の項目が含まれます:
usesCleartextTraffic=true→ HTTP許可されているかTrustManagerに独自実装があるか → 検証をスキップしていないかHostnameVerifierが常にtrueを返す設定かどうか
🔥 危険なコード例
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public void checkClientTrusted(...) {} public void checkServerTrusted(...) {} public X509Certificate[] getAcceptedIssuers() { return null; } } }; HostnameVerifier hv = (hostname, session) -> true;
→ これらはSSL証明書の検証を完全にスキップしている典型例。 誰とでも通信できてしまう、という恐ろしい状態です。
🔐 より安全な対策:証明書ピンニング
ピンニングとは、特定の証明書または公開鍵しか信頼しないようにする設定です。
方法:
- ネットワークセキュリティ構成(XML)でピン留め
okhttpなどのライブラリでcertificatePinnerを設定
メリット:
- 攻撃者が偽のCAを使っても通信できなくなる
- 公共Wi-Fiなどの中間者攻撃を完全に防止できる
✅ まとめ
- HTTPSを使っていても、SSL設定が甘いと盗聴される危険性あり
- Burp Suiteなどを使って実際に通信をキャプチャして確認しよう
- MobSFや静的解析で、証明書検証をスキップしていないか確認するのも有効
- 万全を期すなら、証明書ピンニングの実装が理想!
Best regards, (^^ゞ