Rod*_*igo 7 security gps core-location ios
目前我正在开发一个应用程序,其中地理位置功能是其最重要的功能.实际上我们非常担心会嘲笑GPS值.我已经阅读了很多关于在iOS和Android上模拟位置的评论,其中大多数都倾向于解释一个未加工的iOS设备无法模拟位置,但事实是我已经创建了另一个项目,用GPX文件来模拟在该项目上的位置,当执行时,整个系统认为我在另一个城市.所有我的locationManager回调都告诉我,我正在使用正确的时间戳进行模拟的位置,伪造整个信息,就像它是真实的一样.这完全打破了我们的应用程序的目的,因为用户可以假装在哪里.
有没有办法检测这种行为并阻止它?我假设一个封闭的目标,攻击者必须是开发人员才能使这个漏洞利用起来,但是唉,它仍然存在
自 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),然后更新我的答案。
为了详细说明@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中欺骗你的应用.
实际上有两个独立的问题:(1)如何检测,以及(2)如何预防?
[模拟位置]回调几乎在调用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)
提醒一下,这只是检测模拟位置的临时解决方案.将来,Apple可能会改变这种行为.
顺便说一下,我还试图在方案中禁止在xCode上模拟位置:
不幸的是,它仍然允许模拟位置.
您可能会在此处了解更多问题.希望它有所帮助.