2026 年 3 月 27 日,白宫发布了官方 iOS 应用(Bundle ID: gov.whitehouse.app),这是一款由 Executive Office of the President 发布的 React Native 应用,使用 Expo 框架和 Hermes 引擎构建。本安全分析仅使用公开可用的标准工具(strings、nm、plutil),无需网络流量拦截或 DRM 破解,所有发现均可由任何从 App Store 下载该应用并拥有终端的用户复现。
工具链与逆向方法论
iOS 应用二进制分析的核心在于从 IPA 包中提取可执行文件并进行多维度静态分析。本次审计使用的方法论如下:
IPA 获取与提取:使用ipatool通过 Apple ID 认证从 App Store 下载 IPA 文件,随后使用标准unzip命令解压。IPA 本质上是一个 ZIP 压缩包,解压后可获得Payload/*.app目录,其中包含可执行二进制、Framework、Assets 和配置文件。
二进制符号分析:通过nm命令列出二进制中的符号表,可以快速定位关键函数和方法名称。otool -L用于查看链接的动态库,codesign -dvv用于检查代码签名和 entitlements。本次分析中发现的OneSignalLocationManager.sendLocation、OSRequestSendOutcomesV2等符号即通过此方法定位。
Hermes 字节码反编译:该应用使用 React Native 的 Hermes 引擎,将 JavaScript 编译为字节码(.hbc)而非直接分发源码。通过hermes-dec工具可对字节码进行反编译,获得约 863,393 行重构的 JavaScript 代码。本次分析发现的secureFetch实现、SSL_PINNING_CONFIG变量以及 consent banner stripping 代码均来自反编译结果。
配置文件解析:使用plutil -p解析Info.plist、Entitlements和expo-configuration等属性列表文件,可提取应用声明的权限、配置参数和元数据。
运行时 JavaScript 注入:六处攻击面
应用中存在六个 Elfsight 社交媒体 widget,每个 widget 在独立的 WebView 中加载https://elfsightcdn.com/platform.js。Elfsight 是一家最初在俄罗斯图拉成立、现迁移至安道尔的 widget 公司。这一发现的严重性在于:
动态代码加载机制:platform.js采用两阶段加载模式。首先从 CDN 加载主脚本,随后向core.service.elfsight.com/p/boot/发起请求获取 widget 配置和 assets 数组。服务器响应的 assets 数组包含额外的脚本 URL,由客户端动态创建<script>标签并执行。这意味着 Elfsight 服务器可以在任意时刻向所有用户推送新脚本,无需应用更新和 App Store 审核。
缺乏子资源完整性(SRI):应用未对加载的外部脚本实现 SRI 哈希校验,无法验证脚本是否被篡改。若 Elfsight 的 CDN 或服务器被攻击者控制,可向应用注入任意 JavaScript 代码。
数据泄露风险:每个 WebView 通过ReactNativeWebView.postMessage()桥接与 Native 层通信,且 Elfsight 的platform.js使用通配符postMessage({...}, '*'),任何监听器均可接收消息。脚本还注册了scroll、mousemove、touchstart、keydown、click等事件的全局监听器。
定位追踪能力:静默的后台权限
应用集成了十个 OneSignal 框架,总计约 2.4MB,其中包含OneSignalLocation.framework(104KB)。符号分析揭示了完整的位置追踪管道:
+[OneSignalLocationManager sendLocation]
+[OneSignalLocationManager requestLocation]
+[OneSignalLocationManager beginTask]
+[OneSignalLocationManager startLocationSharedWithFlag:]
-[OneSignalLocationManager locationManager:didUpdateLocations:]
Info.plist 中声明了NSLocationAlwaysAndWhenInUseUsageDescription权限,意味着应用可在后台持续获取 GPS 坐标。讽刺的是,应用内没有任何需要定位的功能 —— 没有地图、没有本地新闻、没有附近活动展示。这种 “无功能必要性” 的定位权限是典型的红旗信号。
隐私声明与实际行为:系统性偏差
Apple 要求应用通过 Privacy Manifest(PrivacyInfo.xcprivacy)声明数据收集行为,相当于数据 “营养标签”。该应用声明:
NSPrivacyCollectedDataTypes: [] // 空数组
NSPrivacyTracking: false
但二进制和 Framework 分析揭示了完全不同的画面:
| 数据类型 | 证据 |
|---|---|
| GPS 坐标 | OneSignalLocationManager.sendLocation, setLocationWithLatitude:longitude: |
| 设备标识符 | OneSignal 推送令牌,pushSubscriptionId, externalId |
| 行为分析 | OSRequestSendOutcomesV2, OSRequestOnFocus(发送 activeTime、netType、deviceType、influenceParams) |
| 通知互动 | OSRequestSubmitNotificationOpened, OSRequestInAppMessageViewed/Clicked |
| 用户身份 | OSRequestCreateUser, OSRequestIdentifyUser, OSRequestAddAliases |
这构成了对 Apple App Store Review Guidelines Section 5.1.2 的违反。
远程参数控制:OneSignal 的暗门
符号分析发现OneSignalCore.framework中存在OSRemoteParamController:
-[OSRemoteParamController saveRemoteParams:]
-[OSRemoteParamController saveLocationShared:]
-[OSRemoteParamController savePrivacyConsentRequired:]
-[OSRemoteParamController hasLocationKey]
-[OSRemoteParamController hasPrivacyConsentKey]
这些是标准 OneSignal SDK 功能,但含义重大:OneSignal 服务器可以远程启用或禁用 GPS 追踪、修改隐私同意要求,全部无需应用更新、Apple 审核或用户知晓。
Consent Banner 强制移除
应用在每个社交 WebView 中注入了强制移除 cookie 同意横幅的 JavaScript 代码:
(function() {
var css = document.createElement('style');
css.textContent = [
'[class*="cookie"], [id*="cookie"]',
'[class*="consent"], [id*="consent"]',
'[class*="gdpr"], [id*="gdpr"]',
'[class*="onetrust"], [id*="onetrust"]',
'[class*="login-wall"], [class*="loginWall"]',
'[class*="signup-wall"], [class*="signupWall"]',
'[class*="upsell"], [class*="Upsell"]',
].join(',') + '{ display: none !important; }';
document.head.appendChild(css);
var observer = new MutationObserver(function() {
var els = document.querySelectorAll(
'[class*="cookie" i], [class*="consent" i], [class*="gdpr" i]'
);
els.forEach(function(el) { el.style.display = 'none'; });
});
observer.observe(document.body, { childList: true, subtree: true });
})();
该代码使用 MutationObserver 持续监控并隐藏出现的同意元素。当第三方网站询问 “你同意 cookies 吗” 时,应用代表用户回答 “你无权询问”。
安全加固缺失:政府应用的警示
审计发现该应用的安全态势令人担忧:
| 安全控制 | 状态 |
|---|---|
| 证书固定 | 无(仅有 JS 层域名白名单,无 TLS 级别证书或公钥固定) |
| 越狱检测 | 无 |
| 防篡改 | 无 |
| 反调试 | 无 |
| 代码混淆 | 无(仅 Hermes 字节码) |
| 应用认证 | 无 |
| 运行时完整性检查 | 无 |
应用包含名为SSL_PINNING_CONFIG的变量和secureFetch包装器,但经过反编译发现,“固定” 仅是 JavaScript 级别的域名白名单验证,不涉及任何 SHA-256 证书哈希或 TLS 层固定。React Native 自带的 SocketRocket WebSocket 库虽支持固定(SRPinningSecurityPolicy),但主二进制从未引用 —— 是死代码。
同一 WiFi 网络上的任何人均可使用代理拦截 API 流量。越狱设备可随时 Hook 并修改应用行为。
空中更新基础设施:隐藏的远程代码部署管道
Expo Updates 基础设施已完整配置(虽当前禁用):
EXUpdatesEnabled: false
EXUpdatesCheckOnLaunch: NEVER
EXUpdatesURL: https://u.expo.dev/1590bd5c-74a2-4dd4-8fe6-ff5552ca15b6
EXUpdatesRuntimeVersion: 47.0.0
expo-channel-name: production
对于普通应用这是标准功能,但对政府应用含义不同。控制 Expo 项目账户的攻击者可提交伪装为 bug 修复的原生更新,启用EXUpdatesEnabled,之后可向所有安装推送任意 JavaScript,跳过 Apple 的独立审核环节。reloadAsync函数已存在于 bundle 中。
结论与建议
白宫 iOS 应用的安全问题并非技术能力不足,而是对移动安全基本原理的忽视。建议采取以下修复措施:
移除 Elfsight 并自托管社交 feed widget;移除 OneSignalLocation.framework 并从 Info.plist 删除位置权限声明;修正隐私 manifest 以准确声明所有数据收集;实现 TLS 证书固定以防止 MITM 攻击;移除 consent banner stripping 代码;添加安全加固措施(越狱检测、防篡改、运行时完整性检查);审计 OneSignal 远程参数表面或迁移至自托管推送基础设施;完全禁用或移除 Expo OTA 配置。
这些问题的根本原因在于开发团队可能缺乏移动安全审计流程,或未将政府应用的安全要求与消费级应用区分开来。关键教训是:政府应用不仅需要功能可用,更需要经受与普通应用同等甚至更严格的公开安全审查。
资料来源:Atomic Computer 安全团队于 2026 年 3 月 27 日发布的安全分析报告(https://www.atomic.computer/blog/white-house-app-security-analysis/)