Linux下的签名可执行文件

Linux下的签名可执行文件,linux,security,linux-kernel,trusted-computing,Linux,Security,Linux Kernel,Trusted Computing,出于安全原因,最好在执行前检查代码的完整性,避免攻击者篡改软件。所以,我的问题是 如何在Linux下签署可执行代码并仅运行受信任的软件 我读过van Doom等人的著作《Linux签名可执行文件的设计和实现》,以及Safford&Zohar的IBM(可信Linux客户机)的著作。TLC使用TPM控制器,这很好,但这篇论文是2005年的,我无法找到当前的替代品 你知道其他的选择吗 更新:其他操作系统如何?OpenSolaris?BSD家族 GNU/Linux/FOSS模型实际上鼓励某种程度的篡改。

出于安全原因,最好在执行前检查代码的完整性,避免攻击者篡改软件。所以,我的问题是

如何在Linux下签署可执行代码并仅运行受信任的软件

我读过van Doom等人的著作《Linux签名可执行文件的设计和实现》,以及Safford&Zohar的IBM(可信Linux客户机)的著作。TLC使用TPM控制器,这很好,但这篇论文是2005年的,我无法找到当前的替代品

你知道其他的选择吗


更新:其他操作系统如何?OpenSolaris?BSD家族

GNU/Linux/FOSS模型实际上鼓励某种程度的篡改。用户和发行商必须能够自由修改(篡改)软件以满足其需求。即使只是重新编译软件(不更改任何源代码)以进行定制也是经常做的事情,但会破坏二进制代码签名。因此,二进制代码签名模型并不特别适合GNU/Linux/FOSS

相反,这种软件更依赖于生成签名和/或源包的安全哈希。结合可靠和可信的包分发模型,可以使其与二进制代码签名一样安全(如果不是更安全的话,在源代码的透明性方面)。我很久以前就玩过它,但是如果我没记错的话,你可以注册特定的二进制文件,在内核级别不允许任何修改。当然,可以通过对机器的本地访问来覆盖它,但这并不容易。有一个叫做康斯塔布的智能守护进程,它会检查机器上发生的一切,如果发生异常情况,它会开始尖叫。

看看这个:

它还没有签名,但仍然支持验证。

内核模块实现了对由名为
bsign
的工具签名的二进制文件的验证。然而,自从Linux内核版本2.6.21以来,就没有任何关于它的工作。

使用它的PKCS7(S/MIME)符号。生成自己的证书/私钥对,对证书进行自签名,然后使用PKCS7使用私钥和证书对文件进行签名。它将证书附加到证书上,然后可以在运行时使用openssl命令(mansmime或doopenssl帮助)检查自己。这是防篡改的,因为即使公钥在您发出的文件中,该公钥的S/MIME签名也只能使用您不会分发的私钥生成。因此,如果文件由您的证书签名,则该文件必须由具有私钥的人签名,并且由于您没有将私钥提供给任何人,因此该文件必须来自您

下面介绍如何生成自签名证书

您必须说服openssl将您的证书信任为权限根(-CAfile),然后将其作为根进行检查,并检查文件上的证书是否属于您(对证书进行哈希)并检查哈希。请注意,尽管没有文档记录,但openssl的退出状态反映了在执行smime验证时正在检查的标志的有效性。如果匹配则为0,如果不匹配则为非零


请注意,所有这些都是不安全的,因为如果检查在您的代码中,他们可以简单地删除检查,如果他们想打败您。唯一安全的方法是在操作系统中安装检查器,让它检查你的二进制文件,如果没有签名,就拒绝运行它。但由于操作系统中没有检查器,linux可以修改以删除/绕过它。。。这真的有好处的是检测损坏的文件,而不是试图阻止人们绕过你。

我意识到这是一个古老的问题,但我刚刚发现了它

不久前,我为Linux内核(大约2.4.3版)编写了签名的可执行文件支持,并准备了整个用于签名可执行文件的工具链,在
execve(2)
时间检查签名,缓存签名验证信息(在打开文件进行写入或修改时清除验证),将签名嵌入到任意ELF程序中,等等。在每个程序第一次执行时,它确实会带来一些性能损失(因为内核必须加载整个文件,而不仅仅是要求分页所需的页面),但一旦系统处于稳定状态,它就工作得很好

但我们决定停止追求它,因为它面临的几个问题太大,无法证明其复杂性:

  • 我们还没有建立对签名库的支持。签名库还需要修改
    ld.so
    loader和
    dlopen(3)
    机制。这并非不可能,但确实使接口复杂化了:我们应该让加载程序要求内核验证签名,还是应该完全在用户空间中进行计算?如果验证的这一部分是在用户空间中完成的,那么如何防范
    strace(2)
    d过程?我们会被迫在这样一个系统上完全禁止strace(2)

    我们该怎么办

  • 许多程序是用不编译为ELF对象的语言编写的。我们需要为
    bash
    perl
    python
    java
    awk
    sed
    ,等等提供特定于语言的修改,以便每个口译员也能够验证签名。由于大多数程序都是自由格式的纯文本,它们缺乏使将数字签名嵌入ELF对象文件变得如此简单的结构。签名将存储在哪里?在剧本里?在扩展属性中?在外部签名数据库中

  • 许多口译员对他们允许的内容持开放态度
    bash(1)
    可以使用
    echo
    完全独立地与远程系统通信
    $ elfsign verify -v /usr/bin/bash
    elfsign: verification of /usr/bin/bash passed.
    format: rsa_sha1.
    signer: O=Oracle Corporation, OU=Corporate Object Signing, OU=Solaris Signed Execution, CN=Solaris 11.
    signed on: Fri Oct 04 17:06:13 2013.