6 个版本
| 0.3.1 | 2024年7月22日 |
|---|---|
| 0.3.0 | 2024年5月7日 |
| 0.2.1 | 2024年4月14日 |
| 0.1.1 | 2024年3月25日 |
#53 在 构建实用工具 中
每月140 次下载
35KB
563 代码行
build-wrap
一个链接替换工具,用于帮助防止恶意构建脚本
build-wrap "重新链接" 构建脚本,使其在另一个命令下执行。默认情况下,该命令是 Bubblewrap(Linux)或 sandbox-exec(macOS),但这是可配置的。有关更多信息,请参阅 build-wrap 读取的环境变量 和 build-wrap 的工作原理。
安装
安装 build-wrap 需要进行两个步骤
- 使用 Cargo 安装
build-wrapcargo install build-wrap - 在你的主目录中创建一个
.cargo/config.toml文件,并包含以下内容[target.'cfg(all())'] linker = "build-wrap"
build-wrap 读取的环境变量
请注意,以下环境变量在链接构建脚本时读取。因此,例如,更改 BUILD_WRAP_CMD 不会更改已链接构建脚本使用的命令。
-
BUILD_WRAP_ALLOW:当设置为除0之外的其他值时,build-wrap使用以下弱化策略。如果在BUILD_WRAP_CMD下运行构建脚本失败,则报告失败并正常重新运行构建脚本。请注意,为了查看报告的失败,必须使用
-vv("非常详细")标志调用 Cargo,例如。BUILD_WRAP_ALLOW=1 cargo build -vv -
BUILD_WRAP_CMD:用于执行构建脚本的命令。Linux 默认值-
带注释
bwrap --ro-bind / / # Allow read-only access everywhere --dev-bind /dev /dev # Allow device access --bind {OUT_DIR} {OUT_DIR} # Allow write access to `OUT_DIR` --bind /tmp /tmp # Allow write access to /tmp --unshare-net # Deny network access {} # Build script path -
一行(用于复制粘贴)
bwrap --ro-bind / / --dev-bind /dev /dev --bind {OUT_DIR} {OUT_DIR} --bind /tmp /tmp --unshare-net {}
bwrap是 Bubblewrap。macOS 默认
sandbox-exec -f {BUILD_WRAP_PROFILE_PATH} {}有关
BUILD_WRAP_PROFILE_PATH,请参阅被视为已设置的build-wrap环境变量。 -
-
BUILD_WRAP_LD:要使用的链接器。默认:cc -
BUILD_WRAP_PROFILE:仅限 macOS。build-wrap会像处理BUILD_WRAP_CMD一样展开BUILD_WRAP_PROFILE,并将结果写入临时文件。然后BUILD_WRAP_PROFILE_PATH展开为该临时文件的绝对路径。默认:(version 1) (deny default) (allow file-read*) ;; Allow read-only access everywhere (allow file-write* (subpath "/dev")) ;; Allow write access to /dev (allow file-write* (subpath "{OUT_DIR}")) ;; Allow write access to `OUT_DIR` (allow file-write* (subpath "{TMPDIR}")) ;; Allow write access to `TMPDIR` (allow file-write* (subpath "{PRIVATE_TMPDIR}")) ;; Allow write access to `PRIVATE_TMPDIR` (see below) (allow process-exec) ;; Allow `exec` (allow process-fork) ;; Allow `fork` (allow sysctl-read) ;; Allow reading kernel state (deny network*) ;; Deny network access
被视为已设置的 build-wrap 环境变量
请注意,我们说“被视为已设置”,因为这些变量仅在BUILD_WRAP_CMD 被展开时才被考虑。
-
BUILD_WRAP_PROFILE_PATH:展开为包含BUILD_WRAP_PROFILE展开内容的临时文件的绝对路径。 -
PRIVATE_TMPDIR:如果TMPDIR设置为/private路径(在 macOS 上很典型),则PRIVATE_TMPDIR展开为该路径。这对于某些使用cc-rs的构建脚本来说是必需的,尽管它为什么是必需的尚不清楚。
BUILD_WRAP_CMD 的展开方式
{}被替换为原始构建脚本的副本的路径。{VAR}被替换为环境变量VAR的值。{{被替换为{。}}被替换为}。\后跟一个空白字符被替换为那个空白字符。\\被替换为\。
build-wrap 的工作方式
当被调用时,build-wrap 会做以下操作
- 使用
BUILD_WRAP_LD正常链接。 - 解析参数以确定输出文件是否是构建脚本。
- 如果是,则将构建脚本
B替换为其“包装”版本B',下面将描述。
给定一个构建脚本 B,其“包装”版本 B' 包含 B 的副本,并在被调用时执行以下操作
- 创建一个包含
B内容的临时文件。(回想一下:B'包含B的副本)。 - 使临时文件可执行。
- 按上述方式展开
BUILD_WRAP_CMD。 - 执行展开的命令。
目标
- 除了配置和偶尔处理警告之外,
build-wrap不应要求用户调整他们的正常工作流程。
依赖项
~2-10MB
~114K SLoC