1 个稳定版本

1.0.0 2023年5月16日

#552 in 操作系统

Apache-2.0

21KB
397

safe-package

safe-package 是包管理器的安全包装器。它使您的构建过程免受恶意和拼写错误的包依赖项的侵害,有助于防止泄露秘密和敏感数据的代码、控制您系统的代码、勒索软件以及发起恶意拉取请求的代码。

安装

从 Crates.io

cargo安装 safe-package

从 GitHub

查看 版本 获取最新版本。

从源码

gitclone https://github.com/arnica-io/SafePackage

cd SafePackage

cargobuild

您需要 cargo 以及在 Cargo.toml 文件中列出的依赖项。

运行 safe-package

用法:safe-package [选项] [EXE_ARGS]...

###参数 [EXE_ARGS]... 包管理器的参数

###选项

  • -e, --exe 要执行的任务包管理器。如果未定义,将使用第一个 ARG
  • -r, --root-dir <ROOT_DIR> 要 chroot 的目录
  • -k, --keep-env <KEEP_ENV> 包管理器需要的环境变量列表
  • -u, --user 以谁的身份运行包管理器
  • -h, --help 打印帮助信息
  • -V, --version 打印版本

配置

safe-package 会按以下顺序查找配置,依次为:

  1. /etc/safe-package/config.json
  2. ~/.safe-package/config.json
  3. $CWD/.safe-package/config.json
  4. 命令行参数

每个位置都会覆盖上一个位置。例如,环境变量列表将堆叠。像要执行的 exe 和要运行的用户这样的单例将替换。例如,如果您90%的代码是node,您可以在 /etc/safe-package/config.json 中定义 "exe": "/usr/bin/npm"。或者,您可以跳过所有配置文件,只需在命令行中定义一切。

示例

以下命令以用户 'nobody' 的身份在根目录 /cellblock/npm 下运行 npm,同时保留 npm 使用的 HTTPS_PROXY 环境变量:

safe-package-kHTTPS_PROXY -u nobody-r/cellblock/npm/usr/bin/npm install foobar

每次尝试新包时都要输入这么多内容,所以您可以在主目录的 .safe-package 子目录中自由创建一个配置文件。

{ "exe": "/usr/bin/npm", "用户": "无用户", "root_dir": "/cellblock/npm" }

然后,在您的shell资源文件中添加一个方便的别名

alias spm=safe-package

这样,安全地安装可能有害的包就会变得像您所习惯的一样简单

spm install foobar

常见问题解答

Q:那个Windows版本什么时候发布?

我是一个开源Unix开发者。请让我联系一个开源Windows开发者,我会看看我们能讨论出什么。

Q:您不能用safe-package包装除了包管理器之外的其他内容的执行吗?

是的,而且我并不介意您找到它的一些巧妙用法。我的事业是构建一个不受风险束缚的软件开发世界。

Q:为什么选择Rust而不是Go?

我非常喜欢Go,在其他地方也使用它。Go的协程和通道对safe-package来说并不有用,因为我不需要扇出任何庞大的工作负载。我需要清除环境、隔离文件系统、降权并execve。

Q:为什么选择Rust而不是...

在任何语言中,这都将是一个非常短的应用程序。如果我要写一个专门处理恶意包依赖项的安全工具,我需要确保我没有做任何使安全性变差的事情。Rust在构建时就会把潜在的缺陷抛在你面前,而不是在运行时。

Q:为什么选择chroot而不是...

Chroot是在1979年添加到Unix内核中的一个系统调用。如果你的构建系统是比1979年更新的Unix,那么你已经有chroot了。使用其他东西将需要安装其他东西。话虽如此,现在有很多不错的文件系统隔离技术,托马斯·帕塞克最近写了一篇关于其中一些技术的精彩博客文章,safe-package未来可能包括非chroot选项。

Q:您能帮我设置chroot监狱吗?

是的!请参阅extra目录中的一些有用的示例脚本。关键词是示例。预期您可能需要根据您的喜好对其进行修改。

Q:所以safe-package在我的chroot监狱中安装了我的包文件。我如何将它们取出来?

您有依赖于您的技术堆栈的选项。如果您只使用linux,您可以用链接到监狱的符号链接替换您的软件安装目录。如果您觉得这很混乱,可以编写一个同步步骤,使用类似rsync -的东西将文件从监狱中取出。容器环境有容器解决方案,如卷。

Q:为什么我需要root权限才能运行safe-package?

需要root权限来调用chroot(2)系统调用并降权。如果您不想这样做,您仍然可以使用safe-package来保护您的环境变量

safe-package-kTHIS -kTHAT -kOTHER /usr/bin/pip3

Q:我可以用sudo运行safe-package吗?

是的。

Q:我听说chroot是不安全的。是吗?

只有当您在调用chroot(2)后更改工作目录并降权时,chroot才是安全的,safe-package就是这样做的。如果您不更改工作目录,您的包管理器仍然可以访问工作目录中的文件。如果您不将权限降级到非root用户,由于root拥有内核的全部权力,总会存在root突破监狱的方法。

请参阅CVE Details。您会看到一个来自2016年的内核漏洞,让艾伦·科克斯非常愤怒,一些软件(如sudo)调用chroot的实现错误,一些旧的Unix(如SCO,哈哈!)的实现错误,以及没有太多其他内容。

问:艾伦·科克斯不是说过chroot不应该用于安全吗?他看起来很有权威。

艾伦·科克斯曾说过chroot不应该用于安全目的,而他是一位网络之神。辛辛那提·加菲克尔和吉恩·斯帕福德在1991年出版的《实用Unix与互联网安全》中讨论了chroot在安全方面的应用。卡拉·舒罗德在《Linux食谱》第一版中也提到了这一点。它在FTP应用中被广泛使用,如果你这么想,那它有点像软件包管理器。

但舒罗德、斯帕夫和加菲克尔不像艾伦·科克斯那样是网络之神。W.理查德·斯蒂文斯在《UNIX环境高级编程》中讨论了使用chroot进行安全的目的,在我看来,斯蒂文斯是无懈可击的。

依赖项

~3–4.5MB
~88K SLoC