从Angry Birds看广告SDK隐私泄露:FireEye揭示移动生态数据收集风险
十多年前Angry Birds几乎是人手一个的国民级游戏我身边不少朋友第一台智能手机里装的第一批应用就有它。那时候大家都习惯了一个逻辑游戏免费、广告内嵌开发者靠广告赚钱天经地义。直到FireEye那篇关于Angry Birds广告系统泄露个人信息的分析报告在安全圈传开很多人第一次意识到——原来你玩游戏的时候广告SDK正在后台悄悄读取你的位置、设备标识、甚至通讯录相关的数据而这一切都发生在你点下允许权限的那一刻。这篇文章我想以从业者的视角把FireEye当年是怎么分析、广告系统到底干了什么、这件事对整个移动生态意味着什么掰开揉碎讲清楚。1. FireEye是谁为什么会盯上一个游戏1.1 一家安全公司的职业病FireEye对于今天搞安全的人来说并不陌生它早年以APT高级持续性威胁检测出名主要服务对象是企业客户、政府机构和大型组织。大家印象里它应该是在服务器机房和恶意软件样本堆里工作的怎么会跑去找一个休闲游戏的麻烦这其实恰恰是安全公司的职业病当一个新的平台成为海量用户日常依赖的对象安全研究者就一定会把注意力放过去。2010年之后智能手机出货量井喷移动应用成为网民使用互联网的第一入口而大多数用户对应用的权限授予毫无概念。FireEye做移动安全研究更多是出于对数据流向的敏感——任何App只要它收集数据的动作足够隐蔽、影响面够大就有被分析的价值。Angry Birds在那时候日活过亿是移动应用里的顶流研究它的样本价值远高于研究一个只有几百人使用的小众应用。还有个关键原因FireEye有自己的一套移动端风险分析系统可以自动化地对应用进行行为检测。他们当时在批量扫描安卓市场的热门应用时发现Angry Birds的请求路径和权限使用情况呈现出典型的广告SDK数据外传特征于是顺着这条线深挖。这个过程并不是针对某个游戏厂商的打假更像是安全公司例行巡航时发现了一个普遍问题的代表性样本。1.2 为什么偏偏是Angry Birds很多人会问这么多免费应用都带广告为什么FireEye偏偏拿Angry Birds说事有几个客观原因。第一它足够典型。Angry Birds用的广告SDK不是自己开发的而是集成了当时主流的第三方广告组件。这种开发者集成第三方SDK来实现广告变现的方式后来被验证是移动应用生态里最普遍的数据共享模式。解剖这个案例等于解剖了整个免费应用行业的数据链路。第二它的影响范围极其惊人。Angry Birds在巅峰期覆盖了iOS、Android等多个平台尤其是Android版本由于系统权限模型比较开放加上当时应用市场对权限申请的审核机制不完善研究的价值被放大了很多。第三它的无辜者属性特别强。一个看上去人畜无害的弹弓打猪的游戏谁会把它跟个人信息泄露联系起来FireEye选择这样的样本本身就是在向公众传递一个信息隐私风险跟应用类型无关跟应用背后接入了什么SDK有关。这也成了后来无数移动安全报告反复引用Angry Birds作为案例的重要原因。2. 广告系统到底怎么拿走你的手机信息2.1 藏在游戏里的广告SDK想理解FireEye的分析结论得先搞清楚广告SDK是个什么东西。SDK全称是Software Development Kit说人话就是开发工具包。广告SDK就是广告平台提供给开发者的一个代码库开发者把它集成到自己的App里SDK就能在合适的位置展示广告、统计广告的点击和转化情况最后按效果给开发者分成。听起来是个双赢的模式但问题出在广告平台的需求上。广告主投放广告的时候最关心的是看到广告的人是不是我的潜在客户。为了回答这个问题广告平台希望知道你是谁、你大概在什么位置、你最近在手机上做了什么事、你对什么话题感兴趣。这些信息从哪里来只能从用户手机里来。于是广告SDK的逻辑变成了这样App运行时SDK代码跟着一起运行它去读取当前设备的硬件信息比如型号、MAC地址、系统信息比如版本号、语言、用户产生的行为和位置信息然后打包发回广告平台的服务器。广告平台拿这些数据给用户画画像再根据画像匹配广告。这个过程对开发者来说几乎是无感的。很多开发者集成广告SDK的时候SDK会自动声明它需要的权限开发者通常直接拉进工程里跑通就上线了很少有人会去逐行读SDK的源码、逐项审查权限请求的合理性。FireEye在分析Angry Birds时看到的现象就是如此游戏本身的代码很干净但SDK的代码在后台做了大量额外工作。2.2 权限申请与数据收集的技术链路FireEye的分析显示Angry Birds的Android版本在权限声明上非常丰富除了游戏运行必需的网络访问、震动反馈等权限外还申请了定位权限ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION和设备状态权限READ_PHONE_STATE。前者可以拿到GPS和基站定位信息后者在Android旧版本上可以直接读取IMEI码。这里要补充一个背景十年前的Android系统对权限的管理跟今天是完全两码事。Android 6.0之前所有权限都在安装时一次性授予用户要么全部接受要么放弃安装没有中间选项。也就是说用户装游戏时点了同意后面游戏SDK利用这些权限做什么用户完全管不了。在动态运行中FireEye观察到广告SDK在App启动后就开始工作它通过READ_PHONE_STATE拿到IMEI/IMSI通过GPS/网络定位拿到经纬度坐标再结合设备型号、语言设置、系统版本等参数拼成一个HTTP请求发送到广告服务器。请求的URL里这些信息往往就直接挂在query参数上相当于把人家的身份证号、住址写在明信片上寄出去——没有加密没有脱敏。更有意思的是对通讯录和个人信息的间接获取。FireEye以及后来很多安全公司的分析都发现部分广告SDK在获得相应授权后会读取用户的联系人列表、通话记录、短信等高度敏感的数据。这些数据在广告生态里的用途有两条一是做社交图谱用来预测用户的职业、收入、社交圈层从而更精准地投放二是作为信任背书比如信用评估类业务会购买这些数据。当然这已经远超广告投放本身的必要性了。2.3 免费游戏的代价从商业逻辑上说免费应用靠广告赚钱没有原罪但这里有个容易被忽略的边界问题广告SDK收集的数据里哪些是投放广告所必需的哪些是收集起来以后可能有用的。打个比方你去商场逛街商场保安为了安全需要知道你在几点几分进入哪个区域这是合理的但如果保安跟着你到每个柜台前记录你摸了哪些商品、看了多久、然后把这些记录打包卖给别的商户这就明显越界了。广告SDK在Angry Birds里的行为用这个类比来看已经不是保安而是商业侦探了——它想知道你住哪定位、你用什么手机IMEI、你的社交关系通讯录、你每天什么时候活跃。更值得警惕的是数据的二次、三次流转。FireEye当时在分析中指出应用内的广告SDK不只有一个可能同时嵌入了两到三家广告平台的SDK每家都往自己的服务器发数据。这些数据到了广告平台手里平台之间还会互换、合并、出售。也就是说你在一个游戏里的行为数据最终可能被十几个互不相关的公司掌握。这种免费换数据的模式本质上是把用户变成了产品。用户付出的不是钱而是自己的行为数据和隐私。FireEye这份分析之所以能引起轩然大波就是因为它第一次用公众能听懂的方式把一个长期被行业默许的潜规则摆到了台面上。3. FireEye当年是怎么一步步查出问题的3.1 分析手段静态与动态结合FireEye走的是一条标准的移动应用安全分析路径这套方法论放到今天依然成立值得每一个做移动安全的人反复揣摩。第一步是静态分析。拿到Angry Birds的APK安装包先解包查看AndroidManifest.xml看它声明了哪些权限。权限声明是第一现场——如果一个游戏声明了定位、读取设备状态、读取联系人等权限基本就等于告诉分析师我的代码里可能有这些东西的处理逻辑。接下来是反编译。APK里的Java代码可以被反编译成可读的Smali代码或直接还原成Java代码从而看清SDK到底调用了哪些敏感的API。FireEye的工程师会在代码里搜索TelephonyManager获取IMEI、LocationManager获取定位、ContentResolver访问通讯录这些关键词定位到具体的调用点然后顺着调用链往下看数据去了哪里。第二步是动态分析。静态分析能告诉你代码有这个能力但无法确认这个能力在运行时到底用没用。所以FireEye会在受控的测试环境里运行应用通过抓包工具观察所有的网络请求。他们发现应用启动、游戏场景切换、广告刷新这三个时机都会触发数据上报上报的服务器地址指向多个不同的广告平台域名而不是游戏开发商自己的服务器。第三步是交叉验证。把静态分析得到的代码调用关系和动态分析抓到的网络请求内容放在一起比对就能确定哪些数据是真的被发送了出去发送到什么地址字段长什么样。FireEye的分析报告里最有力的部分就是直接展示了抓包抓到的HTTP请求里面可以看到IMEI、经纬度等敏感字段的明文。3.2 暴露出的数据维度综合FireEye当年的分析Angry Birds及其广告SDK在数据收集中主要涉及以下几个维度数据类别具体字段获取方式风险等级设备标识IMEI、IMSI、MAC地址、Android IDREAD_PHONE_STATE权限高可用于跨应用追踪用户地理位置GPS经纬度、基站信息定位权限高暴露行踪设备环境手机型号、OS版本、屏幕分辨率、语言API自动获取中用于设备指纹用户行为游戏时长、广告点击记录、应用列表SDK埋点中高用于行为画像通讯录/通话联系人姓名、号码、通话频率通讯录权限极高超出广告必要范围注意这里有个容易混淆的点游戏本身的玩法逻辑并不需要定位和读取设备状态这些权限纯粹是为广告SDK服务的。也就是说Angry Birds是无辜的但集成在它体内的广告SDK不是。这个区别很重要——它意味着即使某个App本身是靠谱的只要它的广告SDK环节出了问题整个App的用户隐私一样会失守。3.3 传输环节的问题FireEye在分析中特别指出这些敏感数据的传输过程也极不安全。当时很多广告SDK使用的是HTTP明文协议而不是HTTPS加密协议。用明文传输就意味着任何在同一个Wi-Fi网络下的人只要稍微懂一点抓包技术就能截获你手机上发出去的IMEI、定位信息。这在技术圈叫中间人攻击。想象一下你在咖啡馆连上公共Wi-Fi打开游戏玩了一局游戏里的广告SDK向广告服务器发了一个请求里面包含你的IMEI和当前位置。同时坐在你对面的一个人用笔记本开启了Wi-Fi嗅探他不需要入侵你的手机只需要嗅探网络数据包就能看到你发的这些内容明文。即使后续广告SDK升级成了HTTPS数据泄露的风险并没有消失只是转移到了服务器端——HTTPS只保护传输过程不被第三方窃听但数据到达广告平台服务器之后平台怎么用、怎么存、和谁共享用户依然管不着。FireEye这份分析的价值在于它把从SDK到服务器的整条链路里每一个肉眼可见的风险点都点了一遍让后来者知道往哪个方向去堵。4. 从愤怒的小鸟看整个移动生态4.1 这不是一个游戏的问题如果你以为Angry Birds只是一个个例那就大错特错了。FireEye在分析了大量热门应用后发现很多免费应用都存在类似的行为模式。广告SDK供应商就那么几家它们被集成在成千上万个应用里只要集成方式不当、权限申请过度就等于在几亿人的手机里同时埋下了一颗隐私数据定时炸弹。这件事的深层问题出在产业链的激励机制上。广告平台按效果付费效果好不好取决于对用户的了解程度深入了解的手段就是收集更多数据。开发者想提高广告收入就会对SDK的权限申请睁一只眼闭一只眼。用户想要免费应用就得用数据付费。在这个三方博弈里只有用户是弱势的因为他甚至不知道交易发生了更别说在交易里讨价还价。这就像你在超市买一送一促销时被要求登记身份证和家庭住址促销员说这是为了后续提供更好的服务。你稀里糊涂填了回头发现这份信息被发给了所有合作商家。Angry Birds的广告SDK模式本质上就是整个行业在没有规则约束时自动走向了数据全收集。4.2 设备标识符的变迁与广告追踪的博弈FireEye分析里的一个重点内容是IMEI和MAC地址等设备标识符的使用。这些标识符对用户来说有一个致命特点永久性。只要不换手机IMEI永远不变。广告平台拿到一个IMEI就等于拿到了一个永久会员ID可以长期跟踪同一个用户在这台手机上的一切行为轨迹。时间是公平的它证明了这个担心是真的。十多年来移动操作系统在设备标识符上进行了好几轮限权演进Android系统逐渐限制第三方应用获取IMEI从Android 10开始非系统应用彻底无法读取IMEIiOS也推出了广告标识符IDFA并不断收紧其使用权限到了iOS 14.5之后应用要跟踪用户必须弹窗请求用户授权。这些变化的背后其实就是对永久标识导致了永久追踪这一逻辑的纠偏。行业最后找到的折中方案是用一个可重置的广告ID来代替永久硬件标识。用户可以在设置里一键还原广告标识符等于换了一个新的ID让广告平台之前的追踪全部失效。这个机制现在看起来理所当然但在当年Angry Birds的时代还不存在这样的概念。4.3 隐私保护的技术演进除了系统层面的权限收紧这十年里技术圈也诞生了大量与隐私保护相关的工具和方案。客户端方面越来越多的App开始采用差分隐私技术在统计数据中加入一定的噪声让单个用户的数据无法被精确识别但整体数据仍然有统计意义。服务端方面联邦学习被用在了个性化推荐场景里模型在用户本地设备上训练只上传模型参数而不是原始数据最大程度减少了用户数据离开手机的概率。还有一个方向是隐私计算。多方安全计算、可信执行环境等技术的落地让数据可以在不暴露明文的前提下被计算和使用。这些技术在最开始被讨论的时候很多人觉得是学术圈自嗨但随着隐私法规的持续收紧如今已经成了大中型数据平台的基础设施标配。如果你的工作涉及数据采集和用户画像我的建议是把隐私问题当作功能性需求来设计而不是事后补救。项目一开始就明确哪些数据能采集、采集了往哪里放、放到什么程度为止远比出了事再找法务背锅要好。5. 开发者和用户各自能做什么5.1 开发者的SDK管理清单Angry Birds这个案例对我的实际工作影响很大。从那时候起我经手的每一个移动端项目都会把SDK审查列入研发流程的必选项。这里整理一份我自己一直在用的清单供大家参考。第一权限最小化。每次接入第三方SDK之前先看它声明了哪些权限。如果一个广告SDK声明了读取通讯录、读取通话记录这类权限果断放弃这不是一个正经广告SDK该干的事。同时即使是定位权限也要问一句这是广告投放必需的吗很多广告场景其实只需要粗略定位也就是城市级别就够了没必要申请精确定位。第二SDK行为审查。不要只看SDK的文档要实际操作一遍。把SDK集成进一个空壳App然后抓包观察它到底往哪些域名发了什么数据。这件事听起来费时间但做一次能省掉后面无数次的隐私合规扯皮。第三动态权限适配。Android 6.0之后的运行时权限机制给开发者提供了一个在用户使用时授权的流程这是一个天然的隐私缓冲带。真正需要精确定位的功能在用户真正用到时才弹出授权请求比一启动就弹窗要友好得多也更符合合规预期的目的明确原则。第四数据加密与最小化存储。App向服务器传输敏感字段必须使用HTTPS且服务端收到数据后能脱敏的脱敏、能删除的删除不能把可能有用作为无限期存储数据的理由。第五SDK版本及时更新。广告SDK也在不断进化一方面补安全漏洞另一方面也在适应新的隐私规范。长时间不更新SDK等于让一个藏着旧漏洞的组件继续在我们的应用里跑。5.2 普通用户的自我保护从用户端来说虽然大环境的改善需要整个行业努力但我们自己也有一些很容易做到的动作。安装应用的时候不要一路点允许稍微花十秒钟看一下它申请的权限。一个手电筒应用要读取你的通讯录合理吗一个计算器要定位合理吗不合理的就不装这是最简单也最有效的一层过滤。系统设置里现在普遍提供隐私看板功能可以查看某个App在后台偷偷调用了多少次定位、多少次相机。定期翻一翻这个看板能发现很多惊喜。我实际见过某个不知名的美颜类App一小时调用了30多次定位这种应用留着过夜都是风险。再有就是前面提到的广告标识符还原功能。Android和iOS都提供了重置广告ID的选项隔一段时间随手点一下重置等于把广告平台追踪你的连接线切断了。虽然广告还是会展示但它再也认不出你是不是它记忆里的那个用户。6. 警惕移动广告SDK的后续风险形态6.1 从广告SDK到数据SDKAngry Birds让广告SDK成了众矢之的但这几年我也观察到一种新的趋势广告SDK里的数据收集能力正在被更高阶的数据SDK替代。数据SDK的行为更隐蔽它不直接弹广告而是专门负责采集用户行为数据然后卖给数据交易平台或风控公司。它的运行方式与广告SDK类似也在后台默默收集设备指纹、行为轨迹等但它的对外输出链路更复杂数据可能会经过多级中转服务器给监管和用户核查带来更大难度。这种SDK经常会包装成统计分析工具崩溃监控工具增长分析工具出现在开发者生态里很多开发者根本没意识到自己接进来的分析插件背后挂了一整套数据出售网络。我处理过不止一个项目开发者在排查应用耗电异常时才发现一个标榜200KB极简统计SDK的组件实际在后台每5分钟上报一次设备全量信息。6.2 合规红线与实际落地差距这些年隐私保护的法规和监管框架逐步完善很多大厂都设置了专门的隐私合规团队应用商店上架审核也比十年前严格了不止一个量级。但坦白讲在实际落地层面合规文件漂亮和实际没乱采之间仍然可能存在一道隐性差距。从我的经验来看真正想把隐私保护落到实处最有效的做法不是等审查而是从源头做减法与其花大量人力去证明我们没有滥用数据不如干脆就少采、不采。拿地图应用来说它确实需要定位权限拿手电筒应用来说它不该碰的位置最好一下都不要碰。主动把收集数据的最小化原则当成开发习惯很多隐私问题根本不会发生。这也是Angry Birds案例留给移动开发者最核心的教训应用本身是谁决定了它死掉时的墓碑上写什么但应用集成什么东西决定它在活着的时候会泄漏多少。FireEye当年的分析只是揭开了冰山一角而冰山真正消融需要开发者和用户一起使劲——开发者少埋一颗雷用户多一分清醒移动生态才不至于在免费的名义下把隐私变成消耗品。