我正在尝试复制保护一些作品,这是一个可启动的 SD 卡,用于在 ARM 设备(Raspberry Pi)上启动 Linux 内核。我正在使用这种方法:
- 该方法使用 initrd 来挂载加密的根文件系统。
- initrd 根据 SD 卡的 CID 生成文件系统的密码。(使用哈希函数,尚未决定使用 md5 还是 sha1)。Initrd 将尝试使用生成的密码挂载文件系统。
- 现在,最有趣/最可疑的部分来了:initrd 本身使用自定义 C 函数加密,基本上每个字节都使用自定义伪随机生成器进行异或运算。内核经过修改,具有相同的加密函数,可用作解密器。
- 系统本身被精简,因此无法使用键盘或外部存储。单个应用程序全屏运行。
因此,在引导加载程序加载内核和 initrd 后,内核会解密 initrd 并执行其 init 脚本,该脚本将生成密码并挂载根文件系统。
我的问题是:破解这个设置(解密根文件系统并使其从任何 SD 卡启动)有多容易?最薄弱的部分是什么?反编译内核并找到那些自定义加密函数有多容易?
编辑:这里有一些更正,这样你就不会在显而易见的事情上浪费时间:
- 根设备将使用 LUKS(aes256)加密,并且密钥将由一些 HMAC 函数使用 SD 卡的 CID 和一些盐生成。
- initramfs 加密的伪随机算法实际上是 RC4,只是使用一些自定义函数生成密钥,因为如果我将密钥存储在一个字节数组中,那么检索它就会变得非常简单(是的,这是通过模糊性实现的安全性,但似乎没有其他办法)。
- 我知道如果使用 SD 卡模拟器,有人可以复制这个系统并启动,但这对我来说没问题,因为这非常困难,并不是任何人都能做到这一点。(也不是任何人都愿意处理模拟器)
答案1
破坏这个设置(解密根文件系统并使其从任何 SD 卡启动)有多容易?
“破解”您的设置的难度取决于您用于签名/加密文件系统本身的方法的熵位数(因为这决定了可用于暴力破解密码的唯一组合的总数)。
最薄弱的部分是什么?
毫无疑问,使用预定义的CID作为密码,以及使用自定义的伪随机数生成函数。
SD 卡的 CID 仅应该是只读的,但如今,找到不兼容的闪存设备并不罕见。 有些人甚至表现出覆写某些 SD 卡的 CID 可能与 CID 不匹配。这样更容易暴力破解密码,尤其是当一个人只是模仿克隆您的 SD 卡后(您可能还想考虑这一点)。
最后,使用任何类型的伪随机数生成器都存在一些内在缺陷,正是因为它不是随机的- 它的名字是有原因的伪随机。最好使用预先制作的加密引导加载程序(例如TrueCrypt或 LUKS,它们都可以在 Raspberry Pi 上运行),避免进行任何手动内核修改。
反编译内核并找到那些自定义加密函数有多容易?
反编译任何东西都非常困难。相反,反汇编已编译的应用程序通常很容易,并且有许多工具可用于协助逆向工程汇编成另一种高级语言。如果攻击者甚至可以访问已编译的内核,那么分析伪随机数生成器之类的东西可能很容易,除非代码是故意混淆的。
TL,DR:在加密和安全方面,不要重新发明轮子,坚持久经考验的方法。目前已有几种全盘加密选项,并且已证明它们在 Raspberry Pi 上工作得很好。我会避免使用 SD 卡的 CID 作为一种“密码”——即使它无法更改,也有办法伪造这个值。
SD 卡规范中已包含复制保护,心肺复苏术。
答案2
熟练的人破解这个漏洞不会有太大困难。在模拟器下启动 SD 卡相对容易,然后只需从 RAM 中读取密钥即可。然后他们会将没有版权保护的版本发布到海盗湾(等等),就这样。
或者,使用模拟器将 shellcode 注入正在运行的模拟系统。然后使用正在运行的系统复制解密的 rootfs(或使用 读取密钥dmsetup table --showkeys
等)。
快速搜索后发现Raspberry Pi 模拟器,因此部分工作已经完成。
您遇到了另一个问题,特别是这个:
内核经过修改,拥有同样的加密功能,起到解密的作用。
根据 GPL 条款,您分发此代码的任何人都有权获得内核源代码。因此,您无需反汇编它,只需使用它diff
来查找额外的功能即可。
(通过反汇编找到它并不难,因为你可以例如检查一下库存内核)
我对 Raspberry Pi 启动代码不是完全熟悉,但如果您可以使用嵌入式加密密钥(然后传递给内核)重新刷新引导加载程序,那么它至少不会在 SD 卡上,因此它会挫败尝试让它在模拟器中启动的尝试。