
Проверяет ваши файлы на наличие символов Unicode BIDI, которые могут быть использованы для атак на цепочку поставок. См. CVE-2021-42574
Этот инструмент проверяет ваши файлы на наличие Unicode BIDI-символов, которые могут быть использованы в атаках на цепочку поставок, для смягчения CVE-2021-42574. Инструмент написан на Rust и распространяется как небольшой (< 3 МБ) контейнер, совместимый с 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
По умолчанию проверяются все файлы. Если в текущей директории есть бинарные файлы, команда завершится ошибкой, так как не сможет декодировать не-UTF8 файл.
Чтобы адаптировать команду под свои нужды, поместите файл с именем 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 | Определяет, выводить ли сообщение об ошибке при обнаружении бинарных/не-UTF8 файлов | Да | true | v0.1.2 |
verbose | Определяет, выводить ли имя файла, даже если подозрительных символов не найдено | Да | true | v0.1.2 |