Man-in-the-Middle (MITM) — 一种"中间人"攻击,网络犯罪分子在双方不知情的情况下拦截、读取或修改双方之间的流量。根据卡巴斯基2025年的数据,针对移动设备的MITM攻击数量在过去两年中增加了35%。流量拦截的关键问题在于用户看不到攻击迹象——连接看起来正常。
要点
中间人 (MITM) — 一种网络攻击类型,攻击者秘密潜入两方之间的通信渠道。攻击者可以拦截、读取和修改传输的数据,同时对双方保持不可见。
在移动应用中,MITM攻击尤其危险,因为设备不断连接到不同的网络——家庭、办公室、咖啡馆和机场的公共Wi-Fi。每次网络切换都可能为攻击创造机会。根据Verizon移动安全指数(2025年),43%的组织至少遭遇过一次针对企业移动设备的MITM攻击。
MITM的主要危险在于隐蔽性:用户和服务器不会收到拦截信号。会话看起来正常,数据传输正常,没有证书错误(如果攻击者使用自己的证书)。只有通过网络基础设施层面或使用专门工具才能检测到攻击。
开发人员必须了解MITM攻击的机制,以便在应用层面设计保护,而不是仅仅依赖传输层的安全。
MITM攻击的分类包括几种类型,它们在潜入通信渠道的方法上有所不同。在移动开发中,有三种类型最为相关。
ARP欺骗 — 一种技术,攻击者向本地网络发送伪造的ARP数据包,将自己的MAC地址与网关的IP地址关联。此后,受害者的所有流量都通过攻击者的设备路由,攻击者将流量转发给网关,同时保持不可见。
执行攻击只需使用Ettercap或BetterCAP等工具即可,这些工具可以自动化ARP欺骗。攻击仅在同一子网内可能,因此公共Wi-Fi网络的用户最容易受到攻击。在受管交换机上具有动态ARP检测(DAI)的现代网络可以阻止此类攻击。
在应用层面防范ARP欺骗是不可能的——这是网络基础设施的问题。然而,应用程序可以借助TrustKit(适用于iOS)或Network Security Config(适用于Android)等库来检测网络连接中的异常。
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连接降级为不安全的HTTP。该技术利用了许多用户手动输入example.com而非https://example.com的事实,因此第一次连接是通过HTTP建立的。
诸如sslstrip(Moxie Marlinspike,2009年)和bettercap等工具会自动拦截HTTP请求,以自己的名义与服务器建立HTTPS连接,并通过HTTP将解密后的流量传输给客户端。浏览器不显示挂锁图标——用户不知道连接不安全。
现代防护 — HTTP严格传输安全(HSTS):服务器通知浏览器所有未来的连接必须仅通过HTTPS。HSTS预加载列表还可以防止首次攻击,但需要预先注册域名。
一次典型的针对移动应用的MITM攻击经历四个阶段。每个阶段利用不同的漏洞,要完全保护需要阻断所有向量。
第一阶段——潜入:攻击者位于设备和服务器之间的流量路径上。这可能是本地网络中的ARP欺骗、虚假Wi-Fi热点(邪恶双子)或提供商的DNS服务器被攻破。移动设备在自动连接开放网络时特别容易受到攻击。
第二阶段——拦截:潜入后,攻击者开始读取应用和服务器交换的所有数据包。在此阶段,他收集元数据:请求URL、数据包大小、cookie、标头。即使数据已加密,元数据也可能泄露应用程序的结构和业务逻辑。
第三阶段——解密(如果流量已加密):攻击者建立两个TLS连接——一个与服务器(使用虚假证书),另一个与客户端。应用程序认为连接是安全的,但攻击者可以看到所有明文数据。如果没有证书固定,这对安装在系统存储中的任何证书都有效。
第四阶段——修改和窃取:攻击者不仅可以读取,还可以修改传输的数据。在金融应用中,这可能意味着更改收款人账号,在API请求中——更改授权参数。iOS和Android建议在应用层面实现响应完整性检查。
让我们看看在Kotlin和Swift中使用证书固定来防范MITM攻击的实际示例。即使在系统存储被攻破的情况下,这些示例也能阻止证书替换。
OkHttp — 支持CertificatePinner的Android标准HTTP库。指定服务器证书的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通过XML文件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的主要建议。
使用证书固定——在应用程序代码中绑定服务器证书。与信任系统存储中任何证书的标准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攻击的迹象包括连接突然变慢、关于不信任证书的警告(以前没有的)、URL和页面内容不匹配。在移动应用中——网络安全配置错误或证书固定触发。
VPN将流量加密到VPN服务器,这可以防止在本地网络中拦截。但是,如果攻击者控制VPN服务器,或者MITM攻击发生在供应商端,VPN无法保护。应用层面的证书固定仍然是更可靠的方法。
邪恶双子 — 模仿合法网络(例如"Airport_Free_WiFi")的虚假Wi-Fi热点。这不是一种单独的MITM类型,而是一种潜入方法:连接到邪恶双子后,用户自动成为MITM攻击的受害者,因为所有流量都经过攻击者。
证书固定提高了安全性,但在服务器证书更改时需要更新应用程序。建议指定多个备用证书(backup pins)而不是一个。主证书过期后,应用程序将使用备用证书而无需更新。
最流行的工具:mitmproxy — 拦截和修改HTTP/HTTPS流量,BetterCAP — 本地网络中的ARP欺骗和拦截,Wireshark — 数据包分析,sslstrip — 将HTTPS降级为HTTP。了解这些工具有助于开发人员测试其应用程序的保护措施。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。