【问题标题】:How to detect system clock tampering in Java如何在 Java 中检测系统时钟篡改
【发布时间】:2016-09-17 18:55:35
【问题描述】:

我需要在离线情况下检测 PC 的时钟是否漂移或在独立 Java 应用程序中被操纵。我怎样才能检测到这一点?

该应用程序将在拥挤的房间中由用户掌握至少 3 个小时,我不希望他们成为熟练的攻击者并且能够设置黑客环境。 大多数情况下,我希望检测到至少几秒的跳跃。

我需要找到一种技术来跟踪独立工作站上 Java 应用程序中的时间,该技术允许检测系统时钟中的显着“跳跃”,但同时不会导致“误报” " 在休闲慢节奏上。

解决方案不必抵抗对源代码或系统时钟的熟练操作。该应用程序将安装在数千个工作站中,但安装时间(小时)非常有限,并且是在公共场合。它只是一个基于计算机的测试软件。

过去,我们尝试使用 System.nanoTime() 设置内部时间测量,并通过重复的周期性 System.nanoTime() 调用计算经过的时间。 这样我们就可以完全忽略任何时钟修改或问题。 但这是失败的,因为在某些机器(多核)上,API 的后续请求会从随机核返回值,从而无法进行测量。

所以,现在我们尝试检测时间的突然变化,因为一些工作站的时钟有故障会自行重置(是的,确实会发生),其他一些在测试期间会更新域时钟(工作站不应该联网,但有人不听我们的指示),可能有些候选人会尝试更改系统时间。

【问题讨论】:

    标签: java clock


    【解决方案1】:

    您无法在应用程序、Java 或其他应用程序中可靠地做到这一点1

    例如,如果您的应用程序使用外部 NTP 时间源,那么坏人可以阻止对 NTP 服务器的访问,或者偷偷地将您重定向到假 NTP 服务器。

    编辑:处于离线状态。

    这让事情变得更加困难。您无法将系统时钟的明显减慢或加快与许多现代机器上自动发生的 CPU 时钟速率缩放的影响区分开来。


    1 - 我不是在谈论 完全蹩脚的 尝试......比如在您的应用程序运行时将时钟向后扭曲。这很容易检测。坏人很容易比这更狡猾。总是假设坏人至少和你一样聪明。此外,假设他们可以反编译您的代码并弄清楚您是如何尝试检测时钟欺骗并试图击败它的。或者只是禁用检查。

    【讨论】:

    • 嗯,不,如果我继续跟踪时间的流动并检测到向后跳跃,我肯定可以。可以避免向前移动测量刻度,但它很容易出错,所以库问题....
    • 是的,我一直在寻找一种定时器实现或算法,它可以可靠地计算睡眠和另一个之间的毫秒数,具有一定的容差,或类似的东西。能够在达到阈值时引发异常。
    • @Maxvader 但在某些系统中,出于正当原因,时钟确实会向后跳。您可以检测到向后跳跃,是的,但这与检测非法向后跳跃不同。
    • 好吧,看看你最新的编辑,你说得对,但我的情况并不难,应用程序不必抵抗如此熟练的对手。如果他们足够聪明地反编译它,他们就应该成功。大多数情况下,我需要跟踪有故障的硬件和笨拙的黑客。它在用户手中的时间只有几个小时。
    • @R.MartinhoFernandes 这正是我的问题,我显然可以每隔几毫秒写一个简单的时间戳比较,但它会失败,需要一些容忍度......
    【解决方案2】:

    没有 100% 的解决方案。但是您可以使操作时钟变得更加困难。

    您可以检查一些在计算机启动时创建的选定系统文件。他们不应该在未来。这至少需要在操作时钟时重新启动计算机。

    【讨论】:

      【解决方案3】:

      您可以使用Apache Commons Net's NTP client 继续根据受信任的 NTP 服务器检查 PC 的时钟。

      更新 1

      工作站离线。

      这在 Java 中是无法解决的。您可以使用 GPS 或无线电时钟硬件来实时检查 PC 时钟。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-14
        • 2013-04-05
        • 1970-01-01
        • 1970-01-01
        • 2014-10-09
        • 1970-01-01
        • 2011-02-07
        相关资源
        最近更新 更多