2026 年 3 月 27 日,白宫发布了官方 iOS 应用(Bundle ID: gov.whitehouse.app),这是一款由 Executive Office of the President 发布的 React Native 应用,使用 Expo 框架和 Hermes 引擎构建。本安全分析仅使用公开可用的标准工具(stringsnmplutil),无需网络流量拦截或 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.sendLocationOSRequestSendOutcomesV2等符号即通过此方法定位。

Hermes 字节码反编译:该应用使用 React Native 的 Hermes 引擎,将 JavaScript 编译为字节码(.hbc)而非直接分发源码。通过hermes-dec工具可对字节码进行反编译,获得约 863,393 行重构的 JavaScript 代码。本次分析发现的secureFetch实现、SSL_PINNING_CONFIG变量以及 consent banner stripping 代码均来自反编译结果。

配置文件解析:使用plutil -p解析Info.plistEntitlementsexpo-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({...}, '*'),任何监听器均可接收消息。脚本还注册了scrollmousemovetouchstartkeydownclick等事件的全局监听器。

定位追踪能力:静默的后台权限

应用集成了十个 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 审核或用户知晓。

应用在每个社交 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/)