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

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

我读过范杜姆的作品 等人。, Linux 签名可执行文件的设计和实现, ,以及 IBM 的 薄层色谱法 (可信 Linux 客户端)由 Safford 和 Zohar 编写。TLC 使用 TPM 控制器,这很好,但该论文是 2005 年的,我无法找到当前的替代方案。

您知道其他选择吗?

更新:那么其他操作系统呢?开放Solaris?BSD家族?

有帮助吗?

解决方案

DigSig 内核模块实现由称为bsign工具签署二进制文件验证。然而,还没有,因为Linux内核2.6.21的版本中它的任何工作。

其他提示

我意识到这是一个古老的问题,但我现在才发现它。

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

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

  • 我们还没有建立对 签名库. 。签名库还需要修改 ld.so 装载机和 dlopen(3) 机制。这并非不可能,但确实使界面变得复杂:我们应该让加载程序要求内核验证签名还是应该完全在用户空间中完成计算?如何防范 strace(2)d 进程如果这部分验证是在用户空间中完成的?我们会被迫禁止吗 strace(2) 完全依靠这样的系统吗?

    我们会做什么 提供自己的加载程序的程序?

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

  • 很多口译员都是 张大 关于他们允许的事情; bash(1) 可以与远程系统通信 完全靠自己 使用 echo/dev/tcp, ,并且很容易被诱骗执行攻击者需要做的任何事情。无论是否签名,一旦它们受到黑客的控制,您就无法信任它们。

  • 签名可执行文件支持的主要动机来自 Rootkit 取代了系统提供的 /bin/ps, /bin/ps, /bin/kill, , 等等。是的,签署可执行文件还有其他有用的理由。然而,随着时间的推移,rootkit 变得更加令人印象深刻,许多人依赖于 核心 黑客向管理员隐藏他们的活动。一旦内核被破解,整个游戏就结束了。由于 Rootkit 的复杂性,我们希望阻止其使用的工具在黑客社区中逐渐失宠。

  • 内核的模块加载接口是完全开放的。一旦一个进程有 root 特权,很容易注入内核模块而无需任何检查。我们还可以为内核模块编写另一个验证器,但围绕模块的内核基础设施非常原始。

在的GNU / Linux / FOSS模型实际上鼓励篡改 - 排序的。用户和发行制定者必须能自由修改(篡改)软件,以满足他们的需求。哪怕只是重新编译软件(无需更改任何代码)定制的东西是做得相当频繁,但会破坏二进制代码签名。其结果是,二进制代码签名模式并不特别适合于的GNU / Linux / FOSS。

相反,这种软件更多地依赖于生成签名和/或源包的安全哈希值。在具有可靠和可信的包分布模型的组合,这样可以制成一样安全(如果不是更多的话,VIS-à-VIS透明度到源代码)作为二进制代码签名。

有一个看看这个: http://linux-ima.sourceforge.net/

这不是还没有签约,但它仍然能够验证。

我可以从Solaris 10&11 OS透视回答这个问题,所有二进制文件签名。验证签名使用 'elfsign' ...

$ 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.

甲骨文最近增加了对Solaris 11中已验证的启动过程太,详见 - 的Solaris验证开机引言

有OpenSolaris的代码的某些生产级叉,三值得研究是Illumos的,SmartOS和OmniOS。

看一看水母DS9 。我打它长(的)时间前,但如果我没记错的话,你可以注册特定的二进制文件的任何修改并没有在内核级别允许的。当然,它可以与本地接入的机器被覆盖,但它不是很容易。有一个聪明的守护进程,叫警察,检查发生在机器上,如果发生了异常的情况发生时,它开始尖叫的一切。

http://en.wikipedia.org/wiki/PKCS

使用一个PKCS7它(S / MIME)标志。生成自己的证书/私钥对,自签署证书,然后使用PKCS7私钥和证书签名的文件。它会附上证书给它,然后它可以使用OpenSSL的命令在运行时检查本身(人SMIME或只是做openssl的帮助)。这是防篡改,因为即使公钥是你给了这些文件,只能用,你不会分发私钥生成该公钥的S / MIME签名。因此,如果该文件是由您的证书签名的,它一定是被人用私钥签名,并因为你没有给私钥给任何人,它一定来自你。

下面是如何使自签名证书。

http://www.akadia.com/services/ssh_test_certificate.html

您将不得不说服OpenSSL的信任您的证书作为权威的根(-CAfile),则与该检查为根,并检查该文件的证书是你(散列证书),并检查哈希值。需要注意的是,虽然它没有记录,OpenSSL的退出状态反映了做一个SMIME验证时要检查的标志的有效性。它是0,如果它匹配,非零值,如果它没有。

请注意,所有这一切是不是因为安全的,如果检查是在你的代码,他们可以简单地删除检查,如果他们想击败你。做到这一点的唯一安全的方法是将有在OS的检查,并让它检查您的二进制文件,并拒绝运行,如果没有签署。但由于没有在OS和Linux没有检查可以进行修改,以删除/绕过它反正...这是什么仅仅是检测损坏的文件超过试图阻止人们绕过你真的很好。

我同意围绕 Linux、GNU 等的哲学。围绕着修修补补。另一方面,我也认为某些系统应该受到保护,防止软件篡改等漏洞,这些漏洞可能会破坏系统用户的隐私和完整性。

内核实现无法跟上内核本身的快速开发周期。我建议使用用户空间工具来实现某种形式的可执行文件签名验证。将可执行文件放入存档或文件系统映像中,并使用私钥对映像进行签名;如果该私钥保留在您的开发计算机上(私有),那么当您的服务器被黑客攻击时,攻击者仍然无法在不欺骗系统挂载未签名图像的情况下签署自己的图像并注入他们的代码。它沿着链条进一步延伸:

  • 将您的服务包含到运行时安装的只读映像中;
  • 让机器运行签名的只读文件系统;
  • 在您的计算机上实施安全启动,运行强制启动介质完整性的启动加载程序;
  • 相信您组织中的人员不会篡改您的机器。

让一切都正确是一项艰巨的努力。通过使用另一种方法设计系统来解决这一切要简单得多:

  • 将用户与系统隔离。不要引入让用户在您的系统上执行命令的方法。避免从依赖用户提供数据的程序内部进行剔除。
  • 使用配置管理设计您的部署过程,并确保您的部署是“可重复的”,这意味着当您多次部署它们时,它们会产生相同的功能结果。这使您可以从轨道上对您怀疑已受到损害的机器进行“核攻击”。
  • 将您的机器视为受到损害的机器:定期进行审核以验证系统的完整性。将数据保存在单独的映像上并定期重新部署系统。对图像进行签名并让系统拒绝未签名的图像。
  • 使用证书:赞成“证书固定”方法。请为您的应用程序部署根证书(这将自动拒绝未经您的组织认证的签名),但至少让系统管理当前图像的指纹,并在指纹发生更改时通知管理员。尽管可以使用密钥链来实现所有这些,但基于证书的身份验证是专为这种应用程序而设计的。

我喜欢把安全作为链。链的较薄弱的环节可能会危及整个系统。所以整个事情成为“的防止未经授权的用户获得根密码”。

由于建议的@DanMoulding软件的来源也很重要,在未来可能正式OS应用程序商店将成为标准。想想Play商店,苹果或微软的商店。

  

我想安装和隐蔽恶意代码分布是   更为险恶的问题。毕竟,为了加载恶意代码是   得先安装在系统上的某个地方。更多层   安全性通常是更好的,当然。现在的问题是:是否值得   成本是多少?

在我看来,答案是“看情况”。 您可以通过采用一套安全策略由@sleblanc的建议降低风险。您可以加密文件系统( https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup ),使用只读文件系统,用于二进制文件,或使用一种机制来签名和验证的二进制文件。

但是无论你使用的机制并没有什么,一旦root访问被攻击者获得,你可以做。签名验证工具可以用篡改版本或只是禁用代替它,如果工具用户空间或内核空间中运行,一旦机器已经被入侵(尽管后者会更安全,当然并不重要)。

<强>因此,这将是很好,如果Linux内核能嵌入了签名验证模块和根用户与操作系统之间的另一安全层。

例如,这是在最近的 MACOS 版本采用的方法。有些文件不能被修改(有时读)甚至被root帐户,也有对政策和内核模块的限制(例如,仅签署或授权KEXT可以在系统上加载)。 采用更多或更少的的AppLocker 相同的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top