
파일에서 공급망 공격에 악용될 수 있는 유니코드 BIDI 문자의 존재 여부를 확인합니다. CVE-2021-42574를 참조하세요.
이 도구는 CVE-2021-42574를 완화하기 위해 공급망 공격에 악용될 수 있는 유니코드 BIDI 문자가 파일에 있는지 확인합니다. 이 도구는 Rust로 작성되었으며 빠르고 쉬운 사용을 위해 작은 (< 3MB) Docker 호환 컨테이너로 배포됩니다.
공격에 대한 설명은 GitHub 블로그 글 또는 공격이 발표된 원본 논문을 참조하세요.
이 패키지는 주로 Docker 컨테이너를 통해 사용하도록 설계되었습니다. 하지만 물론 로컬 설치도 가능합니다.
컴파일에는 최소 Rust 1.56.0이 필요합니다. Rust 2021 에디션을 사용하기 때문입니다.
이 저장소를 클론하고 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 문자의 line/pos 및 유형을 출력할지 결정합니다 (아래 예시 참조) | 아니오 | - | v0.1.1 |
ignore_invalid_data | 바이너리/UTF-8이 아닌 파일이 감지될 때 오류 메시지를 출력할지 여부 | 예 | true | v0.1.2 |
verbose | 의심스러운 문자가 없어도 파일 이름을 출력할지 여부 | 예 | true | v0.1.2 |