Man-in-the-Middle (MITM) — 攻撃者が二者間のトラフィックをその知らないうちに傍受、読み取り、または改ざんする「中間者」攻撃です。Kaspersky(2025年)によると、モバイルデバイスへのMITM攻撃は過去2年間で35%増加しました。トラフィック傍受の主な問題は、ユーザーに攻撃の兆候が見えないことです — 接続は正常に見えます。
重要なポイント
Man-in-the-Middle(MITM)は、攻撃者が二者間の通信チャネルに密かに割り込むサイバー攻撃の一種です。攻撃者は、両者に気付かれずに送信データを傍受、読み取り、改ざんすることができます。
モバイルアプリでは、MITM攻撃は特に危険です。デバイスは常にさまざまなネットワーク(自宅、オフィス、カフェや空港の公共Wi-Fi)に接続するためです。ネットワークを切り替えるたびに攻撃の機会が生まれる可能性があります。Verizon Mobile Security Index(2025年)によると、組織の43%が企業のモバイルデバイスに対するMITM攻撃に少なくとも一度は遭遇したことがあります。
MITMの主な危険性はステルス性にあります。ユーザーとサーバーは傍受の信号を受け取りません。セッションは正常に見え、データは送信され、証明書エラーはありません(攻撃者が自身の証明書を使用している場合)。攻撃はネットワークインフラストラクチャレベルか、専門ツールを使用してのみ検出できます。
開発者は、トランスポート層のセキュリティだけに依存するのではなく、アプリケーションレベルで保護を設計するために、MITM攻撃のメカニズムを理解する必要があります。
MITM攻撃の分類には、通信チャネルへの侵入方法が異なるいくつかのタイプが含まれます。モバイル開発では、3つのタイプが最も関連性があります。
ARP Spoofingは、攻撃者がローカルネットワークに偽のARPパケットを送信し、自身のMACアドレスをゲートウェイのIPアドレスに関連付ける手法です。その後、被害者のすべてのトラフィックは攻撃者のデバイスを経由してルーティングされ、攻撃者は見えないままゲートウェイに転送します。
攻撃を実行するには、ARPスプーフィングを自動化するEttercapやBetterCAPなどのツールで十分です。攻撃は単一のサブネット内でのみ可能なため、公共Wi-Fiネットワークのユーザーが最も脆弱です。管理スイッチでDynamic ARP Inspection(DAI)を備えた最新のネットワークは、このタイプの攻撃をブロックします。
アプリケーションレベルでのARP Spoofingからの保護は不可能です — これはネットワークインフラストラクチャの問題です。ただし、アプリケーションはiOS用のTrustKitやAndroid用のNetwork Security Configなどのライブラリを使用して、ネットワーク接続の異常を検出できます。
DNS Spoofing(またはDNSキャッシュポイズニング)は、クライアントからDNSサーバーへの経路でDNSレコードをすり替える攻撃です。攻撃者はアプリケーションのDNSリクエストを傍受し、偽のIPアドレスを返して、正当なサーバーではなく自身のサーバーにトラフィックをリダイレクトします。
この攻撃は、DHCPを介してDNSサーバーが自動的に割り当てられる公共ネットワークで特に効果的です。攻撃者は、ターゲットドメインに対して偽装されたIPアドレスを返す独自のDNSサーバーを設定できます。ユーザーはブラウザで正当なURLを見ますが、攻撃者のサーバーに接続します。
DNS Spoofingからのアプリケーション側の保護は、DNSクエリを暗号化するDNS-over-HTTPS(DoH)またはDNS-over-TLS(DoT)を介して実装されます。Android 9+とiOS 14+はシステムレベルのDoHをサポートしており、アプリケーションは明示的にこのオプションを有効にできます。
SSL Strippingは、攻撃者が安全なHTTPS接続を安全でないHTTPにダウングレードする攻撃です。この手法は、多くのユーザーがhttps://example.comの代わりに手動でexample.comと入力し、最初の接続がHTTPを介して確立されるという事実を悪用します。
sslstrip(Moxie Marlinspike、2009年)やbettercapなどのツールは、HTTPリクエストを自動的に傍受し、サーバーとのHTTPS接続を自身の代わりに確立し、復号化されたトラフィックをHTTPを介してクライアントに渡します。ブラウザは鍵アイコンを表示しません — ユーザーは接続が安全でないことを知りません。
最新の保護 — HTTP Strict Transport Security(HSTS):サーバーはブラウザに、将来のすべての接続がHTTPSのみを使用する必要があることを通知します。HSTS Preload Listは最初の攻撃からも保護しますが、ドメインの事前登録が必要です。
モバイルアプリに対する典型的なMITM攻撃は4つの段階を経ます。各段階は異なる脆弱性を悪用し、完全な保護にはすべてのベクターをカバーする必要があります。
第一段階 — 侵入:攻撃者はデバイスとサーバー間のトラフィック経路上に配置されます。これは、ローカルネットワークでのARP Spoofing、偽のWi-Fiアクセスポイント(Evil Twin)、またはプロバイダーのDNSサーバーの侵害である可能性があります。モバイルデバイスは、開かれたネットワークに自動的に接続するときに特に脆弱です。
第二段階 — 傍受:侵入後、攻撃者はアプリとサーバー間で交換されるすべてのパケットを読み取り始めます。この段階で、リクエストURL、パケットサイズ、Cookie、ヘッダーなどのメタデータを収集します。データが暗号化されていても、メタデータはアプリケーションの構造とビジネスロジックを明らかにする可能性があります。
第三段階 — 復号化(トラフィックが暗号化されている場合):攻撃者は2つのTLS接続を確立します — 1つはサーバーとの接続(偽造証明書を使用)、もう1つはクライアントとの接続です。アプリは接続を安全と見なしますが、攻撃者はすべてのデータを平文で見ることができます。Certificate Pinningがない場合、これはシステムストアにインストールされている任意の証明書で機能します。
第四段階 — 改ざんと流出:攻撃者は送信データを読み取るだけでなく改ざんすることもできます。金融アプリでは、受取人の口座番号を変更することを意味する可能性があります。APIリクエストでは、認証パラメータを変更する可能性があります。iOSとAndroidは、アプリケーションレベルで応答の整合性チェックを実装することを推奨しています。
KotlinとSwiftでCertificate Pinningを使用したMITM攻撃からの保護の実用的な例を見てみましょう。これらの例は、システムストアが侵害された場合でも証明書のすり替えをブロックします。
OkHttpはAndroid向けの標準HTTPライブラリで、CertificatePinnerをサポートしています。サーバーの証明書のSHA-256ハッシュを指定すると、他の証明書はすべて拒否されます。
import okhttp3.CertificatePinner
import okhttp3.OkHttpClient
val certificatePinner = CertificatePinner.Builder()
.add(
"api.example.com",
"sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
)
.build()
val client = OkHttpClient.Builder()
.certificatePinner(certificatePinner)
.build()
iOSでは、URLSessionDelegateを使用してサーバー証明書を手動で検証します。SecCertificateRefをローカルに保存されたコピーと比較します。
class SessionDelegate: NSObject, URLSessionDelegate {
func urlSession(
_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (
URLSession.AuthChallengeDisposition,
URLCredential?
) -> Void
) {
guard let serverTrust = challenge.protectionSpace
.serverTrust else { return }
let pinnedCert = SecCertificateCreateWithData(
nil,
pinnedCertData as CFData
)
let serverCerts = (0..<SecTrustGetCertificateCount(serverTrust))
.compactMap { SecTrustGetCertificateAtIndex(serverTrust, $0) }
if serverCerts.contains { CFEqual($0, pinnedCert) } {
completionHandler(.useCredential, URLCredential(trust: serverTrust))
} else {
completionHandler(.cancelAuthenticationChallenge, nil)
}
}
}
Androidは、コードを書かずにOSレベルでトラフィックをブロックするnetwork_security_config.xmlファイルを介した宣言的な保護をサポートしています。
<!-- network_security_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">api.example.com</domain>
<pin-set expiration="2027-07-01">
<pin digest="SHA-256">AAAAAAAAAAAAAAAAAAAAAAAAAAAA</pin>
</pin-set>
</domain-config>
</network-security-config>
MITM攻撃からの包括的な保護には、アプリケーション、サーバー、ネットワークインフラストラクチャの各レベルでの対策が含まれます。以下に、AndroidとiOS向けの主な推奨事項を示します。
Certificate Pinningを使用する — アプリケーションコードにサーバー証明書をバインドします。システムストアの任意の証明書を信頼する標準のTLS検証とは異なり、Certificate Pinningは特定の証明書またはその公開鍵をチェックします。AndroidのOkHttpとiOSのTrustKitは、このメカニズムの既製の実装を提供しています。
HTTPSとHSTSを強制する:すべてのネットワークリクエストはHTTPSを経由する必要があり、サーバーはStrict-Transport-Securityヘッダーを返す必要があります。Androidの場合、マニフェストにandroid:usesCleartextTraffic="false"を追加します — これによりOSレベルでHTTP接続がブロックされます。iOSはiOS 9以降、App Transport Security(ATS)を介してデフォルトでHTTPをブロックします。
応答の整合性チェックを実装する:サーバーの応答にデジタル署名を行い、アプリが検証します。攻撃者がHTTPSトラフィックを傍受しても(プロキシを介した証明書の再インストール)、サーバーの秘密鍵なしでは署名を偽造できません。重要な操作には、RS256またはHMAC署名付きのJWTを使用してください。
サーバー側では、HTTP Public Key Pinning(HPKP)を有効にします — ブラウザやアプリに対して特定のドメインでどの証明書を有効と見なすかを指示するディレクティブです。ただし、HPKPには注意が必要です:誤った設定は長期間アプリケーションへのアクセスをブロックする可能性があります。Googleはバックアップ証明書との組み合わせでのみHPKPを使用することを推奨しています。
NIST SP 800-52 Rev. 2(2024年)によると、TLS 1.3、Certificate Pinning、HSTSの組み合わせは、モバイルアプリに対する既知のMITM攻撃ベクターの99%を排除します。開発者は、アプリケーションを公開する前に、mitmproxyなどのツールを使用して保護をテストすることをお勧めします。
よくある質問
MITM攻撃の兆候には、突然の接続速度低下、信頼できない証明書に関する警告(以前はなかったもの)、URLとページコンテンツの不一致が含まれます。モバイルアプリでは — Network Security ConfigのエラーやCertificate Pinningの作動があります。
VPNはVPNサーバーまでのトラフィックを暗号化し、ローカルネットワークでの傍受から保護します。ただし、攻撃者がVPNサーバーを制御している場合、またはMITM攻撃がプロバイダー側で発生する場合、VPNは保護しません。アプリケーションレベルのCertificate Pinningがより信頼性の高い方法です。
Evil Twinは、正当なネットワーク(例:「Airport_Free_WiFi」)を模倣した偽のWi-Fiアクセスポイントです。これはMITMの別のタイプではなく、侵入方法です:Evil Twinに接続すると、すべてのトラフィックが攻撃者を通過するため、ユーザーは自動的にMITM攻撃の被害者になります。
Certificate Pinningはセキュリティを向上させますが、サーバー証明書が変更された場合にアプリの更新が必要です。1つではなく複数のバックアップ証明書(backup pins)を指定することをお勧めします。プライマリ証明書が期限切れになると、アプリは更新なしでバックアップ証明書を使用します。
最も一般的なツール:mitmproxy — HTTP/HTTPSトラフィックの傍受と改ざん、BetterCAP — ARPスプーフィングとローカルネットワークでの傍受、Wireshark — パケット分析、sslstrip — HTTPSからHTTPへのダウングレード。これらのツールを知ることは、開発者が自身のアプリケーションの保護をテストするのに役立ちます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。