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构建实用工具

Download history 151/week @ 2024-04-13 5/week @ 2024-04-20 133/week @ 2024-05-04 9/week @ 2024-05-11 5/week @ 2024-05-18 1/week @ 2024-05-25 1/week @ 2024-06-01 1/week @ 2024-06-08 126/week @ 2024-07-20 14/week @ 2024-07-27

每月140 次下载

AGPL-3.0

35KB
563 代码行

build-wrap

一个链接替换工具,用于帮助防止恶意构建脚本

build-wrap "重新链接" 构建脚本,使其在另一个命令下执行。默认情况下,该命令是 Bubblewrap(Linux)或 sandbox-exec(macOS),但这是可配置的。有关更多信息,请参阅 build-wrap 读取的环境变量build-wrap 的工作原理

安装

安装 build-wrap 需要进行两个步骤

  1. 使用 Cargo 安装 build-wrap
    cargo install build-wrap
    
  2. 在你的主目录中创建一个 .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 {}
      

    bwrapBubblewrap

    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 会做以下操作

  1. 使用 BUILD_WRAP_LD 正常链接。
  2. 解析参数以确定输出文件是否是构建脚本。
  3. 如果是,则将构建脚本 B 替换为其“包装”版本 B',下面将描述。

给定一个构建脚本 B,其“包装”版本 B' 包含 B 的副本,并在被调用时执行以下操作

  1. 创建一个包含 B 内容的临时文件。(回想一下:B' 包含 B 的副本)。
  2. 使临时文件可执行。
  3. 上述方式展开 BUILD_WRAP_CMD
  4. 执行展开的命令。

目标

  • 除了配置和偶尔处理警告之外,build-wrap 不应要求用户调整他们的正常工作流程。

依赖项

~2-10MB
~114K SLoC