
Scansiona il codice per individuare caratteri Unicode bidirezionali invisibili (prevenzione dell'attacco Trojan Source, CVE-2021-42574)
I caratteri Unicode bidirezionali invisibili possono far sì che il codice sorgente venga visualizzato in modo diverso da come viene eseguito. Questo è CVE-2021-42574 — l'attacco Trojan Source.
Un attaccante incorpora caratteri che invertono la direzione del testo. In una revisione del codice, vedi:
access_level = "admin"
Ma il compilatore vede:
access_level = "user"
I caratteri sono invisibili. Il tuo editor non li mostrerà. Il tuo revisore non li noterà. bidi-guard sì.
pip install bidi-guard
# Scan current directory recursively
bidi-guard scan .
# Scan a specific file
bidi-guard scan src/auth.py
Trova tutti i caratteri Unicode bidirezionali, mostra la loro posizione esatta, il contesto e la gravità.
name: BiDi Guard
on: [push, pull_request]
jobs:
bidi-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- run: pip install bidi-guard
- run: bidi-guard ci .
Aggiungi al tuo .pre-commit-config.yaml:
repos:
- repo: https://github.com/Moshe-ship/bidi-guard
rev: v0.1.0
hooks:
- id: bidi-guard
Tutti i 16 caratteri di controllo Unicode bidirezionali:
I caratteri contrassegnati come Alta o Critica possono riordinare attivamente il testo visualizzato — sono quelli usati negli attacchi Trojan Source.
from bidi_guard import scan_file, Finding
findings = scan_file("src/auth.py")
for f in findings:
print(f"{f.char_name} at line {f.line}:{f.col} — severity: {f.severity}")
Questi caratteri sono invisibili. Letteralmente invisibili:
grep "RLO" file.py # finds nothing
cat file.py # looks completely normal
bidi-guard ti mostra ciò che grep non può: il carattere esatto, la sua posizione, il contesto circostante, il livello di gravità e cosa fa. Può anche correggere automaticamente rimuovendoli.
MIT — Musa the Carpenter
Realizzato dalla Saudi AI Community — per gli arabi in primo luogo, e per il mondo intero.
| Comando | A cosa serve |
|---|
scan | Scansiona i file per caratteri bidi, mostra i risultati con contesto |
ci | Modalità CI — esce con codice non zero se vengono trovati caratteri pericolosi |
fix | Rimuove tutti i caratteri bidi dai file (interattiva di default) |
explain | Mostra cosa fa ogni carattere bidi con esempi visivi |
init | Genera un file di configurazione .bidi-guard.yml per il tuo progetto |
| Code Point | Nome | Abbreviazione | Gravità |
|---|
| U+200E | Left-to-Right Mark | LRM | Bassa |
| U+200F | Right-to-Left Mark | RLM | Bassa |
| U+061C | Arabic Letter Mark | ALM | Bassa |
| U+200D | Zero Width Joiner | ZWJ | Bassa |
| U+200C | Zero Width Non-Joiner | ZWNJ | Bassa |
| U+2066 | Left-to-Right Isolate | LRI | Media |
| U+2067 | Right-to-Left Isolate | RLI | Alta |
| U+2068 | First Strong Isolate | FSI | Alta |
| U+2069 | Pop Directional Isolate | PDI | Media |
| U+202A | Left-to-Right Embedding | LRE | Media |
| U+202B | Right-to-Left Embedding | RLE | Alta |
| U+202C | Pop Directional Formatting | Media | |
| U+202D | Left-to-Right Override | LRO | Alta |
| U+202E | Right-to-Left Override | RLO | Critica |
| U+2028 | Line Separator | LS | Media |
| U+2029 | Paragraph Separator | PS | Media |