
Analyser le code pour détecter les caractères Unicode bidirectionnels invisibles (prévention d'attaque Trojan Source, CVE-2021-42574)
Les caractères Unicode bidirectionnels invisibles peuvent faire que le code source s'affiche différemment de son exécution. Il s'agit de CVE-2021-42574 — l'attaque Trojan Source.
Un attaquant insère des caractères qui inversent la direction du texte. Lors d'une revue de code, vous voyez :
access_level = "admin"
Mais le compilateur voit :
access_level = "user"
Les caractères sont invisibles. Votre éditeur ne les affichera pas. Votre relecteur ne les détectera pas. bidi-guard le fera.
pip install bidi-guard
# Analyser recursivement le répertoire courant
bidi-guard scan .
# Analyser un fichier spécifique
bidi-guard scan src/auth.py
Trouve tous les caractères Unicode bidirectionnels, affiche leur position exacte, leur contexte et leur sévérité.
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 .
Ajoutez à votre .pre-commit-config.yaml :
repos:
- repo: https://github.com/Moshe-ship/bidi-guard
rev: v0.1.0
hooks:
- id: bidi-guard
Les 16 caractères de contrôle Unicode bidirectionnels :
Les caractères marqués Élevé ou Critique peuvent réordonner activement le texte affiché — ce sont ceux utilisés dans les attaques 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}")
Ces caractères sont invisibles. Littéralement invisibles :
grep "RLO" file.py # ne trouve rien
cat file.py # semble tout à fait normal
bidi-guard vous montre ce que grep ne peut pas : le caractère exact, sa position, le contexte environnant, le niveau de sévérité et ce qu'il fait. Il peut également corriger automatiquement en les supprimant.
MIT — Musa the Carpenter
Proposé par la Saudi AI Community — d'abord pour les Arabes, et pour le monde entier.
| Commande | Action |
|---|
scan | Analyse les fichiers à la recherche de caractères bidi, affiche les résultats avec contexte |
ci | Mode CI — se termine avec un code non nul si des caractères dangereux sont trouvés |
fix | Supprime tous les caractères bidi des fichiers (interactif par défaut) |
explain | Montre ce que fait chaque caractère bidi avec des exemples visuels |
init | Génère un fichier de configuration .bidi-guard.yml pour votre projet |
| Point de code | Nom | Abréviation | Sévérité |
|---|
| U+200E | Marque gauche-à-droite | LRM | Faible |
| U+200F | Marque droite-à-gauche | RLM | Faible |
| U+061C | Marque de lettre arabe | ALM | Faible |
| U+200D | Joncteur de largeur nulle | ZWJ | Faible |
| U+200C | Non-joncteur de largeur nulle | ZWNJ | Faible |
| U+2066 | Isolat gauche-à-droite | LRI | Moyen |
| U+2067 | Isolat droite-à-gauche | RLI | Élevé |
| U+2068 | Isolat fort premier | FSI | Élevé |
| U+2069 | Isolat directionnel pop | PDI | Moyen |
| U+202A | Encapsulation gauche-à-droite | LRE | Moyen |
| U+202B | Encapsulation droite-à-gauche | RLE | Élevé |
| U+202C | Formatage directionnel pop | Moyen | |
| U+202D | Remplacement gauche-à-droite | LRO | Élevé |
| U+202E | Remplacement droite-à-gauche | RLO | Critique |
| U+2028 | Séparateur de ligne | LS | Moyen |
| U+2029 | Séparateur de paragraphe | PS | Moyen |