
kasld v0.4.0
يقوم KASLD بإزالة العشوائية من تخطيط الذاكرة الافتراضية والفيزيائية لنواة Linux من عملية محلية، باستخدام ما تسمح به وجهة نظره — من صلاحيات وتكوين وحصر.
يستعيد KASLD التخطيط الافتراضي للذاكرة في نواة Linux — الفعلية والظاهرية — وبشكل أساسي قاعدة نص النواة — من عملية محلية، مستفيدًا قدر الإمكان من منظور العملية: صلاحياتها وقدراتها، وإعدادات النظام، وأي حصر داخل حاوية. يستعيد قاعدة نص النواة مباشرةً حيث يسمح تسريب أو قناة جانبية بذلك، وإلا يضيّقها إلى أصغر مجموعة من المواضع التي تدعمها الأدلة المتاحة. يدمج محرك الاستدلال الأدلة من عشرات التقنيات المستقلة مع الثوابت المعروفة للمعمارية، مضيّقًا موضع النواة إلى نافذة متبقية — تُعرض كعدد الفتحات المتبقية وعدد بتات الإنتروبيا: حد أعلى للحماية التي يحتفظ بها KASLR من هذا المنظور، وليس ضمانًا بأن القاعدة خارج متناول المهاجم (انظر docs/limitations.md). على نواة حديثة مُرقّعة بالكامل — حيث تُخفَّف القنوات الجانبية على x86-64 ولا يبقى أي تسريب مباشر لنص النواة — غالبًا ما يكون الاستعادة الكاملة مستحيلة، لكن مجموعة القيود نادرًا ما تكون فارغة. على المعماريات التي لا تحتوي على KASLR، يحدد المحرك عنوان التحميل الذي اختاره محمّل الإقلاع.
يدعم:
- x86 (i386+, amd64)
- ARM (armv6, armv7, armv8, aarch64)
- MIPS (mipsbe, mipsel, mips64el)
- PowerPC (ppc, ppcle, ppc64, ppc64le)
- RISC-V (riscv32, riscv64)
- LoongArch (loongarch64)
- s390
البدء السريع
sudo apt install libc-dev make gcc binutils git
git clone https://github.com/bcoles/kasld
cd kasld
make
./build/<arch>/kasld
دليل build/<arch>/ مكتفٍ ذاتيًا ويمكن نشره على نظام الهدف:
build/<arch>/
kasld <- run this
components/ <- leak components
إعداد مُحصَّن (kernel.dmesg_restrict=1،
kernel.kptr_restrict=1، kernel.perf_event_paranoid=2 أو أعلى،
kernel.unprivileged_bpf_disabled=1) يضيّق مسار أوراكل نظام الملفات،
لكنه محور واحد فقط من المنظور: تقنيات القنوات الجانبية والإنتروبيا
الضعيفة والقدرات الممنوحة مستقلة عن هذه الإعدادات. للاختبار، يمكن لسكربت
extra/weaken-kernel-hardening تخفيف هذه
الإعدادات مؤقتًا (يتطلب صلاحيات root).
مثال على المخرجات
يطبع الوضع النصي الافتراضي نظرة عامة تبدأ بالنتيجة:
KASLD 0.3.1-dev -- Kernel Address Space Layout Derandomization
Target: x86_64 / 7.0.0
Running 117 of 120 components (3 experimental skipped; use -x to enable)...
[####################] 100% 117/117 40.9s
1 component timed out after 30s and was killed (prefetch_directmap)
Quantity Certainty Window Candidates Grain
------------------- ---------- --------------------------------------- -------------- -----
Virtual Image Base guaranteed 0xffffffff81000000 - 0xffffffffbd400000 483 of 505 2 MiB
Virtual Image Base likely 0xffffffff93400000 slide +0x12400000 1 of 483 2 MiB
Physical Image Base guaranteed 0x1000000 - 0x3d400000 474 of 8185 2 MiB
Physical Image Base likely 0x1000000 - 0x3c29d000 474 of 474 2 MiB
Direct Map Base guaranteed 0xffff800000000000 - 0xffffa4aa80000000 37547 1 GiB
Vmalloc Base guaranteed 0xffff898000000000 - 0xffffd6d580000000 79191 of 79191 1 GiB
Vmemmap Base guaranteed 0xffffa98040000000 - 0xfffffd0000000000 85504 1 GiB
Module Region Base guaranteed 0xffffffffa0000000 - 0xffffffffff000000 389121 4 KiB
Module Region Base likely 0xffffffffc0000000 - 0xffffffffc0400000 1025 of 389121 4 KiB
Paging Level guaranteed 48 1 of 2 -
Note: physical and virtual text randomize independently
Note: 1 sub-range excluded from the windows above; the counts
already reflect them (-v lists the ranges).
Evidence (1 finding, 2 components)
Region Position Address Sources
----------------- -------- ------------------ -------
virt kernel image base 0xffffffff93400000 2
[-v: detailed results, memory map, system info] [-H: hardening assessment]
يضيف -v القراءة المطوّلة الكاملة (اللافتة، كتلة إعدادات النظام،
سجلات كل مكوّن، تحليل KASLR، خرائط تخطيط الذاكرة). ويُخرج -j بيانات
JSON قابلة للقراءة آليًا — العرض المنظّم الكامل، متضمنًا دائمًا سجلات كل
مكوّن وتقييم التحصين. ويُخرج -1 سطرًا واحدًا قابلًا للتمرير عبر الأنابيب
في الصدفة. ويُنسّق -m لمتتبعات المشكلات. ويضيف -H تقييم التحصين إلى
تقارير النص/Markdown.
انظر docs/usage.md لواجهة سطر الأوامر الكاملة، وتفاصيل أوضاع الإخراج، ووضع الشرح، وتقييم التحصين.
المنظور
ما يمكن لـ KASLD استعادته يعتمد على منظور العملية الجارية — وليس مستوى صلاحية واحدًا، بل مزيج ثلاثة أمور مستقلة:
- الصلاحيات والمجموعات والقدرات — معرّف مستخدم غير مميّز، أو عضوية في
مجموعة مثل
adm(التي تمنح سجلات النواة تحت/var/log/)، أو مهمة حاوية تحمل قدرة إضافية، أو root. هذه لا تشكّل سلّمًا واحدًا، لأن أذونات نظام الملفات تُبوّب كل مصدر بشكل مستقل: حاوية مُنحتCAP_SYS_RAWIOتكون root في نطاق init بالنسبة لهذا الفحص ويمكنها قراءة/proc/kcore— وهو تسريب لا يستطيع مستخدم عادي الوصول إليه — بينما تختلف التوزيعات حول ما إذا كان ملف مثل/boot/System.mapقابلًا للقراءة للجميع أصلًا. - إعدادات النظام —
kptr_restrict،dmesg_restrict،perf_event_paranoid، BPF غير المميّز، قفل النواة (kernel lockdown). الإعدادات مستقلة عن الصلاحية: لا يستطيع root قراءة/proc/kallsymsتحتkptr_restrict=2، بينما يمكن لـ sysctl مخفّف أو BPF غير مميّز أن يمنح مستخدمًا عاديًا تسريبًا كان نظام مُحصَّن سيمنعه. - الحصر — مساحة أسماء أو صندوق رملي seccomp يحجب أوراكل
/procأو يحظر استدعاءات النظام، مما يضيّق ما يلاحظه أي مستوى صلاحية.
تُبوّب المحاور الثلاثة كل مصدر تسريب بشكل مستقل — لذا الصلاحية الأكبر ليست مجموعة شاملة للأقل: يمكن للإعدادات أن تحجب مصدرًا عن root، وتتجاوز القنوات الجانبية إعدادات sysctl بالكامل. يحتوي docs/usage.md على مصفوفة مصدر التسريب حسب البوابة توضح أي محور يتحكم بكل مصدر.
يفترض KASLD صلاحيات قليلة افتراضيًا ويستفيد انتهازيًا من أي شيء يمنحه
المنظور. النافذة المُبلَّغ عنها المضمونة لا تعتمد أبدًا على الصلاحية:
الوصول المرتفع أو الإعدادات الضعيفة يمكن أن توسّع ما يُجرَّب، وليس التخطيط
السليم الذي تثبته الأدلة. تُبلّغ مخرجات الوضع المطوّل (-v) وJSON (-j)
وMarkdown (-m) عن المنظور المكتشف — الحاوية، والحصر، والأوراكل القابلة
للقراءة، والتسريبات المبوّبة بالقدرات التي يمكن الوصول إليها من القدرات
الحالية.
التوثيق
جديد على KASLD؟ اقرأ بالترتيب: docs/kaslr.md (ما هو KASLR وما الذي يعشوّشه) → docs/architecture.md → تسريب من البداية إلى النهاية (كيف يحوّل KASLD تسريبًا واحدًا إلى إجابة) → docs/limitations.md (ما تثبته النتيجة وما لا تثبته) → CONTRIBUTING.md (أضف مكوّن تسريب أو قاعدة استدلال). الجدول أدناه يفهرس التوثيق حسب الموضوع.
| الموضوع | المستند |
|---|---|
| مقدمة KASLR | docs/kaslr.md — تاريخ KASLR لكل معمارية، قاعدة النص الافتراضية، vmsplit، FG-KASLR |
| الاستخدام وسطر الأوامر | docs/usage.md — سطر الأوامر، أوضاع الإخراج، وضع الشرح، تقييم التحصين |
| تفسير النتائج | docs/limitations.md — ماذا تعني نتيجة سلبية أو جزئية: سليمة لكن غير كاملة، ولماذا الفشل ليس ضمانًا أمنيًا |
| تقنيات التجاوز | docs/bypass-techniques.md — تسريبات نظام الملفات، القنوات الجانبية، تسريبات استدعاءات النظام / ioctl، الإنتروبيا الضعيفة، ثغرات CVE المُرقّعة، القراءة العشوائية |
| الاستغلال | docs/exploitation.md — أين يتناسب إبطال KASLR في الاستغلال، تدفق التحكم مقابل البيانات فقط، قالب pwntools، ksymoff |
| البصمة والكشف | docs/footprint.md — كيف تبدو عملية تشغيل على مضيف مُراقَب: البصمة السلوكية للكشف عنها، وتكلفة OPSEC للمشغّل؛ صاخب بالتصميم |
| الأدوات المساعدة | extra/README.md — سكربتات extra/ المساعدة (capture/replay، التحقق من السلامة، posture-diff، ksymoff) وكيف تتكامل |
| المعمارية والداخليات | docs/architecture.md — محرك الاستدلال، مفاصل تدفق البيانات، بروتوكول السطر الموسوم، الاشتقاق عبر المناطق |
| المساهمة | CONTRIBUTING.md — كتابة مكوّن أو قاعدة، واجهة emitter، رموز الخروج، البيانات الوصفية |
| الاختبار والتكامل المستمر | docs/testing.md — اختبارات المضيف، عيّنات إعادة التشغيل، المعماريات المتقاطعة تحت qemu-user، التغطية |
| قابلية إعادة الإنتاج | docs/reproducibility.md — التحقق المستقل: على النواة المحلية، مباشرة عبر المعماريات، أو على المجموعة المُلتقطة |
البناء
يلزم مترجم يدعم ماكرو _GNU_SOURCE بسبب استخدام كود غير محمول
(MAP_ANONYMOUS، getline()، popen()، …).
make # build kasld + components
make run # build and run
make test # build and run unit tests
make cross # cross-compile for all supported architectures
make install # install to /usr/local (PREFIX=/usr/local)
make installcheck # smoke-test the installed bin/kasld + libexec/kasld/
make uninstall # remove installed files
make clean # remove build directory
make print-deps # list build dependencies (libs + per-component flags)
make help # show all targets and options
يُبلّغ make print-deps عن سلسلة الأدوات المطلوبة، والمكتبتين الاختياريتين
(pthread، zlib) مع نتيجة الكشف التلقائي للمترجم الحالي، واستثناءات
أعلام الترجمة/الربط لكل مكوّن — ما يكفي لملء ملف التحكم في حزمة توزيعة دون
قراءة منطق الفحص في Makefile.
يشغّل make installcheck ملف bin/kasld المثبَّت ويؤكد أنه يكتشف مكوّناته
عبر مسار FHS ../libexec/kasld — اختبار دخان بعد التثبيت لتخطيط التثبيت
المقسّم، باستخدام نفس PREFIX/DESTDIR الخاص بـ make install (لذا يعمل
أيضًا مقابل جذر تجهيز DESTDIR في تكامل الحزم المستمر).
يثبّت make install أيضًا صفحات دليل man1 الخاصة بـ kasld وksymoff
إلى <prefix>/share/man/man1/، لذا يعمل man kasld وman ksymoff بعد
التثبيت.
يمكن ترجمة KASLD ترجمة متقاطعة باستخدام make بتحديد المترجم المناسب
(CC). يُطبَّق الربط الساكن تلقائيًا عند الترجمة المتقاطعة:
make CC=aarch64-linux-musl-gcc
بناء جميع أهداف الترجمة المتقاطعة المدعومة (يجب أن تكون سلاسل الأدوات في
PATH):
make cross
الترخيص
KASLD مرخّص بموجب MIT (انظر LICENSE). بعض مكوّنات التسريب تكيّف كود إثبات مفهوم من طرف ثالث أو تنفّذ تقنية نُشرت أولًا من قبل آخرين؛ كل ملف من هذا القبيل ينسب مؤلفه ومصدره الأصلي في ترويسته، ويسرد THIRD-PARTY-NOTICES.md كل واحد منها مع ترخيصه أو أساس إعادة استخدامه (ترخيص المنبع، إذن المؤلف، أو مادة تقنية/إعادة إنتاج أُعيد تنفيذها هنا).
الاستشهاد بـ KASLD
KASLD مرخّص بموجب MIT — الإسناد غير مطلوب للاستخدام، لكن الاستشهاد أو الرابط موضع تقدير أينما أُشير إليه في البحث أو الأدوات أو الاستغلالات أو الكتابة:
KASLD: Kernel Address Space Layout Derandomization, Brendan Coles, https://github.com/bcoles/kasld
BibTeX:
@software{kasld,
title = {KASLD: Kernel Address Space Layout Derandomization},
author = {Coles, Brendan},
url = {https://github.com/bcoles/kasld},
version = {0.3.0},
year = {2026}
}
يعرض GitHub أيضًا زر "Cite this repository" من
CITATION.cff. لبناء غير مُصدَر من master، استشهد بالالتزام
المحدد والتاريخ الذي تم الوصول فيه — مثل bcoles/kasld@<commit>
(accessed YYYY-MM-DD) — لأن سلاسل إصدار -dev ليست فريدة لالتزام واحد.