此工具用于检查你的文件中是否存在可能被滥用于供应链攻击的 Unicode BIDI 字符,以缓解 CVE-2021-42574。 该工具使用 Rust 编写,并以一个小于 3MB 的、兼容 docker 的小型容器形式分发,以便快速、轻松地使用。
有关该攻击的详细说明,请参阅 GitHub 的博客文章 或 该攻击发表的原始论文。
此软件包主要设计为通过其 docker 容器使用。当然,也可以进行本地安装。
编译至少需要 Rust 1.56.0,因为它使用了 Rust 2021 Edition。
克隆此仓库并运行 cargo install --path . 即可为当前用户安装二进制文件。之后,你就可以调用 bidi_detector 命令了。
通过官方 docker 容器运行该工具可能是开始使用的最简单方式。 要通过 docker 运行它,以下命令可以扫描当前工作目录中的所有文件:
docker run --rm -it -v $(pwd):/data ghcr.io/maweil/bidi_char_detector:latest
根据你的系统,你可能需要稍微调整此命令。例如,如果你使用 podman 且启用了 SELinux,请尝试以下命令:
podman run --rm -it -v $(pwd):/data:Z ghcr.io/maweil/bidi_char_detector:latest
默认情况下,将检查所有文件。如果当前目录中包含二进制文件,命令将会失败,因为它无法解码非 UTF-8 编码的文件。
要根据你的需求调整命令,请在项目根目录中放置一个名为 bidi_config.toml 的文件。
你可以在此仓库中找到相应的示例,示例如下。各选项将在示例下方详细说明:
[general]
includes = [
"src/**/*",
"**/*.patch",
"**/*.json",
"**/Dockerfile",
"test/*.js"
]
excludes = [
".git/*",
"target/*"
]
[display]
show_details = true
此部分包含两个数组(includes 和 excludes),你可以在此指定要扫描(或从扫描中排除)的文件模式。
请确保你的模式匹配的是目录内的文件,而不是目录名称本身,否则你的文件将不会被扫描。
如果你想扫描所有文件,仅排除例如你的 .git 目录,以下配置即可实现:
[general]
includes = [
"**/*"
]
excludes = [
".git/*",
]
[display]
show_details = true
如果你想改为显式定义包含源文件的文件夹,以下配置示例将扫描 src 目录中的所有文件(不忽略任何内容):
[general]
includes = [
"src/**/*"
]
excludes = [
]
[display]
show_details = true
此部分提供以下设置:
示例: show_details = true,verbose = true
src/lib.rs - 0 BIDI characters
src/main.rs - 0 BIDI characters
test/example-commenting-out.js - 6 BIDI characters
Found character RLO (Right-to-Left Override), test/example-commenting-out.js:4:3
Found character LRI (Left-to-Right Isolate), test/example-commenting-out.js:4:7
Found character PDI (Pop Directional Isolate), test/example-commenting-out.js:4:20
Found character LRI (Left-to-Right Isolate), test/example-commenting-out.js:4:22
Found character RLO (Right-to-Left Override), test/example-commenting-out.js:6:20
Found character LRI (Left-to-Right Isolate), test/example-commenting-out.js:6:24
Found 6 potentially dangerous Unicode BIDI characters!
示例: show_details = false,verbose = true
src/lib.rs - 0 BIDI characters
src/main.rs - 0 BIDI characters
test/example-commenting-out.js - 6 BIDI characters
Found 6 potentially dangerous Unicode BIDI characters!
示例: show_details = false,verbose = false
test/example-commenting-out.js - 6 BIDI characters
Found 6 potentially dangerous Unicode BIDI characters!
检测该攻击(包括相关 BIDI 字符列表)的所有功劳归于相应论文的原始作者。 如果在他们的工作基础之上进行构建,请引用他们的原始论文。
本仓库中的 test/example-commenting-out.js 文件是其原始仓库中 commenting-out.js 的副本。其许可遵循 原始仓库(MIT 许可证)。
此处仅将其用于测试目的。
@article{boucher_trojansource_2021,
title = {Trojan {Source}: {Invisible} {Vulnerabilities}},
author = {Nicholas Boucher and Ross Anderson},
year = {2021},
journal = {Preprint},
eprint = {2111.00169},
archivePrefix = {arXiv},
primaryClass = {cs.CR},
url = {https://arxiv.org/abs/2111.00169}
}
| 设置 | 说明 | 可选 | 默认值 | 引入版本 |
|---|
show_details | 决定在检测到 BIDI 字符时是否打印其行/位置和类型(见下方示例) | 否 | - | v0.1.1 |
ignore_invalid_data | 是否在检测到二进制/非 UTF-8 文件时打印错误信息 | 是 | true | v0.1.2 |
verbose | 即使未发现可疑字符,是否也打印文件名 | 是 | true | v0.1.2 |