
برنامج تشغيل نواة لينكس لاقتناء الذاكرة الفعلية، يتيح الوصول للقراءة إلى أي عنوان فعلي بما في ذلك الذاكرة المحجوزة وثغرات الذاكرة، مع معلومات CR3 وخدمات الترجمة من الظاهري إلى الفعلي.

مثل نظيرتها في ويندوز، Winpmem، هذه الأداة ليست أداة تفريغ ذاكرة تقليدية. توفر Linpmem واجهة برمجة تطبيقات للقراءة من أي عنوان فعلي، بما في ذلك الذاكرة المحجوزة وثغرات الذاكرة، ولكن يمكن استخدامها أيضًا لتفريغ الذاكرة العادي. علاوة على ذلك، يوفر المشغل (driver) مجموعة متنوعة من أوضاع الوصول لقراءة الذاكرة الفعلية، مثل byte و word و dword و qword و buffer access mode، حيث يكون وضع الوصول العازلي مناسبًا في معظم الحالات القياسية. إذا كانت القراءة تتطلب قراءة محاذاة للبايت/الكلمة/الكلمة المزدوجة/الكلمة الرباعية، فإن Linpmem ستفعل ذلك بدقة.
حاليًا، تتضمن ميزات Linpmem:
سيتم إضافة التحكم في الذاكرة المخبأة (Cache Control) في المستقبل لدعم أوضاع القراءة المتخصصة.
على الأقل في الوقت الحالي، يجب عليك ترجمة مشغل Linpmem بنفسك. طريقة لتحميل مشغل Linpmem مُجمَّع مسبقًا على أنظمة لينكس الأخرى قيد العمل حاليًا، ولكنها لم تُكتمل بعد. ومع ذلك، فإن ترجمة مشغل Linpmem ليست صعبة، فهي ببساطة تنفيذ الأمر 'make'.
أنت بحاجة إلى make ومُترجم لغة C. (نوصي باستخدام gcc، لكن clang يجب أن يعمل أيضًا).
تأكد من تثبيت حزمة linux-headers (باستخدام أي مدير حزم لتوزيعة لينكس المستهدفة). قد يختلف اسم الحزمة الدقيق حسب توزيعتك. طريقة سريعة (مستقلة عن التوزيعة) للتحقق مما إذا كانت الحزمة مثبتة:
ls -l /usr/lib/modules/`uname -r`/
هذا كل شيء، يمكنك المتابعة إلى الخطوة 2.
نظام خارجي: حاليًا، إذا كنت ترغب في ترجمة المشغل لـ نظام آخر، على سبيل المثال، لأنك تريد إنشاء تفريغ ذاكرة ولكن لا يمكنك الترجمة على النظام المستهدف، يجب عليك تنزيل حزمة الرأس مباشرة من مستودعات الحزم الخاصة بتوزيعة لينكس لذلك النظام. تحقق جيدًا من أن إصدار الحزمة يطابق تمامًا الإصدار وإصدار النواة العاملين على النظام الخارجي. في حالة استخدام النظام الآخر لنواة مُجمَّعة ذاتيًا، يجب عليك الحصول على نسخة من دليل بناء تلك النواة. ثم، ضع مسار أي من الدليلين في متغير البيئة KDIR.
export KDIR=path/to/extracted/header/package/or/kernel/root
ترجمة المشغل بسيطة، فقط اكتب:
make
يجب أن ينتج عن ذلك ملف linpmem.ko في دليل العمل الحالي.
قد ترغب في مراجعة ملف precompiler.h مسبقًا واختيار ما إذا كنت تريد الترجمة للإصدار النهائي أو للتصحيح (على سبيل المثال، مع طباعة التصحيح). لا توجد الكثير من إعدادات المعالج المسبق الأخرى الآن.
يمكن تحميل الوحدة النمطية linpmem.ko باستخدام الأمر insmod path-to-linpmem.ko، وإلغاء تحميلها باستخدام rmmod path-to-linpmem.ko. (سيؤدي هذا إلى تحميل المشغل فقط لفترة تشغيل هذه الجلسة.) إذا قمت بالترجمة للتصحيح، فاطلع أيضًا على سجل dmesg.
بعد التحميل، للتحدث مع المشغل، تحتاج إلى إنشاء الجهاز:
mknod /dev/linpmem c 42 0
إذا لم تتمكن من التحدث مع المشغل، فتحقق من سجل dmesg للتأكد من أن '42' هو بالفعل الرقم الرئيسي المسجل:
[12827.900168] linpmem: registered chrdev with major 42
على الرغم من أن النواة عادةً ما تحاول تعيين هذا الرقم بالفعل.
يمكنك استخدام الأمر chown على الجهاز لمنحه لمستخدمك، إذا كنت لا تريد أن تترك وحدة تحكم الجذر مفتوحة طوال الوقت. (أو استمر في استخدامها في وحدة تحكم الجذر.)
يوجد كود مثال يوضح ويشرح (بالتفصيل) كيفية التفاعل مع المشغل. يمكن العثور على مرجع واجهة برمجة التطبيقات في مساحة المستخدم أيضًا في ملف ./userspace_interface/linpmem_shared.h.
هذا الكود مهم، إذا كنت تريد فهم كيفية التفاعل المباشر مع المشغل بدلاً من استخدام مكتبة. يمكن استخدامه أيضًا كاختبار وظيفي قصير.
توجد أداة واجهة سطر أوامر أساسية (اختيارية) لـ Linpmem، وهي أداة pmem CLI. يمكن العثور عليها هنا: https://github.com/vobst/linpmem-cli. بجانب الكود المصدري، هناك أيضًا أداة CLI مُجمَّعة مسبقًا بالإضافة إلى المكتبة الثابتة المُجمَّعة مسبقًا وملفات الرأس التي يمكن العثور عليها هنا (موقعة). ملاحظة: هذا إصدار أولي، تأكد من التحقق من وجود تحديثات، حيث ستتبع العديد من الإضافات والتحسينات قريبًا.
يمكن استخدام أداة pmem CLI لاختبار الوظائف المختلفة لـ Linpmem بطريقة (آمنة نسبيًا) ومريحة. يمكن أيضًا تحميل Linpmem باستخدام هذه الأداة بدلاً من استخدام insmod/rmmod، مع بعض الخيارات الإضافية في المستقبل. وهذا له أيضًا ميزة أن pmem يقوم تلقائيًا بإنشاء الجهاز المناسب لك للاستخدام الفوري. إنها محمولة للغاية وتعمل على أي نظام لينكس (وفي الواقع، تم اختبارها حتى على نظام لينكس 2.6).
$ ./pmem -h
Command-line client for the linpmem driver
Usage: pmem [OPTIONS] [COMMAND]
Commands:
insmod Load the linpmem driver
help Print this message or the help of the given subcommand(s)
Options:
-a, --address <ADDRESS> Address for physical read operations
-v, --virt-address <VIRT_ADDRESS> Translate address in target process' address space (default: current process)
-s, --size <SIZE> Size of buffer read operations
-m, --mode <MODE> Access mode for read operations [possible values: byte, word, dword, qword, buffer]
-p, --pid <PID> Target process for cr3 info and virtual-to-physical translations
--cr3 Query cr3 value of target process (default: current process)
--verbose Display debug output
-h, --help Print help (see more with '--help')
-V, --version Print version
إذا كنت تريد ترجمة أداة cli بنفسك، انتقل إلى دليلها واتبع التعليمات في ملف Readme (لـ cli) لبناءها. وإلا، فما عليك سوى تنزيل البرنامج المُجمَّع مسبقًا، ويجب أن يعمل على أي نظام لينكس. لتحميل مشغل النواة باستخدام أداة cli:
# pmem insmod path/to/linpmem.ko
ميزة استخدام أداة pmem لتحميل المشغل هي أنك لا تحتاج إلى إنشاء ملف الجهاز بنفسك، وستوفر (في الإصدارات القادمة) خيار اختيار من يملك جهاز linpmem.
واجهة سطر أوامر pmem هي مجرد غلاف رفيع حول مكتبة Rust صغيرة تعرض واجهة برمجة تطبيقات للتواصل مع المشغل. يمكن للمستخدمين المتقدمين أيضًا استخدام هذه المكتبة. يتم تجميع المكتبة تلقائيًا (كمكتبة محمولة ثابتة) جنبًا إلى جنب مع أداة pmem cli عند الترجمة من https://github.com/vobst/linpmem-cli، ولكنها أيضًا مضمنة (مُجمَّعة مسبقًا) هنا (موقعة). ملاحظة: هذا إصدار أولي، المزيد قريبًا.
إذا كنت لا تريد استخدام مكتبة وضع المستخدم وتفضل التفاعل مع المشغل مباشرة بنفسك، يمكنك العثور على واجهة برمجة التطبيقات/الواجهة الخاصة به في مساحة المستخدم والتوثيق في ملف ./userspace_interface/linpmem_shared.h. نقدم أيضًا كود مثال في demo/test.c يشرح كيفية استخدام المشغل مباشرة.
LinPyMem: غلاف بلغة بايثون لمشغل linpmem. متاح على PyPI.
لم تُنفذ بعد.
إذا أبلغ النظام عن رسالة الخطأ التالية عند تحميل الوحدة، فقد يكون ذلك بسبب الإقلاع الآمن:
$ sudo insmod linpmem.ko
insmod: ERROR: could not insert module linpmem.ko: Operation not permitted
هناك طرق مختلفة لتحميل الوحدة على الرغم من ذلك. الطريقة الواضحة هي تعطيل الإقلاع الآمن في إعدادات UEFI الخاصة بك.
إذا كانت توزيعتك تدعم ذلك، فإن الحل الأكثر أناقة هو توقيع الوحدة قبل استخدامها. يمكن القيام بذلك باستخدام الخطوات التالية (تم اختبارها على Ubuntu 20.04).
$ sudo apt install mokutil
$ openssl req -new -newkey rsa:4096 -keyout mok-signing.key -out mok-signing.crt -outform DER -days 365 -nodes -subj "/CN=Some descriptive name/"
$ sudo mokutil --import mok-signing.crt
$ /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 path/to/mok-singing/MOK.key path/to//MOK.cert path/to/linpmem.ko
بعد ذلك، يجب أن تكون قادرًا على تحميل الوحدة.
لاحظ أنه من منظور الجاهزية الجنائية، يجب عليك تحضير وحدة موقعة قبل أن تحتاج إليها، حيث سيعيد النظام التشغيل مرتين أثناء العملية الموصوفة أعلاه، مما يؤدي إلى تدمير معظم بياناتك المتطايرة في الذاكرة.
(يُرجى الإبلاغ عن المشكلات المحتملة إذا واجهت أي شيء.)
Linpmem، وكذلك Winpmem، لما كانت موجودة بدون عمل أسلافنا من مشروع REKALL (الذي تم إيقافه الآن): https://github.com/google/rekall.
مساهمونا مفتوحو المصدر: