
افحص الكود بحثًا عن أحرف يونيكود ثنائية الاتجاه غير المرئية (الوقاية من هجوم Trojan Source، CVE-2021-42574)
يمكن لأحرف يونيكود ثنائية الاتجاه غير المرئية أن تجعل الكود المصدري يُعرض بشكل مختلف عمّا يُنفَّذ. هذه هي ثغرة CVE-2021-42574 — هجوم Trojan Source.
يُضمّن المهاجم أحرفًا تعكس اتجاه النص. عند مراجعة الكود، ترى:
access_level = "admin"
لكن المترجم يرى:
access_level = "user"
هذه الأحرف غير مرئية. لن يُظهرها محررك. لن يلتقطها المراجع. لكن bidi-guard سيفعل.
pip install bidi-guard
# Scan current directory recursively
bidi-guard scan .
# Scan a specific file
bidi-guard scan src/auth.py
يجد جميع أحرف اليونيكود ثنائية الاتجاه، ويعرض موضعها الدقيق وسياقها ومستوى خطورتها.
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 .
أضِف إلى ملف .pre-commit-config.yaml الخاص بك:
repos:
- repo: https://github.com/Moshe-ship/bidi-guard
rev: v0.1.0
hooks:
- id: bidi-guard
جميع أحرف التحكم ثنائية الاتجاه الستة عشر في يونيكود:
الأحرف المُعلَّمة بدرجة عالية أو حرجة يمكنها إعادة ترتيب النص المعروض فعليًا — وهذه هي الأحرف المستخدمة في هجمات 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}")
هذه الأحرف غير مرئية. غير مرئية حرفيًا:
grep "RLO" file.py # finds nothing
cat file.py # looks completely normal
يُريك bidi-guard ما لا يستطيع grep إظهاره: الحرف الدقيق، وموضعه، والسياق المحيط به، ومستوى خطورته، وما يفعله. كما يمكنه الإصلاح التلقائي بإزالتها.
MIT — موسى النجار
تقدّمها لكم مجتمع الذكاء الاصطناعي السعودي — للعرب أولًا، وللعالم أجمع.
| Command | الوظيفة |
|---|
scan | يفحص الملفات بحثًا عن أحرف bidi ويعرض النتائج مع السياق |
ci | وضع CI — يخرج برمز خروج غير صفري إذا وُجدت أي أحرف خطيرة |
fix | يزيل جميع أحرف bidi من الملفات (تفاعلي افتراضيًا) |
explain | يعرض ما يفعله كل حرف bidi مع أمثلة مرئية |
init | ينشئ ملف إعداد .bidi-guard.yml لمشروعك |
| Code Point | الاسم | الاختصار | الخطورة |
|---|
| U+200E | علامة من اليسار إلى اليمين | LRM | منخفضة |
| U+200F | علامة من اليمين إلى اليسار | RLM | منخفضة |
| U+061C | علامة الحرف العربي | ALM | منخفضة |
| U+200D | موصول بعرض صفري | ZWJ | منخفضة |
| U+200C | فاصل غير موصول بعرض صفري | ZWNJ | منخفضة |
| U+2066 | عزل من اليسار إلى اليمين | LRI | متوسطة |
| U+2067 | عزل من اليمين إلى اليسار | RLI | عالية |
| U+2068 | أول عزل قوي | FSI | عالية |
| U+2069 | إنهاء العزل الاتجاهي | PDI | متوسطة |
| U+202A | تضمين من اليسار إلى اليمين | LRE | متوسطة |
| U+202B | تضمين من اليمين إلى اليسار | RLE | عالية |
| U+202C | إنهاء التنسيق الاتجاهي | متوسطة | |
| U+202D | تجاوز من اليسار إلى اليمين | LRO | عالية |
| U+202E | تجاوز من اليمين إلى اليسار | RLO | حرجة |
| U+2028 | فاصل أسطر | LS | متوسطة |
| U+2029 | فاصل فقرات | PS | متوسطة |