强制执行代码/脚本签名

信息安全 电子签名 pgp x.509
2021-08-18 12:54:51

我有两个 X.509 代码签名证书和一个 GPG 密钥对,可用于对我在 VPS 上运行的代码进行签名。我不时地为 iOS、OS X 和 Windows 编写代码,并始终确保我使用我的 X.509 证书签署我的二进制文件。但是,我想确保我在我的 VPS 上运行的任何东西(关于 PHP/Django 脚本,甚至可能是我发送给客户端的 Javascript)都经过签名。

我可以简单地编写一个 bash 脚本,用我的 GPG 密钥对对目录中的每个文件进行签名,但我的问题是,如果代码签名,与正确签名相比,它不会引发任何额外的错误,所以在为了保护我的服务器免受发送/执行我未明确授权的恶意脚本的利益,有什么方法可以使用我的 GPG 密钥对(甚至我的 X.509 证书!)并确保所有代码都在一个特定的位置,比如说,在执行之前总是检查目录是否有有效的签名?

为了在工作中进一步投入扳手,我们如何有效地“沙箱”这种方式,使得放置在强制检查范围之外的恶意脚本不会干扰?例如,如果一个目录被“标记”为要求对所有文件强制签名,那么该目录之外的文件是否有可能用于规避代码签名并干扰应用程序或脚本?

我对签名算法、脚本与二进制文件或操作系统并不真正感兴趣,但对于我将应用它的应用程序,它将针对在 Debian VPS 中运行的 python/django 或 PHP 脚本(出于网络的目的应用程序)。

只是一个有趣的想法,如果有合适的解决方案,我当然想追求!非常感谢您提出想法或讨论!

2个回答

为了支持这个功能,解释器必须被增强。幸运的是,这个代码唱歌功能可能不需要像hardened-php这样的 PHP 扩展。其实还有更简单的方法。

您可以更改 php.ini 以自动添加一个 php 脚本,该脚本读取$_SERVER['SCRIPT_FILENAME']并验证当前脚本的签名。如果签名检查失败,则调用die();它,它将永远无法执行。

这是一个非常简单的解决方案。但是,这并不能阻止攻击者利用现有代码中的漏洞来获取代码执行,包括但不限于eval()RFI/LFI漏洞。此外,每个解释器都需要自己的解决方案。例如,客户端 JavaScript 需要像NoScript这样的浏览器特定扩展。“未经授权的 JavaScript”通常被称为 XSS。XSS 的一个很好的解决方案是内容安全策略,因为它可以让您控制浏览器可以在哪里执行 JavaScript。对于这个问题,没有一个万能的答案。

对于 PHP,有各种加密引擎,如ionCube PHP 编码器- 这些作为 PHP 扩展工作,可连接到解析器并解密要运行的代码、验证签名、检查许可证文件的限制(例如 MAC 地址、域名,时间限制)。可以将它们设置为根本无法运行未使用适当密钥“加密”的代码,因此只能执行作者加密的 PHP 代码。

不幸的是,这些是付费的专有闭源解决方案,据我所知与 GPG 不兼容(因此您不能使用自己的 GPG 密钥进行签名)。但是,它们可以很容易地集成到应用程序构建脚本等中。

另一种方法是将整个 PHP 应用程序打包为Phar存档。Phar 支持代码签名功能,我还制作了一组名为PharUtil的脚本,使用它来安全地分发签名代码。它与您拥有的用例不同,但可能对开始很有用。

我不知道 Python 和/或 Javascript 有任何类似的解决方案。