
عروض توضيحية لإثبات المفهوم ومكتبة libkdump توضح هجوم Meltdown المعماري الدقيق، مما يؤدي إلى تسريب ذاكرة النواة والذاكرة الفيزيائية على معالجات Intel المعرضة للخطر.
يحتوي هذا المستودع على عدة تطبيقات توضح خلل Meltdown. للحصول على معلومات تقنية حول الخلل، راجع الورقة البحثية:
تم بناء التطبيقات في هذا المستودع باستخدام libkdump، وهي مكتبة طورناها من أجل الورقة البحثية. تبسّط هذه المكتبة استغلال الخلل من خلال التكيّف تلقائيًا مع خصائص معينة للبيئة.
يحتوي هذا المستودع على عدة مقاطع فيديو توضح Meltdown
يحتوي هذا المستودع على خمسة عروض توضيحية لاستعراض حالات استخدام مختلفة. تم اختبار جميع العروض التوضيحية على Ubuntu 16.04 مع معالج Intel Core i7-6700K، لكن يجب أن تعمل على أي نظام Linux مع أي معالج Intel حديث منذ عام 2010.
للحصول على أفضل النتائج، نوصي بمعالج سريع يدعم Intel TSX (مثل أي Intel Core i7-5xxx أو i7-6xxx أو i7-7xxx). علاوة على ذلك، يجب تثبيت كل عرض توضيحي على نواة معالج واحدة، على سبيل المثال باستخدام taskset.
كشرط مسبق، تحتاج إلى تثبيت glibc-static على جهازك.
للأنظمة القائمة على RPM:
sudo yum install -y glibc-static
test)هذا هو العرض التوضيحي الأكثر أساسية. يستخدم Meltdown لقراءة عناوين يمكن الوصول إليها من مساحة العنوان الخاصة به، دون كسر أي آليات عزل.
إذا لم يعمل هذا العرض التوضيحي معك، فمن المرجح ألا تعمل العروض التوضيحية المتبقية أيضًا. الأسباب متعددة، على سبيل المثال، قد يكون المعالج بطيئًا جدًا، أو لا يدعم التنفيذ خارج الترتيب، أو أن المؤقت عالي الدقة ليس دقيقًا بما فيه الكفاية (خاصة في الأجهزة الافتراضية)، أو أن نظام التشغيل لا يدعم معالجات الإشارات المخصصة، إلخ.
make
taskset 0x1 ./test
إذا رأيت مخرجات مشابهة لهذه
Expect: Welcome to the wonderful world of microarchitectural attacks
Got: Welcome to the wonderful world of microarchitectural attacks
فإن العرض التوضيحي الأساسي يعمل.
kaslr)بدءًا من نواة Linux 4.12، يكون KASLR (عشوائية تخطيط مساحة عنوان النواة) نشطًا افتراضيًا. وهذا يعني أن موقع النواة (وأيضًا الخريطة الفيزيائية المباشرة التي تعيّن كامل الذاكرة الفيزيائية) يتغير مع كل إعادة تشغيل.
يستخدم هذا العرض التوضيحي Meltdown لتسريب العشوائية (السرية) للخريطة الفيزيائية المباشرة. يتطلب هذا العرض التوضيحي صلاحيات الجذر لتسريع العملية. تصف الورقة البحثية نسخة لا تتطلب صلاحيات الجذر.
make
sudo taskset 0x1 ./kaslr
بعد بضع ثوانٍ، يجب أن ترى شيئًا مشابهًا لهذا
[+] Direct physical map offset: 0xffff880000000000
reliability)يختبر هذا العرض التوضيحي مدى موثوقية قراءة الذاكرة الفيزيائية. بالنسبة لهذا العرض التوضيحي، تحتاج إما إلى إزاحة الخريطة الفيزيائية المباشرة (مثل من العرض التوضيحي رقم 2) أو يجب عليك تعطيل KASLR بتحديد nokaslr في سطر أوامر النواة.
قم ببناء وتشغيل reliability. إذا كان KASLR مفعّلًا، فإن المعامل الأول هو إزاحة الخريطة الفيزيائية المباشرة. وإلا، لا يتطلب البرنامج أي معامل.
make
sudo taskset 0x1 ./reliability 0xffff880000000000
بعد بضع ثوانٍ، يجب أن تحصل على مخرجات مشابهة لهذه:
[-] Success rate: 99.93% (read 1354 values)
physical_reader)يقرأ هذا العرض التوضيحي الذاكرة من عملية مختلفة عبر قراءة الذاكرة الفيزيائية مباشرة. بالنسبة لهذا العرض التوضيحي، تحتاج إما إلى إزاحة الخريطة الفيزيائية المباشرة (مثل من العرض التوضيحي رقم 2) أو يجب عليك تعطيل KASLR بتحديد nokaslr في سطر أوامر النواة.
من حيث المبدأ، يمكن لهذا البرنامج قراءة عناوين فيزيائية عشوائية. ومع ذلك، نظرًا لأن الذاكرة الفيزيائية تحتوي على الكثير من البيانات غير القابلة للقراءة البشرية، نوفر أداة اختبار (secret)، تضع سلسلة قابلة للقراءة البشرية في الذاكرة وتوفر مباشرة العنوان الفيزيائي لهذه السلسلة.
بالنسبة للعرض التوضيحي، شغّل أولًا secret (كجذر) للحصول على العنوان الفيزيائي لسلسلة قابلة للقراءة البشرية:
make
sudo ./secret
يجب أن يُخرج شيئًا مثل هذا:
[+] Secret: If you can read this, this is really bad
[+] Physical address of secret: 0x390fff400
[+] Exit with Ctrl+C if you are done reading the secret
أثناء تشغيل برنامج secret، ابدأ physical_reader. المعامل الأول هو العنوان الفيزيائي الذي طبعه secret. إذا لم يكن KASLR معطّلًا لديك، فالمعامل الثاني هو إزاحة الخريطة الفيزيائية المباشرة.
taskset 0x1 ./physical_reader 0x390fff400 0xffff880000000000
بعد بضع ثوانٍ، يجب أن تحصل على مخرجات مشابهة لهذه:
[+] Physical address : 0x390fff400
[+] Physical offset : 0xffff880000000000
[+] Reading virtual address: 0xffff880390fff400
If you can read this, this is really bad
memdump)يقوم هذا العرض التوضيحي بتفريغ محتوى الذاكرة. مثل العرضين رقم 3 ورقم 4، يستخدم الخريطة الفيزيائية المباشرة، لتفريغ محتويات الذاكرة الفيزيائية بصيغة مشابهة لـ hexdump.
مرة أخرى، نظرًا لأن الذاكرة الفيزيائية تحتوي على الكثير من المحتوى غير القابل للقراءة البشرية، نوفر أداة اختبار لملء كميات كبيرة من الذاكرة الفيزيائية بسلاسل قابلة للقراءة البشرية.
بالنسبة للعرض التوضيحي، شغّل أولًا memory_filler لملء الذاكرة بسلاسل قابلة للقراءة البشرية. المعامل الأول هو مقدار الذاكرة (بالجيجابايت) المراد ملؤها.
make
./memory_filler 9
ثم، شغّل أداة memdump لتفريغ محتويات الذاكرة. إذا كنت قد شغّلت memory_filler من قبل، فيجب أن ترى بعض أجزاء السلاسل.
إذا كان لديك Firefox أو Chrome مع عدة علامات تبويب مفتوحة، فقد ترى أيضًا أجزاء من المواقع المفتوحة أو التي أُغلقت مؤخرًا.
المعامل الأول هو العنوان الفيزيائي الذي يجب أن يبدأ عنده التفريغ (اتركه فارغًا للبدء من الجيجابايت الأول). المعامل الثاني هو عدد البايتات التي تريد قراءتها، لقراءتها كلها أعطِ -1. إذا لم يكن KASLR معطّلًا لديك، فالمعامل الثالث هو إزاحة الخريطة الفيزيائية المباشرة.
taskset 0x1 ./memdump 0x240000000 -1 0xffff880000000000 # start at 9 GB
يجب أن تحصل على hexdump لأجزاء من الذاكرة (قد يحتوي حتى على أسرار مثل كلمات المرور، انظر المثال في الورقة البحثية)، على سبيل المثال:
240001c9f: | 00 6d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | .m.............. |
24000262f: | 00 7d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | .}.............. |
24000271f: | 00 00 00 00 00 00 00 00 00 00 00 00 65 6e 20 75 | ............en u |
24000272f: | 73 65 72 20 73 70 61 63 65 20 61 6e 64 20 6b 65 | ser space and ke |
24000273f: | 72 6e 65 6c 57 65 6c 63 6f 6d 65 20 74 6f 20 74 | rnelWelcome to t |
24000298f: | 00 61 72 79 20 62 65 74 77 65 65 6e 20 75 73 65 | .ary between use |
24000299f: | 72 20 73 70 61 63 65 20 61 6e 64 20 6b 65 72 6e | r space and kern |
2400029af: | 65 6c 42 75 72 6e 20 61 66 74 65 72 20 72 65 61 | elBurn after rea |
2400029bf: | 64 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 | ding this string |
240002dcf: | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c8 | ................ |
2400038af: | 6a 75 73 74 20 73 70 69 65 64 20 6f 6e 20 61 00 | just spied on a. |
240003c8f: | 00 00 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ |
24000412f: | 00 00 00 00 00 00 00 00 00 00 00 00 65 74 73 2e | ............ets. |
24000413f: | 2e 2e 57 65 6c 63 6f 6d 65 20 74 6f 20 74 68 65 | ..Welcome to the |
2400042ff: | 00 00 00 00 00 00 00 00 00 6e 67 72 61 74 75 6c | .........ngratul |
24000430f: | 61 74 69 6f 6e 73 2c 20 79 6f 75 20 6a 75 73 74 | ations, you just |
24000431f: | 20 73 70 69 65 64 20 6f 6e 20 61 6e 20 61 70 70 | spied on an app |
هل يعمل على Windows / Ubuntu on Windows (WSL) / Mac OS؟
لا. يعمل هذا الإثبات فقط على Linux، لأنه يستخدم خصائص خاصة بنواة Linux، مثل الخريطة الفيزيائية المباشرة.
هل يمكنني تشغيل الإثبات في جهاز افتراضي؟
نعم، يعمل الإثبات أيضًا على الأجهزة الافتراضية. ومع ذلك، نظرًا للطبقة الإضافية التي يقدمها الجهاز الافتراضي، قد لا يعمل بشكل جيد كما هو الحال على الأجهزة الأصلية.
برنامج KASLR (kaslr) لا يجد الإزاحة!
أداة kaslr تقوم فقط بعدد قليل جدًا من القياسات لتكون سريعة. إذا لم تجد الإزاحة، فهناك احتمالان:
kaslr.c: config.retries = 1000;kaslr_offset لقراءة الإزاحة مباشرة من النواة. ثبّت ترويسات النواة الخاصة بنواتك (sudo apt-get install linux-headers-`uname -r` ) وشغّل sudo ./direct_physical_map.shقلت إنه يعمل على الذاكرة غير المخزّنة مؤقتًا، لكن جميع عروضك التوضيحية تضمن تخزين الذاكرة مؤقتًا!
جعله يعمل على الذاكرة غير المخزّنة مؤقتًا أكثر تعقيدًا، وغالبًا ما يتطلب بعض التعديل على المعاملات. لذلك، نضمن تخزين الذاكرة مؤقتًا في الإثبات لتسهيل إعادة الإنتاج. ومع ذلك، يمكنك ببساطة إزالة الكود الذي يخزّن القيم مؤقتًا واستبداله بـ clflush لاختبار الاستغلال على الذاكرة غير المخزّنة مؤقتًا (انظر الفيديو رقم 5 للحصول على مثال).
على الرغم من عدم ذكره في منشور المدونة الأصلي من Google، فقد تم تأكيد ذلك أيضًا من قبل باحثين مستقلين (مثل ، ، ).
تحذير رقم 1: نحن نوفر هذا الكود كما هو. أنت مسؤول عن حماية نفسك وممتلكاتك وبياناتك والآخرين من أي مخاطر تسببها هذه الشيفرة. قد تتسبب هذه الشيفرة في سلوك غير متوقع وغير مرغوب فيه على جهازك. قد لا تكتشف هذه الشيفرة الثغرة على جهازك.
تحذير رقم 2: إذا وجدت أن جهاز كمبيوتر عرضة لخلل Meltdown، فقد ترغب في تجنب استخدامه كنظام متعدد المستخدمين. ينتهك Meltdown حماية الذاكرة الخاصة بالمعالج. على جهاز عرضة لخلل Meltdown، يمكن لعملية واحدة قراءة جميع الصفحات المستخدمة من قبل العمليات الأخرى أو من قبل النواة.
تحذير رقم 3: هذه الشيفرة لأغراض الاختبار فقط. لا تشغّلها على أي أنظمة إنتاجية. لا تشغّلها على أي نظام قد يستخدمه شخص أو كيان آخر.
إنه لا يعمل فقط على جهاز الكمبيوتر الخاص بي، ماذا يمكنني أن أفعل؟
يمكن أن يكون هناك الكثير من الأسباب المختلفة لذلك. جمعنا بعض الأشياء التي يمكنك تجربتها:
libkdump/libkdump.c في السطر #define MELTDOWN meltdown_nonull. جرّب على سبيل المثال meltdown بدلًا من meltdown_nonull، والذي يعمل بشكل أفضل بكثير على بعض الأجهزة (ولكن ليس على الإطلاق على أجهزة أخرى).stress مع stress -i 2 (أو قيم أخرى للمعامل i، اعتمادًا على عدد النوى).