一、前言
有研究结果表明,智能手机发出的Wi-Fi信号可以用来被动追踪用户的生活轨迹。通常情况下,人们会关闭设备的Wi-Fi开关,以此阻挠这种跟踪行为(参考链接1,2)。事实上,Wi-Fi跟踪行业的从业者也建议用户运用这种方式来避免被跟踪。
图1(b).Android 4.4.4中的"始终允许扫描"选项
三、分析设备产生的Wi-Fi活动
我们对5个设备进行了测验,所涉及的Android系统范围从2.2.1到6.0.1。实验设备具体如下:
Galaxy S3:Samsung Galaxy S3(GT-I9...),Android 4.4.4
HTC wildfire,Android 2.3.7,CyanogenMod 7.2.0
Samsung Galaxy Spica,Android 2.2.1,CyanogenMod 6.1.1
Nexus S,Android 4.3,CyanogenMod 10.2.1.1
OnePlus One,Android 6.0.1,CyanogenMod 13.1.2
3.1 实验方案
我们对每个智能手机在不同的设置以及不同的活动下产生的Wi-Fi流量进行了监控。设备与接入点之间没有关系。为了监控Wi-Fi活动,我们运用了一个处于监控模式下的Wi-Fi接口,在固定信道上捕获流量。我们从收集到的Wi-Fi帧中提取源MAC地址,以识别某个设备生成的流量。事实上,这些设备发出的所有Wi-Fi帧的头部中都包含设备的MAC地址(这些设备并不支持MAC地址随机化)。
我们考虑了如下几个选项:
Wi-Fi开关:这个选项可以控制Wi-Fi是否处于激活状态。
始终允许扫描(Always allow scanning):当Wi-Fi处于关闭状态时,这个选项可以允许设备进行Wi-Fi扫描。
定位(Location):这个选项能够控制定位功能。在某些设备中,这个选项分为两个选项:基于GPS的地理位置选项以及基于蜂窝数据/Wi-Fi的地理位置选项。我们只考虑后一种情况。
我们测验了以下几种活动状态,我们认为这几种状态可以反映设备的常见用途:
点亮屏幕(Screen on):屏幕点亮,在设备上切换多个面板,在几分钟内保持这个状态。
空闲(Idle):5分钟内没有接触设备,使屏幕自动关闭。
退出空闲状态(Leaving idle):按下电源键,使设备离开空闲状态。
Google Maps:设备正在运行Google Maps。
启动Google Maps:用户启动Google Maps。
不相关状态(Uncorrelated):此事件发生时,与用户的具体活动没有任何显著的关联性。
对于每个设备,我们尝试了前面提到过的所有选项,然后遍历了上面提及的所有活动状态,捕捉不同状态下设备的Wi-Fi流量。
除了OnePlus One以及Galaxy S3之外,其他所有设备都没有其他互联网连接渠道。
3.2 测量结果
我们将测量结果以表格进行展示,在测量期间,设备只产生了探测请求(probe request)类型的帧。
3.2.1 Galaxy S3
经过测量后,我们发现此设备的Wi-Fi行为由三个参数共同决定,即:“Wi-Fi开关”、“始终允许扫描”以及“定位”选项。显然,当Wi-Fi处于激活状态时,设备可以随时发送Wi-Fi帧,特别是当设备离开空闲模式时更加显著。
启动Google Maps时,如果定位选项同时处于激活状态,那么设备同样会发送探测请求。不论Google Maps是否处于运行状态,我们都可以观察到探测报文。
从以上观测结果中,我们可以发现,简单禁用掉Wi-Fi并足以完全阻挠Wi-Fi的活动。比如,如果“始终允许扫描”以及“定位”选项处于启用状态,那么只要运用Google Maps,设备就会产生Wi-Fi流量。这很有可能与运用基于Wi-Fi的Google定位引擎有关。
表1.Galaxy S3在各种设置下产生的Wi-Fi活动
只有当Wi-Fi以及“始终允许扫描”选项处于禁用状态时,此时不论定位选项是否启用,我们都观察不到设备的Wi-Fi活动。
当定位及Wi-Fi处于禁用状态,而始终允许扫描处于启用状态时,我们观测到了Wi-Fi扫描事件,而这个事件无法与设备上的任何具体的行为联系在一起。也就是说,无论手机上如何操作,这些扫描事件似乎总是会出现。我们并不清楚这些扫描动作的目的何在。
3.2.2 OnePlus One
OnePlus One的观测结果如表2所示,这款设备与上一款设备的结果相似,不同的是,我们无法停用OnePlus One的“始终允许扫描”选项。不同之处在于:当Wi-Fi开关以及定位选项所有关闭时,每当离开空闲模式时,该设备依旧会发送一大串探测请求报文。这一行为的具体原因尚未理清,但给我们带来了很麻烦的事情:这意味着除非我们运用设备的飞行模式,或者完全关闭这个设备,否则我们无法阻挠设备发送探测请求报文。
表2.OnePlus One在各种设置下产生的Wi-Fi活动
注:在这款设备上,我们无法在设置面板中找到“始终允许扫描”选项。
3.2.3 Nexus S
Nexus S的测量结果如表3所示,只与Galaxy S3的结果有些许不同。我们可以注意到,即便Wi-Fi开关以及定位选项处于关闭状态,只要我们切换“始终允许扫描”选项,设备就会发送一大串探测请求报文。
表3. Nexus S在各种设置下产生的Wi-Fi活动
注:
*:设备会马上提示用户激活定位功能,点击“OK”按钮即可。
**:只要切换“始终允许扫描”选项,设备就会发送一大串探测请求报文。
3.2.4 HTC WildFire以及Galaxy Spica
HTC WildFire的测量结果如表4所示,我们对这个结果并不会感到意外。在早期版本的Android系统中,“始终允许扫描”这个选项并不存在,只有Wi-Fi开关处于打开状态时,设备才会发送探测请求报文。我们没有展示Samsung Galaxy Spica的测量结果,因为这一结果与WildFire的结果非常相近,唯一的分别在于,当处于或离开空闲模式时,设备不会发送探测请求报文。
表4.HTC WildFire在各种设置下产生的Wi-Fi活动
注:这个设备搭载的是早期版本的Android系统,不存在“始终允许扫描”选项。
3.2.5 Moto G5 Plus
联想Moto G5 Plus的测量结果如表5所示。这个设备搭载了经过稍微定制的Android 7.0系统,并且设备的随机化行为也非常奇怪:只有处于空闲模式时,设备才会在探测报文中运用随机化的MAC地址。只有当Wi-Fi处于禁用状态下,我们才可以通过Wi-Fi设置面板来访问“始终允许扫描”选项,或者我们也可以通过“定位设置”面板来访问这个选项。
表5.Moto G5 Plus在各种设置下产生的Wi-Fi活动
注:
*:当处于空闲状态时,设备会持续发送探测请求报文,并且在报文中运用随机化MAC地址,其他情况下会运用真实的MAC地址。
3.2.6 对测量结果的总结
当Wi-Fi处于激活状态时,所有设备都会发送Wi-Fi报文,这点与我们的预期相符。当Wi-Fi处于禁用状态时,根据设备搭载的Android系统版本的不同,我们观察到两种不同的行为。对于老版本系统而言(2.2.1以及2.3.7版),当关闭Wi-Fi时,我们没有观察到Wi-Fi报文。对较新的版本而言(4.3以及更高版本),Wi-Fi行为取决于“始终允许扫描”选项是否启用。当“始终允许扫描”选项激活时,不论设备的Wi-Fi开关是否关闭,设备都会发送Wi-Fi报文。为了完全禁止设备发送Wi-Fi报文,我们需要同时禁用Wi-Fi以及“始终允许扫描”选项。我们注意到OnePlus One这款设备中没有“始终允许扫描”选项,因此,运用这款设备时,只有关闭手机或者运用飞行模式,否则我们无法阻挠手机发送Wi-Fi报文。
3.3 探测频率
探测频率与具体设备、配置以及运用场景有关。虽然我们的研究目的并不是想找出具体的差别,我们可以发现,在某些场景下,设备发送信号的频率会处于较高水平。在这种情况下,对设备进行跟踪的可能性就会大大提升。比如,对于OnePlus One这款设备来说,如果Wi-Fi开关或者定位选项处于启用状态,当用户打开Google Maps使用时,设备就会以每5秒一次的频率来发送探测请求报文。
4、提示激活定位功能
在某些版本的Android系统上,启动Google Maps时,如果定位功能处于未激活状态,设备就会立刻提示用户激活定位功能。在HTC WildFire上,用户会被重定向到相应的设置面板。在OnePlus One上,只要点击弹出消息中的“OK”按钮,就会马上激活这个选项。如果用户忽略掉这条消息,后续再启动Google Maps时不会再次弹出相应的对话框。然而,如果用户再次点击定位按钮(图2右下角那个按钮),那么这个对话框会再次弹出。在Nexus S上,我们发现有两种情况可能会出现(2所示):
如果Wi-Fi开关处于禁用状态,并且定位选项以及“始终允许扫描”选项也处于禁用状态,那么设备会提示用户激活这两个选项,如果用户点击“Yes”按钮,那么就会激活这两个选项。
如果Wi-Fi开关处于激活状态,而定位选项以及“始终允许扫描”选项处于禁用状态,设备只会弹出对话框提示用户激活定位选项,没有提示激活“始终允许扫描”选项。
图2(a).启用“始终允许扫描”选项时,Nexus S上的Google Maps提示用户激活Wi-Fi
图2(b).禁用“始终允许扫描”选项时,Nexus S上的Google Maps提示用户激活Wi-Fi
在OnePlus One上,Google Mpas会弹出对话框,请求用户激活Wi-Fi,3所示。
图3(a).简略信息
图3(b).点击展开按钮后显示详细信息
五、总结
在Android系统上,禁用Wi-Fi并不够以阻挠设备发送Wi-Fi报文,某些设备在Wi-Fi被禁用后依然会产生Wi-Fi报文。因此,禁用Wi-Fi后,我们并不能够完全躲避Wi-Fi追踪系统对用户的数据收集行为。为了阻挠设备发送Wi-Fi报文,我们需要同时禁用设备上的两个功能:我们必须同时禁用Wi-Fi开关以及“始终允许扫描”选项,才能保证设备处于静默状态。在某些设备上,我们甚至无法看到那个选项,这意味着用户无法阻挠手机发送Wi-Fi报文。
虽然Android在较新版的系统中引入了MAC地址随机化机制[1],还是有一些设备不支持这个功能。从6.0版起,Android开始支持MAC地址随机化功能,而现在54.2%的Android设备依然在运用老版本的系统[2]。此外,只要硬件支持MAC地址随机化,MAC地址随机化就应该处于激活状态,然而这种情况在2017年还非常少见。
六、参考资料
[1] Android 6.0改动
[2] Android平台版本说明
[3] Android定位策略
[4] Android扫描论坛
[5] 华盛顿时报:商店如何运用用户的无线WiFi来跟踪用户购物习惯
[6] A study of mac address randomization in mobile devices and when it fails. arXiv preprint arXiv:1703.02874, 2017。
[7] Tracking Unmodified Smartphones Using Wi-fi Monitors. In Proceedings of the 10th ACM Conference on Embedded Network Sensor Systems, SenSys ’12, pages 281–294, New York, NY, USA, 2012. ACM。