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-wrap
cargo 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