iOS检测模拟位置

时间:2015-03-24 12:15:37

标签: ios security gps core-location

目前我正在开发一款应用程序,其中地理位置功能是其最重要的功能。实际上我们非常担心会嘲笑GPS值。我已经阅读了很多关于在iOS和Android上模拟位置的评论,其中大多数都倾向于解释一个未加工的iOS设备无法模拟位置,但事实是我已经创建了另一个项目,用GPX文件来模拟在该项目上的位置,当执行时,整个系统认为我在另一个城市。所有我的locationManager回调都告诉我,我正在使用正确的时间戳进行模拟的位置,伪造整个信息,就像它是真实的一样。这完全打破了我们的应用程序的目的,因为用户可以假装在哪里。

有没有办法检测到这种行为并阻止它?我假设一个封闭的目标,攻击者必须是开发人员才能使这个漏洞利用起来,但是唉,它还在那里

5 个答案:

答案 0 :(得分:6)

详细说明@KennyHo答案,我发现真实位置和模拟位置反馈之间存在另一个差异。

模拟位置,正如我所注意到的,它总是返回这些位置属性/选项的值组合:

horizontalAccuracy: 5
verticalAccuracy: -1
altitude: 0.000000
speed: -1

虽然真实位置会在99%的时间内提供不同的合并,例如

horizontalAccuracy: 5
verticalAccuracy: 10
altitude: +/- 0.4243232
speed: -1

请注意,模拟位置可能具有与上述位置不同的组合,但仅限于用户使用xcode Automation target test。但是,用户只能使用开发标识模拟已签名应用程序的位置(必须拥有该应用程序)。这意味着除了您之外,没有人可以使用不同的altitudeverticalAccuracy伪造一个位置,以便在xcode中欺骗您的应用。

答案 1 :(得分:5)

问题:有没有办法检测到这种行为并阻止它?

实际上有两个不同的问题:(1)如何检测,以及(2)如何预防?

答案(1):模拟的位置行为与回调locationManager的真实位置行为完全不同:didUpdateLocations:

[模拟位置]回调几乎在调用 startUpdatingLocation 后立即返回,然后每隔一秒重复调用一次。如果我们选择固定位置,位置也是一样的。这是一个例子:

location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:48 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:49 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:50 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:51 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:52 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:53 Час: Індокитай
location: <+51.50998000,-0.13370000> +/- 5.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:12:54 Час: Індокитай

[真实位置]需要几秒钟(如果是第一次运行)回叫然后随机重新呼叫。此外,即使您根本不移动,您也可以看到这些位置之间的重大变化。这是一个例子:

location: <+10.77219361,+106.70597441> +/- 67.39m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:26 Час: Індокитай
location: <+10.77213011,+106.70591088> +/- 65.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:31 Час: Індокитай
location: <+10.77219507,+106.70587790> +/- 65.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:38 Час: Індокитай
location: <+10.77214753,+106.70587741> +/- 65.00m (speed -1.00 mps / course -1.00) @ 30.03.15 14:16:49 Час: Індокитай

回答(2):为了防止,我现在只是工作,我们需要查找至少3个位置来确定它是模拟的还是真实的位置。

提醒一下,这只是检测模拟位置的临时解决方案。将来,Apple可能会改变这种行为。

顺便说一句,我还试图在方案中禁止在xCode上模拟位置:  enter image description here 不幸的是,它仍然允许模拟位置。

您可能知道的其他一些问题here。 希望它有所帮助。

答案 2 :(得分:1)

我不相信可以检测位置模拟器。

伪造位置的一种更简单的方法是使用外部蓝牙或串行连接到输出GPS simulatorNMEA sentences。虽然您确实需要Android手机来运行模拟器,但您不需要开发者帐户。

iPhone将自动检测外部GPS,CLLocationManager将使用外部GPS信号源代替自己的内部GPS。它对地图和导航应用的实验室测试非常方便。

答案 3 :(得分:1)

还可以通过GitHub的软件定义的无线电和gps-sdr-sim来欺骗iPhone。 您可以使用gps-sdr-sim生成包含GPS信号的I / Q文件,并使用SDR通过空中传输这些样本。 这种欺骗很难发现。

答案 4 :(得分:0)

感谢您提供有关GPS模拟器的信息。 我试图在iPhone5(iOS8)上制作一个简单的iOS应用程序,以便从三星S4上的GPS模拟器应用程序获取位置。我关闭了Wifi和3G,在iPhone上启用了BlueTooth。但是CLLocationManager无法获得位置。

以下是代码:

clManager = [[CLLocationManager alloc] init];

clManager.delegate = self;

clManager.desiredAccuracy = 100;

clManager.distanceFilter = kCLDistanceFilterNone;

[clManager startUpdatingLocation];

代码得到kCLAuthorizationStatusAuthorizedAlways通知。但在此之后,没有返回的位置数据通过&#34; didUpdateLocations&#34;回调代表。

请您告诉我CLLocationManager的任何特殊设置,以便它可以从GPS模拟器接收GPS消息。