【问题标题】:iOS detect mock locationsiOS 检测模拟位置
【发布时间】:2015-05-27 18:03:06
【问题描述】:

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

有什么方法可以检测并防止这种行为?我假设一个封闭的目标,攻击者必须是开发人员才能让这个漏洞利用工作,但是唉,它仍然存在

【问题讨论】:

  • 他们不需要开发者帐户和您的代码吗?
  • 嗯……是的,不是的。您需要一个开发者帐户,但不需要您的应用程序的代码。您可以简单地创建一个模拟位置的应用程序(通过 GPX 甚至使用 XCode 的固定位置),然后您的所有设备都被欺骗相信您在该位置(即今天早上拍摄了一张模拟旧金山位置的照片,上传到Facebook,图片元数据和 Facebook 都认为我在旧金山,更不用说我的应用了 :()
  • 我的观点是我的应用程序中的位置可以在没有代码的情况下被欺骗。这就是我关心的原因……正如我之前所说。当您模拟另一个应用程序的位置时,所有应用程序都被欺骗相信您在该位置
  • 您不需要开发帐户或代码。您可以使用可以轻松伪造位置的外部 BT 或有线 GPS 来欺骗位置。

标签: ios security gps core-location


【解决方案1】:

为了详细说明@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 中的应用。

【讨论】:

  • 我必须对这些参数进行更多测试,这看起来不错,但在内部位置,我可以设法在实际测量中重现其中一些参数。
  • 从 Xcode 9.3 开始,上面的模拟位置值仍然正确。
【解决方案2】:

问题:有什么方法可以检测并防止这种行为?

实际上有两个不同的问题:(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 上的模拟位置: 不幸的是,它仍然允许模拟位置。

您可能知道的更多问题here。 希望对您有所帮助。

【讨论】:

  • 请注意,只有通过用户添加的gpx文件进行模拟时,模拟位置才会每秒接收一次。如果使用的是默认的 xcode 位置(伦敦、约翰内斯堡等),则只会收到一次。
  • 关于答案(2),如果攻击者模拟了3个假位置怎么办? (1) 虚假位置 (2) 真实位置 (3) 与第一个不同的虚假位置
  • 如果攻击者模拟了 3 个假位置怎么办? ==> 不,他们不能或很难做到这一点,因为所有 3 个位置都针对 1 个地理定位请求连续返回。即使他们这样做了,他们也必须单独重新运行应用程序 3 次,这不是我提到的情况。
  • "请注意,只有通过用户添加的 gpx 文件进行模拟时,模拟位置才会每秒接收一次" ==> 同意!因此,我们需要另一种模式来检测模拟位置。你有什么建议吗?
【解决方案3】:

自从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 }

这两个属性位于:

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

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

【讨论】:

    【解决方案4】:

    我认为无法检测位置模拟器。

    伪造位置的更简单方法是使用外部蓝牙或串行连接到输出NMEA sentencesGPS simulator。尽管您确实需要 Android 手机来运行模拟器,但您不需要开发者帐户。

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

    【讨论】:

      【解决方案5】:

      还可以使用来自 GitHub 的软件定义无线电和 gps-sdr-sim 来欺骗 iPhone。 您使用 gps-sdr-sim 生成包含 GPS 信号的 I/Q 文件,并使用 SDR 以无线方式传输这些样本。 这种类型的欺骗更难检测。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 2016-12-25
        • 2016-06-02
        • 1970-01-01
        相关资源
        最近更新 更多