移动应用中的MITM攻击——什么是中间人攻击、类型及防止拦截

作者: IT Sectr 发布日期: 2026-04-04 阅读时间: 10 分钟

Man-in-the-Middle (MITM) — 一种"中间人"攻击,网络犯罪分子在双方不知情的情况下拦截、读取或修改双方之间的流量。根据卡巴斯基2025年的数据,针对移动设备的MITM攻击数量在过去两年中增加了35%。流量拦截的关键问题在于用户看不到攻击迹象——连接看起来正常。

要点

  • MITM攻击 — 拦截客户端和服务器之间的通信,在参与者不知情的情况下窃取或修改数据。
  • ARP欺骗 — 伪造网关MAC地址,通过攻击者的设备在本地网络中重定向流量。
  • SSL剥离 — 通过拦截第一个请求,将安全的HTTPS连接降级为不安全的HTTP。
  • 公共Wi-Fi — MITM攻击的主要环境:不安全的接入点允许拦截所有连接设备的流量。
  • 证书固定 — 最有效的保护方法:应用程序在代码层面验证服务器证书。

什么是MITM攻击?

中间人 (MITM) — 一种网络攻击类型,攻击者秘密潜入两方之间的通信渠道。攻击者可以拦截、读取和修改传输的数据,同时对双方保持不可见。

在移动应用中,MITM攻击尤其危险,因为设备不断连接到不同的网络——家庭、办公室、咖啡馆和机场的公共Wi-Fi。每次网络切换都可能为攻击创造机会。根据Verizon移动安全指数(2025年),43%的组织至少遭遇过一次针对企业移动设备的MITM攻击。

MITM的主要危险在于隐蔽性:用户和服务器不会收到拦截信号。会话看起来正常,数据传输正常,没有证书错误(如果攻击者使用自己的证书)。只有通过网络基础设施层面或使用专门工具才能检测到攻击。

开发人员必须了解MITM攻击的机制,以便在应用层面设计保护,而不是仅仅依赖传输层的安全。

MITM攻击的主要类型

MITM攻击的分类包括几种类型,它们在潜入通信渠道的方法上有所不同。在移动开发中,有三种类型最为相关。

本地网络中的ARP欺骗

ARP欺骗 — 一种技术,攻击者向本地网络发送伪造的ARP数据包,将自己的MAC地址与网关的IP地址关联。此后,受害者的所有流量都通过攻击者的设备路由,攻击者将流量转发给网关,同时保持不可见。

执行攻击只需使用EttercapBetterCAP等工具即可,这些工具可以自动化ARP欺骗。攻击仅在同一子网内可能,因此公共Wi-Fi网络的用户最容易受到攻击。在受管交换机上具有动态ARP检测(DAI)的现代网络可以阻止此类攻击。

在应用层面防范ARP欺骗是不可能的——这是网络基础设施的问题。然而,应用程序可以借助TrustKit(适用于iOS)或Network Security Config(适用于Android)等库来检测网络连接中的异常。

DNS欺骗和流量拦截

DNS欺骗(或DNS缓存投毒) — 在从客户端到DNS服务器的路径上伪造DNS记录。攻击者拦截应用的DNS请求并返回虚假IP地址,将流量引导到自己的服务器而非合法服务器。

在通过DHCP自动分配DNS服务器的公共网络中,这种攻击尤其有效。攻击者可以配置自己的DNS服务器,为目标域名返回虚假IP地址。用户在浏览器中看到合法的URL,但连接到的是攻击者的服务器。

应用端的DNS欺骗防护通过DNS-over-HTTPS(DoH)或DNS-over-TLS(DoT)实现,它们加密DNS请求。Android 9+和iOS 14+支持系统级DoH,应用可以显式启用此选项。

SSL剥离——绕过HTTPS

SSL剥离 — 一种攻击,攻击者将安全的HTTPS连接降级为不安全的HTTP。该技术利用了许多用户手动输入example.com而非https://example.com的事实,因此第一次连接是通过HTTP建立的。

诸如sslstrip(Moxie Marlinspike,2009年)和bettercap等工具会自动拦截HTTP请求,以自己的名义与服务器建立HTTPS连接,并通过HTTP将解密后的流量传输给客户端。浏览器不显示挂锁图标——用户不知道连接不安全。

现代防护 — HTTP严格传输安全(HSTS):服务器通知浏览器所有未来的连接必须仅通过HTTPS。HSTS预加载列表还可以防止首次攻击,但需要预先注册域名。

MITM攻击在移动应用中如何运作

一次典型的针对移动应用的MITM攻击经历四个阶段。每个阶段利用不同的漏洞,要完全保护需要阻断所有向量。

第一阶段——潜入:攻击者位于设备和服务器之间的流量路径上。这可能是本地网络中的ARP欺骗、虚假Wi-Fi热点(邪恶双子)或提供商的DNS服务器被攻破。移动设备在自动连接开放网络时特别容易受到攻击。

第二阶段——拦截:潜入后,攻击者开始读取应用和服务器交换的所有数据包。在此阶段,他收集元数据:请求URL、数据包大小、cookie、标头。即使数据已加密,元数据也可能泄露应用程序的结构和业务逻辑。

第三阶段——解密(如果流量已加密):攻击者建立两个TLS连接——一个与服务器(使用虚假证书),另一个与客户端。应用程序认为连接是安全的,但攻击者可以看到所有明文数据。如果没有证书固定,这对安装在系统存储中的任何证书都有效。

第四阶段——修改和窃取:攻击者不仅可以读取,还可以修改传输的数据。在金融应用中,这可能意味着更改收款人账号,在API请求中——更改授权参数。iOS和Android建议在应用层面实现响应完整性检查。

代码示例:Android和iOS上防止拦截的保护

让我们看看在Kotlin和Swift中使用证书固定来防范MITM攻击的实际示例。即使在系统存储被攻破的情况下,这些示例也能阻止证书替换。

Android上的证书固定(OkHttp)

OkHttp — 支持CertificatePinner的Android标准HTTP库。指定服务器证书的SHA-256哈希——所有其他证书将被拒绝。

kotlin
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上的证书固定(URLSession)

在iOS上,使用URLSessionDelegate手动验证服务器证书。将SecCertificateRef与本地保存的副本进行比较。

swift
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上的网络安全配置

Android通过XML文件network_security_config.xml支持声明式保护,无需编写代码即可在操作系统级别阻止流量。

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的方法

全面防范MITM攻击包括应用、服务器和网络基础设施层面的措施。以下是针对Android和iOS的主要建议。

使用证书固定——在应用程序代码中绑定服务器证书。与信任系统存储中任何证书的标准TLS验证不同,证书固定会检查特定证书或其公钥。Android上的OkHttp和iOS上的TrustKit提供了该机制的现成实现。

强制使用HTTPS和HSTS:所有网络请求必须通过HTTPS,服务器应返回Strict-Transport-Security标头。对于Android,在清单中添加android:usesCleartextTraffic="false"——这将在操作系统级别禁止HTTP连接。iOS从iOS 9开始默认通过应用程序传输安全(ATS)禁止HTTP。

实现响应完整性检查:使用应用程序验证的数字签名对服务器响应进行签名。即使攻击者(通过重新安装证书的代理)拦截了HTTPS流量,没有服务器的私钥也无法伪造签名。对关键操作使用带有RS256的JWT或HMAC签名。

在服务器端启用HTTP公钥固定(HPKP)——一个指示浏览器或应用程序哪个证书对特定域名有效的指令。然而,HPKP需要谨慎:错误配置可能会长时间阻止对应用程序的访问。Google建议仅结合备用证书使用HPKP。

根据NIST SP 800-52 Rev. 2(2024年),TLS 1.3、证书固定和HSTS的组合消除了99%已知的针对移动应用的MITM攻击向量。建议开发人员在发布应用程序之前使用mitmproxy等工具测试保护措施。

常见问题解答

如何判断我是否受到MITM攻击?

MITM攻击的迹象包括连接突然变慢、关于不信任证书的警告(以前没有的)、URL和页面内容不匹配。在移动应用中——网络安全配置错误或证书固定触发。

VPN能否防止MITM攻击?

VPN将流量加密到VPN服务器,这可以防止在本地网络中拦截。但是,如果攻击者控制VPN服务器,或者MITM攻击发生在供应商端,VPN无法保护。应用层面的证书固定仍然是更可靠的方法。

什么是邪恶双子攻击,它与MITM有何不同?

邪恶双子 — 模仿合法网络(例如"Airport_Free_WiFi")的虚假Wi-Fi热点。这不是一种单独的MITM类型,而是一种潜入方法:连接到邪恶双子后,用户自动成为MITM攻击的受害者,因为所有流量都经过攻击者。

证书固定如何影响应用程序的运行?

证书固定提高了安全性,但在服务器证书更改时需要更新应用程序。建议指定多个备用证书(backup pins)而不是一个。主证书过期后,应用程序将使用备用证书而无需更新。

黑客使用哪些工具进行MITM攻击?

最流行的工具:mitmproxy — 拦截和修改HTTP/HTTPS流量,BetterCAP — 本地网络中的ARP欺骗和拦截,Wireshark — 数据包分析,sslstrip — 将HTTPS降级为HTTP。了解这些工具有助于开发人员测试其应用程序的保护措施。

总结

  • MITM攻击 — 秘密拦截客户端和服务器之间的流量,允许在各方不知情的情况下读取和修改数据。
  • ARP欺骗在本地网络中运行,伪造网关MAC地址,通过攻击者重定向流量。
  • DNS欺骗伪造DNS记录,将流量引导到虚假服务器,保护措施 — DNS-over-HTTPS。
  • SSL剥离将HTTPS降级为HTTP,通过HSTS和在清单中禁止HTTP流量来防止。
  • 证书固定 — 主要的应用级保护方法,可通过OkHttp(Android)和URLSession(iOS)使用。
  • TLS 1.3、HSTS和证书固定的组合根据NIST消除了99%的MITM攻击向量。
  • 使用mitmproxy和BetterCAP测试保护措施在发布前对于处理机密数据的应用程序是强制性的。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读