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


بشكل عام، يتخذ منتج الأمان إجراءً عند إنشاء العملية عن طريق تسجيل رد اتصال في نواة Windows (PsSetCreateProcessNotifyRoutineEx). في هذه المرحلة، قد يقوم منتج الأمان بفحص الملف الذي تم استخدامه لتعيين الملف التنفيذي وتحديد ما إذا كان ينبغي السماح بتنفيذ هذه العملية. يتم استدعاء رد الاتصال هذا في النواة عند إدراج الخيط الأولي، وليس عند إنشاء كائن العملية.
بسبب ذلك، يمكن للمهاجم إنشاء عملية وتعيينها، ثم تعديل محتوى الملف، ثم إنشاء الخيط الأولي. المنتج الذي يقوم بالفحص عند رد اتصال الإنشاء سيرى المحتوى المعدل. بالإضافة إلى ذلك، تستخدم بعض المنتجات نهج المسح عند الكتابة والذي يتكون من مراقبة عمليات كتابة الملفات. أحد التحسينات المألوفة هنا هو تسجيل أن الملف قد تمت كتابته وتأجيل الفحص الفعلي حتى حدوث IRP_MJ_CLEANUP (مثل إغلاق مقبض الملف). وبالتالي، فإن المهاجم الذي يستخدم سير عمل write -> map -> modify -> execute -> close سيتجاوز المسح عند الكتابة الذي يعتمد فقط على الفحص عند IRP_MJ_CLEANUP.
لإساءة استخدام هذه الاتفاقية، نقوم أولاً بكتابة ملف ثنائي إلى ملف هدف على القرص. ثم نقوم بتعيين صورة للملف الهدف وتوفيرها لنظام التشغيل لاستخدامها في إنشاء العملية. يقوم نظام التشغيل بلطف بتعيين الملف الثنائي الأصلي لنا. باستخدام مقبض الملف الموجود، وقبل إنشاء الخيط الأولي، نقوم بتعديل محتوى الملف الهدف لإخفاء أو تزوير الملف الذي يدعم الصورة. بعد ذلك بقليل، نقوم بإنشاء الخيط الأولي لبدء تنفيذ الملف الثنائي الأصلي. أخيرًا، سنقوم بإغلاق مقبض الملف الهدف. دعنا نستعرض هذه الخطوات خطوة بخطوة:
NtCreateProcessEx).NtCreateThreadEx).
@startuml
hide empty description
[*] --> CreateFile
CreateFile --> FileHandle
FileHandle --> Write
FileHandle --> NtCreateSection
Write -[hidden]-> NtCreateSection
NtCreateSection --> SectionHandle
SectionHandle --> NtCreateProcessEx
FileHandle --> Modify
NtCreateProcessEx -[hidden]-> Modify
NtCreateProcessEx --> NtCreateThreadEx
Modify -[hidden]-> NtCreateThreadEx
NtCreateThreadEx --> [*]
FileHandle --> CloseFile
NtCreateThreadEx -[hidden]-> CloseFile
NtCreateThreadEx --> PspCallProcessNotifyRoutines
PspCallProcessNotifyRoutines -[hidden]-> [*]
CloseFile --> IRP_MJ_CLEANUP
IRP_MJ_CLEANUP -[hidden]-> [*]
PspCallProcessNotifyRoutines --> Inspect
PspCallProcessNotifyRoutines -[hidden]-> CloseFile
IRP_MJ_CLEANUP --> Inspect
Inspect -[hidden]-> [*]
CreateFile : Create target file, keep handle open.
Write : Write source payload into target file.
Modify : Obscure the file on disk.
NtCreateSection : Create section using file handle.
NtCreateProcessEx : Image section for process is mapped and cached in file object.
NtCreateThreadEx : The cached section is used.
NtCreateThreadEx : Process notify routines fire in kernel.
Inspect : The contents on disk do not match what was executed.
Inspect : Inspection of the file at this point will result in incorrect attribution.
@enduml
سترى في العرض التوضيحي أدناه، يتم استخدام CMD.exe كهدف للتنفيذ. التشغيل الأول يستبدل البايتات على القرص بنمط. التشغيل الثاني يستبدل CMD.exe بـ ProcessHacker.exe. أداة Herpaderping تقوم بتصحيح الثنائي ليجعله مشابهًا قدر الإمكان لـ ProcessHacker.exe، حتى مع الاحتفاظ بالتوقيع الأصلي. لاحظ عمليات التنفيذ المتعددة لنفس الثنائي وكيف تبدو العملية للمستخدم مقارنة بما هو موجود في الملف على القرص.


لاحظنا السلوك وقد يكون بعض هذا مفاجئًا. دعنا نحاول شرح هذا السلوك.
عند تصميم منتجات لتأمين منصات Windows، وقع العديد من المهندسين في هذا المجال (بما فيهم أنا) في مفاهيم مسبقة حول كيفية تعامل نظام التشغيل مع البيانات. في هذا السيناريو، قد يتوقع البعض أن الملف على القرص سيظل "مقفلاً" عند إنشاء العملية. لا يمكنك حذف الملف. لا يمكنك الكتابة إليه. ولكن يمكنك إعادة تسميته. كما نرى هنا، في ظل الظروف المناسبة، يمكنك بالفعل الكتابة إليه. كن يقظًا بشأن افتراضاتك، دائمًا اسأل عنها، وقم ببحثك.
الدافع لهذا البحث جاء عند اكتشاف كيفية إجراء التحليل عند كتابة ملف. مع خلفية سابقة في البحث عن Process Hollowing و Doppelganging، افترضت أن هذا قد يكون ممكنًا. الهدف هو توفير أمان أفضل. لا يمكنك صنع قفل أفضل دون فهم كيفية كسر القديم أولاً.
Herpaderping تشبه Hollowing و Doppelganging ولكن هناك بعض الاختلافات الرئيسية:
Process Hollowing تتضمن تعديل القسم المعين قبل بدء التنفيذ، والتي تبدو بشكل مجرد: map -> modify section -> execute. هذا السير العمل يؤدي إلى انحراف تدفق التنفيذ المقصود للعملية المجوفة إلى كود غير مقصود. قد يعتبر Doppelganging شكلاً من Hollowing. ومع ذلك، فإن Hollowing، في رأيي، أقرب إلى الحقن حيث أن Hollowing عادة ما يتضمن كتابة صريحة إلى الكود المعين بالفعل. هذا يختلف عن Herpaderping حيث لا توجد أقسام معدلة.
Process Doppelganging أقرب إلى Herpaderping. Doppelganging تسيء استخدام عمليات الملفات المعاملية (transacted file operations) وتتضمن عمومًا هذه الخطوات:
transact -> write -> map -> rollback -> execute.
في هذا السير العمل، سيقوم نظام التشغيل بإنشاء قسم الصورة وحساب المعاملات، لذا ينتهي قسم الصورة المخبأ ليكون ما كتبته إلى المعاملة. قامت Microsoft بتصحيح هذه التقنية. حسنًا، قاموا بتصحيح الانهيار الذي تسببت فيه. ربما يعتبرون هذا استخدامًا "قانونيًا" للمعاملة. لحسن الحظ، يكتشف Windows Defender تقنية Doppelganging. تختلف Doppelganging عن Herpaderping في أن Herpaderping لا تعتمد على عمليات الملفات المعاملية. و Defender لا يكتشف Herpaderping.
للإشارة، التقنيات المعممة:
| النوع | التقنية |
|---|---|
| Hollowing | map -> modify section -> execute |
| Doppelganging | transact -> write -> map -> rollback -> execute |
| Herpaderping | write -> map -> modify -> execute -> close |
يمكننا رؤية الاختلافات موضحة هنا. بينما يمكن القول أن Herpaderping أكثر ضوضاءً من Doppelganging، حيث أن البتات الضارة تصل إلى القرص، فقد رأينا أن منتجات الأمان لا تزال غير قادرة على اكتشاف Herpaderping.
ليس هناك إصلاح واضح هنا. يبدو معقولاً أن منع تعيين/تخزين قسم صورة عندما يكون هناك وصول كتابة إلى الملف يجب أن يسد الثغرة. ومع ذلك، قد لا يكون ذلك حلاً عملياً.
خيار آخر قد يكون إزالة التغييرات إلى الملف من خلال قسم الصورة المخبأ إذا لم يتم تعيينه في عملية بعد. ولكن بما أن التعيين في العملية الجديدة يحدث عند NtCreateProcess، ربما ليس هذا حلاً قابلاً للتطبيق.
من وجهة نظر الكشف، ليس هناك طريقة رائعة لتحديد البتات الفعلية التي تم تعيينها، الفحص عند IRP_MJ_CLEANUP أو رد اتصال مسجل في PsSetCreateProcessNotifyRoutineEx يؤدي إلى إسناد غير صحيح لأن البتات على القرص قد تغيرت، سيتعين عليك إعادة بناء الملف من القسم الذي تم إنشاؤه. يجدر الإشارة هنا إلى وجود رد اتصال جديد في Windows 10 يمكنك التسجيل له: PsSetCreateProcessNotifyRoutineEx2 لكن هذا يعاني من نفس مشكلة رد الاتصال السابق، يتم استدعاؤه عند تنفيذ الخيط الأولي، وليس عند إنشاء كائن العملية. أضافت Microsoft PsSetCreateThreadNotifyRoutineEx الذي يتم استدعاؤه عند إدراج الخيط الأولي إذا تم التسجيل باستخدام PsCreateThreadNotifyNonSystem، على عكس عندما يكون على وشك بدء التنفيذ (كما كان رد الاتصال القديم). تمديد PSCREATEPROCESSNOTIFYTYPE ليتم استدعاؤه عند إنشاء كائن العملية لن يساعد أيضًا، لقد رأينا في قسم الغوص أعمق أن كائن قسم الصورة يتم تخزينه مؤقتًا عند استدعاء NtCreateSection وليس NtCreateProcess.
لا يمكننا بسهولة تحديد ما تم تنفيذه. نبقى مع محاولة اكتشاف السلوك الاستغلالي من قبل المهاجم، سأترك اكتشاف مؤشرات السلوك كتمرين للقارئ.
فيما يلي قائمة بالمنتجات وأنظمة Windows التي تم اختبارها حتى (8/31/2020). تم إجراء الاختبارات باستخدام ملف ثنائي ضار معروف.
تم الإفصاح عن هذه الثغرة الأمنية إلى مركز استجابة أمان Microsoft (MSRC) في 7/17/2020 وتم فتح حالة من قبل MSRC في 7/22/2020. اختتم MSRC تحقيقه في 8/25/2020 وقرر أن النتائج صالحة ولكنها لا تلبي معاييرهم للصيانة الفورية. في هذا الوقت، تم إغلاق حالتهم دون حل، وتم وضع علامة للمراجعة المستقبلية، دون جدول زمني.
نحن نختلف في شدة هذا الخلل؛ تم إبلاغ MSRC بهذا في 8/27/2020.
يحتوي هذا المستودع على أداة لممارسة طريقة Herpaderping لإخفاء العملية. الاستخدام كما يلي:
Process Herpaderping Tool - Copyright (c) Johnny Shaw
ProcessHerpaderping.exe SourceFile TargetFile [ReplacedWith] [Options...]
Usage:
SourceFile Source file to execute.
TargetFile Target file to execute the source from.
ReplacedWith File to replace the target with. Optional,
default overwrites the binary with a pattern.
-h,--help Prints tool usage.
-d,--do-not-wait Does not wait for spawned process to exit,
default waits.
-l,--logging-mask number Specifies the logging mask, defaults to full
logging.
0x1 Successes
0x2 Informational
0x4 Warnings
0x8 Errors
0x10 Contextual
-q,--quiet Runs quietly, overrides logging mask, no title.
-r,--random-obfuscation Uses random bytes rather than a pattern for
file obfuscation.
-e,--exclusive Target file is created with exclusive access and
the handle is held open as long as possible.
Without this option the handle has full share
access and is closed as soon as possible.
-u,--do-not-flush-file Does not flush file after overwrite.
-c,--close-file-early Closes file before thread creation (before the
process notify callback fires in the kernel).
Not valid with "--exclusive" option.
-k,--kill Terminates the spawned process regardless of
success or failure, this is useful in some
automation environments. Forces "--do-not-wait
option.
يستخدم المستودع وحدات فرعية (submodules)، بعد الاستنساخ تأكد من تهيئة وتحديث الوحدات الفرعية. تستهدف ملفات المشروع Visual Studio 2019.
git clone https://github.com/jxy-s/herpaderping.git
cd .\herpaderping\
git submodule update --init --recursive
MSBuild .\herpaderping.sln
تم استخدام ما يلي دون تعديل. الاعتمادات لمؤلفيها.
| نظام التشغيل | الإصدار | معرض للخطر |
|---|
| Windows 7 Enterprise x86 | 6.1.7601 | نعم |
| Windows 10 Pro x64 | 10.0.18363.900 | نعم |
| Windows 10 Pro Insider Preview x64 | 10.0.20170.1000 | نعم |
| Windows 10 Pro Insider Preview x64 | 10.0.20201.1000 | نعم |
| منتج الأمان | الإصدار | معرض للخطر |
|---|
| Windows Defender AntiMalware Client | 4.18.2006.10 | نعم |
| Windows Defender Engine | 1.1.17200.2 | نعم |
| Windows Defender Antivirus | 1.319.1127.0 | نعم |
| Windows Defender Antispyware | 1.319.1127.0 | نعم |
| Windows Defender AntiMalware Client | 4.18.2007.6 | نعم |
| Windows Defender Engine | 1.1.17300.2 | نعم |
| Windows Defender Antivirus | 1.319.1676.0 | نعم |
| Windows Defender Antispyware | 1.319.1676.0 | نعم |
| Windows Defender AntiMalware Client | 4.18.2007.8 | نعم |
| Windows Defender Engine | 1.1.17400.5 | نعم |
| Windows Defender Antivirus | 1.323.267.0 | نعم |
| Windows Defender Antispyware | 1.323.267.0 | نعم |