硬件加密狗能够保护您的软件吗?

逆向工程 硬件 安全 加密狗
2021-06-29 03:06:48

各种软件公司分发具有硬件安全性的软件,通常是必须安装加密狗才能运行软件。

我没有使用它们的经验,但我想知道,它们真的有效吗?

加密狗实际上是做什么的?我认为使用这种方法来加强安全性并防止硬件仿真的唯一方法,硬件必须执行软件的一些重要功能,也许实现一些算法等。

3个回答

显然,彼得已经解决了正确实施的要点。鉴于我过去曾“破解”过两种不同的加密狗系统,但并未发布结果,因此我也想分享一下我的见解。user276 已经部分提示了问题所在。

许多软件供应商认为他们在许可加密狗系统时为其许可模型购买了某种安全性。他们不可能离真相更远。他们所做的就是获取允许他们实施相对安全系统的工具(在 Peters 回答中指出的范围内)。

一般而言,复制保护有什么问题?如果软件对其许可方案使用数学上合理的加密,则这对复制保护的安全性没有影响。为什么?好吧,您最终会遇到 catch 22 的情况。您不信任用户(因为用户可以复制软件),因此您加密内容或在复制保护方案中以某种方式使用加密。唉,您需要在产品中拥有您的私钥才能使用加密,这与不信任用户的概念完全矛盾。加密狗尝试将私钥(和/或算法和/或其他成分)放入硬件中,以便用户首先无法访问。

然而,由于许多供应商的印象是他们购买了开箱即用的安全性,因此他们没有努力正确实施。这让我想到了第一个例子。这是我母亲使用的 CAD 程序。由于知道连接到 LPT 的加密狗比他们最近的 USB 同行更容易失败,我开始“解决”这个问题。那是 2005 年左右。

我没有花太长时间。事实上,我使用了一个简单的 DLL 放置攻击(该名称后来被称为该场景)来注入我的代码。那个代码并不太复杂。只有一个特定的函数返回加密狗通常读出的值(序列号),就是这样。其余的函数我将传递给加密狗供应商需要与驱动程序一起安装的原始 DLL。

另一个加密狗在此之前一点。这里的问题是我正在为一个分包商工作,我们只能访问我们应该开发的软件。这确实是软件许可公司和软件供应商之间的官僚主义问题,但它给我们带来了很大的麻烦。在这种情况下,在加密狗周围工作更具挑战性。首先,必须编写驱动程序来嗅探来自设备的 IRP。然后必须找出用于加密的算法。幸运的是,并非所有事情都是在硬件中完成的,这为我们提供了漏洞。最后,我们有了一个可以伪装成加密狗的小驱动程序。它的功能扩展到读取真正的加密狗,

结论:加密狗,不管是哪一种,如果实现了所属程序的核心功能,就很难破解。对于其他一切,它主要取决于开始围绕加密狗工作的人的决心和投入时间的意愿。因此,我会说加密狗会造成相当大的障碍——如果实施得当的话——但如果软件供应商疏忽了寻求保护他的创作的一部分,那也只是万金油。

请注意彼得斯回答的最后一段。但我想补充一点。真正值得努力保护的软件,因为它在某种意义上是独一无二的,不应该在客户骚扰的基础上受到保护(== 大多数复制保护方案)。而是考虑 IDA Pro 的例子,它当然可以被认为是非常独特的软件。他们为软件添加水印,以便能够追踪泄露特定捆绑包的人。当然,正如我们在 ESET 泄漏事件中看到的那样,这并不总是有帮助,但它会产生威慑力例如,破解组获得副本的可能性较小。

问题描述

让我们做几个假设。软件分为功能组件。许可证适用于该软件包中的功能组件。许可可以基于时间、版本或使用次数,即您可以在设定的时间点之前使用该功能,您可以使用您购买的版本的功能或它的一些次要衍生版本,或者您可以使用它次数。您必须解决两种主要情况,攻击者无权访问许可证和他有。

没有执照的攻击者

第一种情况是您的攻击者无法访问您产品的有效许可证。这个问题很容易解决。只需为软件的每个功能许可部分分配一个单独的加密密钥。使用为该部分设计的加密密钥加密每个功能部分。现在您可以分发您的软件,而不必担心有人能够解密他们未获得许可的功能,因为您从未将密钥发送给他们。

有权访问许可证的攻击者

第二种情况更难解决,即当您的攻击者拥有您的软件的有效许可,但他想要重新分发他已许可的功能或明智地延长他的许可时间时。

现在您需要一个可靠的时间源,这可以通过以下方式解决:

  • 将公钥嵌入加密狗并让加密狗发出随机挑战,必须将其转发到时间服务器。时间服务器通过对当前时间和质询进行签名并将其返回给客户端,然后客户端将其发送给密钥,然后密钥更新其内部时钟并解锁。
  • 根据插入计算机的时间更新内部时钟。USB 端口在插入时始终为您的加密狗供电。
  • 根据安装在其连接的机器上的驱动程序发送的时间戳更新内部时钟。只允许时间戳及时向前。如果时间源是提供签名时间戳的远程可信时间服务器,则仅允许向后移动。

如果您的许可证基于版本,那么您实际上会遇到无法访问许可证的攻击者,因为功能单元的密钥派生函数将功能单元的标识符及其版本作为输入。

密钥分发

因此,一旦您为每个功能单元拥有单独的密钥,您的许可证基本上就变成了分发对称密钥的问题,以便将它们发送到加密狗。这通常是通过在加密狗中嵌入一个对称的秘密密钥,用共享的秘密密钥加密许可证解密密钥,然后对加密的密钥更新文件进行签名来完成的。然后将签名的更新文件传递给加密狗,加密狗验证更新上的签名,使用共享对称密钥解密新密钥并存储它们以备后用。

密钥存储

所有加密狗都必须能够访问安全存储,以便存储许可证解密密钥、到期时间戳等。通常,这不会在外部闪存或 EEPROM 上实现。如果是,则必须使用 ASIC 或 FPGA 内部的密钥对其进行加密并签名以使其无法更改。

纯文本孔

一旦用户获得了您的功能组件的许可,即使他无法提取您的密钥,他也可以使用您的加密狗解密该功能组件。这导致了他可能会提取您所有的纯文本并将解密调用替换为对提取的纯文本的直接调用的问题。一些加密狗通过将处理器嵌入加密狗来解决这个问题。然后将功能组件加密发送到加密狗,加密狗解密该组件并在内部执行它。这意味着加密狗本质上变成了一个黑匣子,需要单独探测发送到加密狗的功能组件以发现它们的属性。

神谕

许多加密狗都是加密和解密预言机,这会导致选择密文攻击的潜在问题,例如最近的填充预言机攻击

侧信道攻击

除了 oracle 问题之外,您还对所有迄今为止众所周知的旁道攻击有很多担忧您还需要关注任何潜在但未被发现的侧信道。

解封装

请注意,世界上有许多公司专门从事挑选和审核安全芯片。一些最著名的公司可能是flylogic 的Chris Tarnovsky,现在是 IOActive 和chipworks 的一部分这种攻击代价高昂,但可能是真正的威胁,具体取决于目标的价值。如果今天只有少数(可能没有)加密狗能够抵御这种高预算的攻击,我会感到惊讶。

做他们的工作

给定一个基于强加密的加密狗,不是基于时间的,因为您不能基于时间使加密密钥过期,时间也不是绝对的,没有任何旁道攻击并执行芯片上的代码,是的,它会发现相当于探测黑盒的底层代码。这些加密狗发生的大多数故障是基于硬件许可系统的被许可人的实施弱点,因为实施者通常不熟悉逆向工程和计算机安全。

此外,请务必意识到,即使是在面向 Internet 的服务器上实现大部分逻辑的软件,也只是通过探测黑盒并根据客户端代码期望推断服务器端代码而被破坏。始终为您的应用程序被破坏做好准备,并制定一个计划,当它发生时如何处理它。

正如 Peter 所指出的,查看加密狗如何用于安全是识别攻击向量的起点。在大多数情况下,实现加密狗安全性的软件开发人员是最薄弱的环节。

过去,当我使用加密狗测试软件时,我使用了 ProcessMonitor 和 RegShot 等免费工具来识别简单的漏洞,以击败加密狗安全的不良实现。

我见过一些软件在启动时检查加密狗的存在,然后在不使用加密狗的情况下继续其操作,直到它重新启动。在这些情况下,只要加密狗没有插入系统,用 OllyDbg 修补应用程序并不难告诉应用程序以完整功能运行。

我还见过允许用户单击软件中的按钮的软件,这样用户就不必插入加密狗。该软件声称这是一个额外的功能,如“记住我”选项。RegShot 和 ProcessMonitor 向我展示了一个文件中写入了一些信息,只要该文件存在于预期的文件夹中,我就可以在多个系统上运行该软件而无需加密狗。

仅仅因为有人使用 AES 或硬件加密狗或任何 XYZ 并不意味着它们是安全的。重要的是他们是否以正确的方式实施这些安全措施,假设安全措施中现在存在已知(或 0 天漏洞)。