简洁问题:是否有可能以某种方式将分区加密绑定到硬件,这样就不可能(非常困难)将系统复制到另一台电脑并在那里运行?
完整故事:我们开发了一台小型嵌入式 PC,设备内运行 Linux。当设备打开时,嵌入式 PC 就会运行,向用户显示数据,直到断电为止。
这台 PC 上的软件是我们的商业竞争优势,因此我们希望尽可能阻止对其进行访问(请参阅 PS)。
因此,我们的想法是对系统闪存或至少其中的一部分进行加密。但这样就可以复制整个闪存。然后,下一个想法是将加密绑定到硬件。但如何呢?
PS 我知道一切都是逆向工程的主题,但这并不是让你的产品逆向工程变得平淡无奇的理由。
PPS 我对抄袭并不偏执。不幸的是,我们知道竞争对手会试图以名义窃取技术=)
答案1
答案2
使用内置闪存的微处理器,无法从外部读取。许多现代 ARM 芯片都具备这种能力。在该闪存中,您可以放置访问任何外部存储所需的代码和加密密钥。
答案3
在这种情况下,您不能真正依赖加密秘密,因为您的嵌入式 PC 需要知道这些秘密才能运行,因此攻击者也可能知道它们。
一种解决方案是找到或创建一个从外部无法读取的秘密(与 @psusi 建议的方式类似)。如果不知道您到底拥有什么样的硬件,就很难提出建议。也许处理器序列号是一个不错的选择,尽管我想知道您是否也可以通过 JTAG 读取它。
解决这个问题的另一种方法是混淆。您应该开发一个在程序的随机部分多次使用该秘密的代码,而不是从解密过程开始的代码(并明确秘密的来源)。例如,您可以使用处理器序列号的第 n 位乘以 1000,而不是在某处硬编码缓冲区大小。这将使代码在不同的硬件配置上崩溃,并且在对手发现之前需要进行大量调试知道使用哪个秘密以及如何使用。
如果您需要更详细的答案,您还需要提供详细信息。威胁模型是什么(非法复制到类似硬件、反汇编您的专有算法,或者其他)?你的硬件是什么?相关限制是什么(你说不能切断JTAG引脚,为什么?)
答案4
我的服务器根据 CPU 类型、可用内存、网络 MAC 地址等硬件数据生成加密密钥,这使得机器能够在无人监督的情况下自行重新启动,如果您取出磁盘并将其放入另一台服务器,它可以不解密自身。
但在嵌入式系统中,或者在任何您有 root 访问权限的地方,这都是一个没有实际意义的问题,因为您始终可以使用 来查询密钥dmsetup table --showkeys
。
所以在我看来,最好的选择是将加密放入硬件中。
第二个最佳选择是,以某种方式修补内核,这样上述dmsetup
命令将无法查询使用的加密密钥,并且可能将密钥生成烘焙到内核本身中,因此也无法从 Initramfs 中获取它。
它仍然可以从内存转储中获取,但这仍然是您能做的最好的事情......
当然,如果正在运行的系统看到所有数据都未加密并且有人获得访问权限并且可以复制该未加密的视图,那么这一切都是没有意义的。