位置欺骗的反制方法

上半年做的 Android 应用涉及到设备位置获取,所以很自然需要考虑对付位置欺骗攻击(以下简称攻击 因为看上去很酷)的办法。目前整个软件的基本框架已经大体完成了,如果确定有后续开发的话我希望将位置欺骗反制Anti Location Spoofing, ALS 据说用英文缩写看上去更酷)作为开发重点之一,也为此想了一些大致的方法。当然目前只是纯粹的「想法」而已,而且都是基于我已经知道的东西,并没有去查具体的资料和实现方法,我也不确定这些想法是否有足够的可实施性。

以下将列举一系列(大致)由简单到复杂的攻击手段并讨论相应的 ALS 方法,随便写一写,可能废话比较多而且会突然变得很啰嗦什么的毕竟思维很随意

简单轻松的预热思考

开发者选项 → 允许模拟位置

对于 Android 来说,最基础的攻击手段应该是打开系统开发者选项里的「允许模拟位置」,再使用获得了位置模拟权限的应用来修改定位信息。

针对这种基础攻击手段的 ALS 方法也很基础,Android 应该有提供检测这个选项是否已经打开的接口,调用一下就晓得了,方便得很。

Root

在我看来,Android 用户只要把手机 Root 掉就可以为所欲为了,任何接口和数据都可以轻易地篡改,比如稍微高阶一些的攻击者会把手机 Root 掉再装上专门的 Xpose 插件直接修改定位信息。

因为 Root 能把所有攻击的门路都打开,所以最直接的 ALS 方法是禁止在已 Root 的设备上运行。当然首先这种方法并不是很友好,因为我相信不是所有的 Root 都是恶意的,比如对付某些国产巨头流氓软件的方法之一就是通过伪造接口来让它们无法获取隐私数据;其次这种方法也不一定凑效,因为上面说了,把手机 Root 掉就可以为所欲为,所以我相信攻击者有办法骗过应用对 Root 状态的检测。

还算稳定的脑内互搏

基于关于 Root 的讨论。我有了一个大胆的假设:攻击者可以为所欲为地修改接口和数据,而我们无法有效地检测出这种修改行为,在这一假设的基础上,我们进行下一步的讨论和脑补。这听上去或许很令人绝望,但值得庆幸的是这种为所欲为是有成本的,谎言存在漏洞,想要为所欲为就要以一定的成本来修正或遮蔽漏洞,所以我们的目标就是将修正或遮蔽漏洞的成本提高到一定程度,让攻击者觉得与其大费周章地修改位置还不如出去跑一圈来得方便。

当然,就算世界毁灭也不肯出门的究极家里蹲、无敌技术帝和脑洞惊奇的基掰人不在我们的考虑范围内。

轨迹处理

很多情况下应用会持续监听和记录用户位置,以「轨迹」的方式处理和使用这些数据;就算是「打卡签到」式地记录离散点,这些点之间也不是完全独立的,相互之间一定存在某些关系。然后这个学期有一门叫「空间位置服务原理及应用」的专业选修课,轨迹处理貌似是重点之一,而且我恰好听了那几节课并且课程论文也涉及到了一点点,所以利用轨迹数据进行 ALS 是本次讨论的重点,我大致想到了四点。

首先,点与点之间最明显的有距离和时间上的关系,然后两个数一除就是速度。对于某些应用的使用场景,存在一个「合理的速度区间」或者「要求的速度区间」,比如(几乎)没有哪个正常人能以超过第一宇宙速度的速度移动,长跑应用的用户不可能全程以百米冲刺的速度跑,自驾出行应用的用户不可能高速驶过堵成停车场的高速公路路段,Ingress 中行走距离的累积(据说)要求时速不超过5公里等等。
基于上述「速度区间」的「速度检测 ALS」是一种低成本、简单又比较有效的 ALS 方法,原因归结如下:

  • 一些攻击手段是拿一个坐标列表按一定时间间隔更新位置,攻击者并不能直接控制移动速度。
  • 有时候攻击者迫于时间或者效率限制也不得不「超速」。
  • 使用经过预处理的轨迹数据进行 ALS 可以避免由于自然误差产生的局部「超速」而导致的误判。
  • 很多时候应用提供本身的服务就需要计算速度,「顺便」拿来 ALS 也没问题。

当然,控制速度通过控制坐标列表的间隔距离可以做到(阿当然稍微专业一点点的作弊软件应该都做得到),有计划的老司机攻击者也能稳住速度,另外像那个「拥堵路段」的「合理速度区间」是浮动的,要准确地获取这个区间并进行有效的 ALS 会提高成本。

不仅仅是速度,轨迹在很多方面都可以做合理性判断,比如会有一些「无法通过的地点」和「无法到达的地点」的「逻辑限制」,可以用来 ALS,即「路径逻辑 ALS」。比如行人无法横穿某些大马路、某些建筑之间有地图上没有标记的墙、施工场所、限时开放的场所(例如公园)。这一 ALS 有效与否取决于攻击者是否知道这些逻辑限制的存在。

在数据处理工作中,人们最想抹掉的东西是各种没啥规律的噪声/误差,但我觉得这些误差是「数据真实性」的一种重要体现,也是判断数据真实性、进行 ALS 的重要依据。老师和论文们都说,轨迹数据的一大特点是精度较低,而众所周知 GNSS 定位的最大弱点是海拔精度,所以可以把海拔误差作为 ALS 的检测对象,即「海拔误差 ALS」。用来攻击的数据通常来源于已有的测绘数据,由于数字高程模型的精度和内插算法的限制,伪造的数据在小范围内的高程可能是一致的,或者存在较大的「突变」,如果检测到这种「不自然」的一致或突变,则有伪造的嫌疑。
当然(又是「当然」),这种方法也存在局限性,比如聪明的攻击者可以在海拔数据中加入一定的人工误差,甚至如果使用例如二项式内插之类的内插算法得到的不同点的海拔也是不同的。

最后是「轨迹重复 ALS」。对于一些有重复性的使用场景,比如管道巡线,攻击者为了节约成本可能会重复使用一套或者几套路径。在多次使用中如果未经预处理的轨迹数据出现局部甚至整体重复则有很大的伪造嫌疑,预处理后轨迹数据出现重复则应当视具体的使用场景来判断,比如正常的管道巡线轨迹由于工作本身就千篇一律而在预处理后可能呈现高度的一致,这时就不能贸然认为是攻击。
这种方法的实质其实和海拔误差 ALS 一样都是检测数据的自然误差,因此混入一定的人工误差同样能躲避这种 ALS……嗯……说不定有什么检测算法能判断真实误差和人工误差?我不知道……就当是算法上的较量吧(

加速度传感器

上面讲了很多都是对位置信息本身进行分析来 ALS,那么除了位置信息,用户在移动时还会改变什么?

变最多的当然是同样用来检测「移动」的加速度传感器啦。现在有一种不靠 GNSS 的定位方法就是用加速度计来惯性定位,虽然不知道(也很想知道)能不能光靠它「描绘」出一条精确的空间移动轨迹,但至少判断步行、奔跑等移动的动作是不在话下的,而大多数应用的使用场景是用户随身携带手机。因此可以通过收集加速度计的数据来判断用户是不是真的在「动」,从而结合使用场景来 ALS——例如长跑应用的用户在使用时手机绝对是一直在晃的。

当然,这种方法还是有局限性,除了使用场景的限制(比如乘车?)之外,攻击者也可以通过制造震动(抖抖抖抖抖腿)或者伪造加速度计的数据来规避。

当然(天杀的当然),针对使用场景,稍微发散一下可以发现还能用磁场传感器,如果运动轨迹有转向但手机始终(大致)朝向同一个方位,则可以判断为有欺骗的嫌疑。当然(你TM…)这种方式依然不敌会转手机的攻击者。

其实我觉得运动检测应该已经有一套比较成熟高级的方法,可以比较准确地分辨用户是不是真的在运动,比如 Apple Watch 就能依靠手腕活动就能判断坐立状态阿什么的,如果能引入一套比较「高级」的方法不知道能不能提高这种 ALS 的准确性?。

纯粹随意的脑补瞎扯

以上的一些方法都属于比较现实的不然也编不出那么多话,我相信它们都已经有被运用在实际的应用中。然后接下来的就是我结合一些七七八八的东西瞎想的方法。

GNSS 数据

GNSS 定位是手机定位的主要手段,GNSS 接收器通过接收卫星信号来计算位置,随着时间和位置的不同,GNSS 数据也是不同的,稍微不那么专业的数据有卫星信号强度、卫星数量和分布,稍微专业一点的数据有各个卫星的导航电文。Android 的应用应该是可以获取信号强度、卫星数量和分布数据甚至原始导航电文内容的?对于攻击者来说信号强度和卫星数量也许比较好伪造,毕竟这两者和设备本身性能有关,只要「不在理论上出错」,比如「一直都只有1颗卫星居然还能定位」、「同时搜到全部24颗卫星」,就能蒙混过关。而「卫星分布」和「导航电文」是两个客观数据,攻击者无法直接随便伪造而只能通过获取星历等数据来伪造,虽然不是不可行,但攻击成本和上述几种方法相比显然不是同一个层次的。

网络环境

结合手机的特性,用户在移动时发生改变的还有网络环境。和 GNSS 数据类似,可供 ALS 的网络环境参数包括蜂窝网络的信号强度、基站数量、基站识别码(唔……大概是这个意思),附近无线局域网的 SSID、MAC 和信号强度,附近蓝牙设备的名称、MAC、信号强度等等,有很多。其中蜂窝网络基站识别码、局域网 SSID、MAC 之类的也很难伪造,最重要的是现在绝大多数应用都要求用户保持在线,因此想要(合理地)伪造数据的成本极高,结合历史数据的对比(可以检测是否重复使用某次使用时收集的数据进行伪造、是否与其他用户在同一地点的数据相互冲突等)可以有力地反制大部分攻击。

总结

「除了位置信息,用户在移动时还会改变什么」这个我觉得还是蛮重要的,用户的移动带来的不仅仅是坐标位置的变化,还有一大堆「环境参数」的变化,可谓是牵一发而动全身。其实我觉得不仅仅 ALS,任何针对欺骗攻击的反制措施,其核心都是想办法充分地收集信息和数据来检测人为的矛盾或者错误吧。

靠北,现在又感觉用英文缩写很蠢(

你TM天杀的「当然」

0%