
Code auf unsichtbare bidirektionale Unicode-Zeichen scannen (Trojan Source-Angriffsprävention, CVE-2021-42574)
Unsichtbare bidirektionale Unicode-Zeichen können dazu führen, dass Quellcode anders angezeigt wird, als er ausgeführt wird. Dies ist CVE-2021-42574 – der Trojan-Source-Angriff.
Ein Angreifer bettet Zeichen ein, die die Textrichtung umkehren. Bei einer Code-Überprüfung sehen Sie:
access_level = "admin"
Aber der Compiler sieht:
access_level = "user"
Die Zeichen sind unsichtbar. Ihr Editor zeigt sie nicht an. Ihr Reviewer wird sie nicht entdecken. bidi-guard schon.
pip install bidi-guard
# Aktuelles Verzeichnis rekursiv scannen
bidi-guard scan .
# Eine bestimmte Datei scannen
bidi-guard scan src/auth.py
Findet alle bidirektionalen Unicode-Zeichen, zeigt deren genaue Position, Kontext und Schweregrad an.
| Befehl | Funktion |
|---|---|
scan | Scannt Dateien auf BiDi-Zeichen, zeigt Fundstellen mit Kontext an |
ci | CI-Modus – beendet mit Fehlercode, wenn gefährliche Zeichen gefunden werden |
fix | Entfernt alle BiDi-Zeichen aus Dateien (standardmäßig interaktiv) |
explain | Zeigt, was jedes BiDi-Zeichen tut, mit visuellen Beispielen |
init | Erzeugt eine .bidi-guard.yml Konfigurationsdatei für Ihr Projekt |
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 .
Fügen Sie zu Ihrer .pre-commit-config.yaml hinzu:
repos:
- repo: https://github.com/Moshe-ship/bidi-guard
rev: v0.1.0
hooks:
- id: bidi-guard
Alle 16 bidirektionalen Unicode-Steuerzeichen:
| Codepunkt | Name | Abkürzung | Schweregrad |
|---|---|---|---|
| U+200E | Links-nach-Rechts-Markierung | LRM | Niedrig |
| U+200F | Rechts-nach-Links-Markierung | RLM | Niedrig |
| U+061C | Arabisches Buchstabenmarkierungszeichen | ALM | Niedrig |
| U+200D | Nullbreitenverbinder | ZWJ | Niedrig |
| U+200C | Nullbreiten-Nichtverbinder | ZWNJ | Niedrig |
| U+2066 | Links-nach-Rechts-Isolat | LRI | Mittel |
| U+2067 | Rechts-nach-Links-Isolat | RLI | Hoch |
| U+2068 | Erstes starkes Isolat | FSI | Hoch |
| U+2069 | Pop-Richtungsisolat | PDI | Mittel |
| U+202A | Links-nach-Rechts-Einbettung | LRE | Mittel |
| U+202B | Rechts-nach-Links-Einbettung | RLE | Hoch |
| U+202C | Pop-Richtungsformatierung | Mittel | |
| U+202D | Links-nach-Rechts-Überschreibung | LRO | Hoch |
| U+202E | Rechts-nach-Links-Überschreibung | RLO | Kritisch |
| U+2028 | Zeilentrenner | LS | Mittel |
| U+2029 | Absatztrenner | PS |
Als Hoch oder Kritisch markierte Zeichen können den angezeigten Text aktiv umordnen – diese werden bei Trojan-Source-Angriffen verwendet.
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}")
Diese Zeichen sind unsichtbar. Wortwörtlich unsichtbar:
grep "RLO" file.py # findet nichts
cat file.py # sieht völlig normal aus
bidi-guard zeigt Ihnen, was grep nicht kann: das genaue Zeichen, seine Position, den umgebenden Kontext, den Schweregrad und seine Wirkung. Es kann sie auch automatisch entfernen, indem es sie herauslöscht.
MIT — Musa the Carpenter
Bereitgestellt von der Saudi AI Community – für Araber zuerst und die ganze Welt.
| Mittel |