RPM - 签名后修改包

时间:2016-07-24 10:44:13

标签: linux package rpm signature sign

我们使用RPM软件包在我们客户的环境中部署我们的产品。为了使RPM完全独立,我们“个性化”RPM以适应特定客户的环境。这样,客户只需要安装RPM而无需遵循任何向导来编辑配置文件。

我的问题如下: 我们在个性化之前签署RPM包。个性化过程涉及将信息附加到RPM文件(无需真正添加RPM标头,只需附加原始数据)。这种修改(自然地)打破了包的签名。

我正在寻找的是让我在不破坏签名的情况下修改文件的技巧。

这是我到目前为止所尝试的内容:

  1. 包中的'lead'部分包含可以使用的保留字节,但它的大小非常有限且不可扩展。
  2. 添加扩展文件属性 - 非常容易使用,但复制文件时属性消失(有特殊标志来保留属性,但我们无法强制使用它们。)
  3. 我们考虑过将一个虚拟标头插入RPM并欺骗RPM代码而不检查它,仍然不知道该怎么做。
  4. 在个性化发生后签署包裹 - 也不具备可扩展性,因为这意味着我们需要为每个客户签署包裹而不是一次。
  5. 请注意,我知道签名应该阻止修改文件的内容(它的行为符合预期)。但是,我真的不想修改RPM 数据,只需在文件中包含额外的信息。

    有什么想法吗?

    谢谢!

3 个答案:

答案 0 :(得分:3)

第五种选择是制作一个包含您的更改并取决于签名包的包。是否签署您的包当然取决于它的分发方式。

如果您的软件包修改了原始RPM中的文件,您可以通过使%pre%preun scriptlet将原始文件重命名为备份版本并添加一个来解决此问题(文件名的使用冲突)。替换的符号链接。这确实会干扰验证原始包装内容,但您的修改应该是您可以根据具体情况进行验证的。

答案 1 :(得分:2)

如果你真的必须在保留现有签名的同时修改* .rpm,那么在签名标题中添加标签,最好使用十进制~275到999之间的标签号。两个现有的签名明文(仅限标题和标题+有效负载)将不受签名标题中其他标记/数据的影响。

请注意,最新版本的RPM已被强制显式枚举标记,类型和数据,以防止通过模糊测试发现的段错误。但即使在这种情况下,也有一个填充标记(来自内存的0x3fffffff)可以填充其他数据。再次--iirc - 最新版本的rpm也验证填充是全部0x00所以警告。

与此同时,您还没有描述“个性化”是什么,并且在安装软件包时,将丢弃添加到签名标头的任何标签。另请注意,在* .rpm中重写签名头的代码有点棘手,因为填充以确保签名头后面的元数据头是8字节对齐的。

我建议你会发现包含“个性化”的附加文件是一种更好的工程方法。黑客艺术知道何时停止; - )

答案 2 :(得分:1)

  

在个性化发生后签署包裹 - 也是   不可扩展,因为这意味着我们需要为每个包签署包   客户而不是一次。

为什么这不能扩展?仅仅因为rpmsign想要你输入密码?看看obs-sign https://en.opensuse.org/openSUSE:Build_Service_Signer (可在Suse,Fedora和Epel中获得)。它能够自动进行签名并保证其安全。