
معمارية تعليمات RISC-V فريدة لكل جلسة — كل إقلاع يتحدث لهجة مختلفة. الملفات الثنائية القديمة تصبح غير صالحة. لا يمكن للبرامج الضارة البقاء.
كل إقلاع يتحدث لغة مختلفة. ثنائي الأمس هو كود اليوم الميت.
نظام إعادة توجيه مجموعة تعليمات RISC-V فريد لكل جلسة. في كل مرة يُقلع فيها النظام، يُنشئ تبديلًا تشفيريًا جديدًا لمجموعة التعليمات. يتم رفض الملفات الثنائية المترجمة لجلسة واحدة تشفيريًا في الجلسة التالية. البرامج الضارة التي تنجو من إعادة التشغيل لا يمكنها التنفيذ — فهي تتحدث لهجة ميتة.
مجموعات التعليمات القياسية هي عقود ثابتة. كل برنامج، كل مكتبة، كل قطعة من البرامج الضارة تتفق على معنى 0x13، ما تفعله استدعاء النظام 64، أي سجل هو مؤشر المكدس. DeadDialect يكسر هذا العقد في كل جلسة.
Boot A: addi = 0x13, write = syscall 64, t0 = x5
Boot B: addi = 0x33, write = syscall 178, t0 = x19
Boot C: addi = 0x67, write = syscall 291, t0 = x23
الملف الثنائي المُترجم لـ Boot A هو هراء على Boot B. إما أنه ينفذ تعليمات خاطئة، أو يستدعي وظائف نواة خاطئة، أو يفشل في التحقق من البصمة التشفيرية — أيهما يأتي أولاً.
256-bit session seed (os.urandom)
│
├─── opcode permutation → /etc/isa/map 12! ≈ 2²⁹
├─── register permutation → /etc/isa/register_keyring 21! ≈ 2⁶⁵
└─── syscall permutation → /etc/isa/syscall_keyring 436! ≈ 2³⁰⁰⁰⁺
─────────────
Combined entropy: 2³⁰⁹⁴⁺
ثلاث طبقات مستقلة. المهاجم الذي يكسر طبقة واحدة لا يزال يواجه الطبقتين الأخريين.
┌──────────────────────────────────────────────────────────────┐
│ Binary (.text) │
│ rewritten at compile time by isa_integrate.py │
│ fingerprint NOPs embedded at .text+0 │
└─────────────────────────┬────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ Patched QEMU 8.2.0 │
│ │
│ translate.c ← register_mapping.h │
│ ├── verify 24-bit SHA-256 fingerprint │
│ │ mismatch → SIGILL before first instruction │
│ └── remap 21 shuffleable registers │
│ │
│ syscall.c ← syscall_mapping.h │
│ └── translate permuted syscall number → standard │
│ │
│ [Phase 1/2] ← isa_mapping.h │
│ └── remap 12 primary opcodes │
└──────────────────────────┬───────────────────────────────────┘
│
▼
Alpine Linux RISC-V (boots normally)
OS is unaware of the remapping
كل ملف ثنائي مُجمّع يحمل بصمة تشفيرية 24 بت مضمنة كتعليمتين من نوع NOP غير ضارتين addi x0,x0,N في بداية .text. هذه هي تعليمات NOP حقيقية لـ RISC-V — فهي تكتب إلى سجل الصفر وليس لها تأثير معماري — لكنها تُشفّر دليل الجلسة.
QEMU sees fingerprint NOPs + matching keyring → RUN
QEMU sees fingerprint NOPs + wrong keyring → SIGILL
QEMU sees no fingerprint + active keyring → SIGILL ← standard binary blocked
QEMU sees fingerprint NOPs + empty keyring → SIGILL ← remapped binary blocked
البصمة مشتقة من SHA-256(seed). لم يتم العثور على أي تصادم في أول 100,000 بذرة تم اختبارها.
DeadDialect/
├── opcode-remapping/ Phase 1 — 12 opcode shuffle
├── trigger-remapping/ Phase 2 — live trigger, no reboot needed
│ └── alpine/ Alpine Linux demo
├── syscall-remapping/ Phase 3 M1 — 436 syscall shuffle
├── register-remapping/ Phase 3 M2 — 21 register shuffle + fingerprint
└── integration/ Phase 3 M3 — all layers simultaneously
├── isa_integrate.py unified rewriter
├── register_mapping.h
├── syscall_mapping.h
├── isa_remap_ldso.h musl ld.so patch (dynamic binaries)
├── trigger/
│ └── trigger_demo.sh one trigger rotates both layers atomically
├── alpine/
│ ├── boot_alpine.sh boot Alpine under patched QEMU
│ ├── alpine_demo.sh full ISA demo inside Alpine
│ ├── full_alpine_test.sh
│ └── setup_alpine.sh fresh machine setup
├── build.sh downloads + patches QEMU 8.2.0
├── demo.sh
└── audit.sh 51/51 checks
المتطلبات: Ubuntu 22.04، clang، lld، python3، wget، ninja-build، libglib2.0-dev، libpixman-1-dev، libslirp-dev
git clone https://github.com/engrbilal992/DeadDialect.git
cd DeadDialect/integration
# Build patched QEMU 8.2.0 (~10 min first run)
bash build.sh
# Security demo
bash demo.sh
# One trigger rotates both layers simultaneously
bash trigger/trigger_demo.sh
# Boot Alpine Linux under patched QEMU
cd alpine
bash setup_alpine.sh # first time only — downloads kernel + rootfs
bash boot_alpine.sh # boots to ~ # prompt in ~30 seconds
# Alpine ISA demos
bash alpine_demo.sh
bash full_alpine_test.sh
T1: Standard binary, empty keyrings → runs ✓
T2: Integrated binary, correct keyrings → runs ✓
T3: Standard binary, active keyrings → SIGILL ✗
T4: Integrated binary, empty keyrings → SIGILL ✗
T5: Wrong-seed binary → SIGILL ✗
T6: Correct seed binary → runs ✓
Session A binary runs SUCCESS ✓
Session A malware runs EXECUTED (expected — same session)
── trigger fires ──
Session B old binary BLOCKED ✓
Session B malware BLOCKED ✓
Session B new binary compiled for B SUCCESS ✓
100,000 seeds — zero collisions
Seed 999999999 → BLOCKED under different session ✓
Seed 2²⁵⁶-1 (max 256-bit) → BLOCKED under different session ✓
Keyring corrupted mid-run → BLOCKED on corrupted keyring ✓
| Milestone |
|---|
Guessing register permutation: 1 in 21! ≈ 1 in 51 quintillion
Guessing syscall permutation: 1 in 436! ≈ 1 in 10^(1000+)
Guessing both simultaneously: not a viable attack
-march=rv64g مطلوب (تعليمات RVC المضغوطة لم تُعالج بعد)isa_remap_ldso.h)register_mapping.h)يتم خلط 21 من أصل 32 سجلًا لـ RISC-V. السجلات الخاصة بواجهة ABI مجمدة. خطاف QEMU يستخدم جدول OPCODE_FIELDS — فقط حقول السجلات الفعلية يُعاد توجيهها، ولا يتم لمس القيم الفورية مطلقًا (إصلاح كورتيس).
| مجمد | قابل للخلط |
|---|---|
| x0 x1 x2 x10-x17 | x3-x9, x18-x31 (21 سجلًا) |
syscall_mapping.h)تم تبديل 436 استدعاء نظام لـ Linux RISC-V. سطر واحد في do_syscall(). إعادة تحميل mtime — تحديث keyring دون إعادة تشغيل QEMU.
isa_mapping.h)تم خلط 12 أوبكود أساسي. خطاف فك التشفير في translate.c يستعيد الأوبكود القياسي قبل وحدة فك التشفير.
isa_remap_ldso.h)تصحيح الرابط الديناميكي musl — يعيد توجيه .text لكل ELF محمّل عند التحميل. لا يمكن تجاوزه عبر LD_PRELOAD. يتطلب إعادة بناء Alpine musl.
.text النواة قبل الإقلاعCurtis Cole
Muhammad Bilal
"كنت أعلم أن فكرتي حقيقية، لكني متأكد أن الجميع ظنوني مجنونًا." — Curtis Cole
| Checks |
|---|
| Status |
|---|
| Trigger remapping | 37/37 | ✓ |
| Syscall remapping | 40/40 | ✓ |
| Register remapping | 43/43 | ✓ |
| Integration | 51/51 | ✓ |