iOS检测模拟位置

Rod*_*igo 7 security gps core-location ios

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

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

Mag*_*lós 8

自 iOS15 到来以来,苹果引入了两个新属性CLLocation

    /*
     * isSimulatedBySoftware
     *
     * Discussion:
     *  Set to YES if this location was detected as being generated by a software simulator, such as Xcode
     */
    open var isSimulatedBySoftware: Bool { get }

    
    /*
     * isProducedByAccessory
     *
     * Discussion:
     *  Set to YES if this location was generated from an external accessory, such as CarPlay or an MFi accessory
     */
    open var isProducedByAccessory: Bool { get }
Run Code Online (Sandbox Code Playgroud)

这两个属性位于:

/*
 *  sourceInformation
 *
 *  Discussion:
 *    Contains information about the source of this location.
 */
@available(iOS 15.0, *)
open var sourceInformation: CLLocationSourceInformation? { get }
Run Code Online (Sandbox Code Playgroud)

我已经使用第三方应用程序和 xcode 等虚拟位置生成器对此进行了测试,并且isSimulatedBySoftware在每种情况下都是如此。我将订购一个外部 GPS 设备,以确保另一个设备也能正常工作(希望是 :D),然后更新我的答案。


Moh*_*ama 7

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

一个模拟的位置,因为我注意到,总是返回这些位置属性/选项的值的组合:

horizontalAccuracy: 5
verticalAccuracy: -1
altitude: 0.000000
speed: -1
Run Code Online (Sandbox Code Playgroud)

真正的位置会在99%的时间内给出不同的组合,例如

horizontalAccuracy: 5
verticalAccuracy: 10
altitude: +/- 0.4243232
speed: -1
Run Code Online (Sandbox Code Playgroud)

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


Ken*_*yHo 6

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

实际上有两个独立的问题:(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 ???: ?????????
Run Code Online (Sandbox Code Playgroud)

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

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 ???: ?????????
Run Code Online (Sandbox Code Playgroud)

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

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

顺便说一下,我还试图在方案中禁止在xCode上模拟位置: 在此输入图像描述 不幸的是,它仍然允许模拟位置.

您可能会在此处了解更多问题.希望它有所帮助.