تخطي إلى المحتوى الرئيسي
الدعم
تسجيل الدخول باستخدام حساب Microsoft
تسجيل الدخول أو إنشاء حساب.
مرحباً،
تحديد استخدام حساب مختلف!
لديك حسابات متعددة
اختر الحساب الذي تريد تسجيل الدخول باستخدامه.

ينتهي دعم Windows Vista Service Pack 1 (SP1) في 12 يوليو 2011. لمواصلة تلقي تحديثات الأمان لنظام التشغيل Windows، تأكد من تشغيل Windows Vista باستخدام Service Pack 2 (SP2). لمزيد من المعلومات، راجع صفحة ويب Microsoft هذه: ينتهي الدعم لبعض إصدارات Windows.

عندما يقوم تطبيق بتحميل مكتبة ارتباطات ديناميكية (DLL) بشكل ديناميكي من دون تحديد مسار مؤهل بالكامل، يحاول Windows تحديد موقع DLL عن طريق البحث في مجموعة محددة جيدا من الدلائل. إذا تمكن متطفل من التحكم في أحد الدلائل، يمكنه إجبار التطبيق على تحميل نسخة ضارة من DLL بدلا من DLL التي كان يتوقعها. تعرف هذه الهجمات باسم "هجمات التحميل المسبق ل DLL" وهي شائعة في جميع أنظمة التشغيل التي تدعم تحميل مكتبات DLL المشتركة بشكل ديناميكي. قد يكون تأثير مثل هذه الهجمات أنه يمكن للمهاجم تنفيذ التعليمات البرمجية في سياق المستخدم الذي يقوم بتشغيل التطبيق. عند تشغيل التطبيق كمسؤول، قد يؤدي ذلك إلى رفع امتياز محلي. نحن على معرفة بتجديد الاهتمام بهذه الهجمات. للحد من تأثير هذه المشكلة على العملاء المتبادلين، سنصدر هذا المستند إلى مجتمع المطورين للتأكد من أنهم على معرفة بهذه المشكلة وأن لديهم الأدوات اللازمة لمعالجة المشكلة في تطبيقاتهم.

الملخص

وصف هجمات التحميل المسبق ل DLL

الهجمات المستندة إلى LoadLibrary

عندما يقوم تطبيق بتحميل DLL ديناميكيا دون تحديد مسار مؤهل بالكامل، يحاول Windows تحديد موقع DLL هذا عن طريق البحث الخطي عبر مجموعة محددة جيدا من الدلائل، المعروفة باسم ترتيب البحث في DLL. إذا حدد Windows موقع DLL ضمن "أمر البحث في DLL"، سيتم تحميل DLL هذا. ومع ذلك، إذا لم يعثر Windows على DLL في أي من الدلائل في "ترتيب البحث في DLL"، فإنه سيرجع فشلا إلى عملية تحميل DLL. فيما يلي ترتيب البحث في DLL للدوالين LoadLibraryو LoadLibraryEx،المستخدمين لتحميل DLL بشكل ديناميكي:

  1. الدليل الذي تم تحميل التطبيق منه

  2. دليل النظام

  3. دليل النظام 16 بت

  4. دليل Windows

  5. دليل العمل الحالي (CWD)

  6. الدلائل المدرجة في متغير بيئة PATH



فكر في السيناريو التالي:


  • يتم تحميل DLL من قبل تطبيق دون تحديد مسار مؤهل بالكامل يتوقع العثور عليه في CWD للتطبيق.

  • يكون التطبيق مستعدا تماما لمعالجة الحالة عندما لا يعثر على DLL.

  • يعرف المهاجم هذه المعلومات حول التطبيق ويتحكم في CWD.

  • ينسخ المهاجم إصداره الخاص الذي تم إصداره خصيصا من DLL في DWD. هذا الأمر يفترض أن المهاجم لديه الإذن للقيام بذلك.

  • يبحث Windows عبر الدلائل في "ترتيب البحث في DLL" ويعثر على DLL في CWD للتطبيق.

في هذا السيناريو، يتم تشغيل DLL الذي تم تطويره بشكل خاص داخل التطبيق ويكتسب امتيازات المستخدم الحالي.

من خلال التوصية بمنع هذا الهجوم، يمكن للتطبيقات إزالة دليل العمل الحالي (CWD) من مسار البحث في DLL عن طريق استدعاء

SetDllDirectory API باستخدام سلسلة فارغة (""). إذا كان أحد التطبيقات يعتمد على تحميل DLL من الدليل الحالي، فيرجى الحصول على دليل العمل الحالي واستخدامه لتمرير مسار مؤهل بالكامل من LoadLibrary.



نحن على علم أيضا بأن بعض المطورين يستخدمون LoadLibrary للتحقق من وجود DLL معين من أجل تحديد إصدار Windows الذي يقوم المستخدم بتشغيله. يجب أن تكون على علم بأن هذا قد يجعل التطبيق عرضة للانطباع. إذا كانت المكتبة المتأثرة غير موجودة بالفعل في إصدار Windows الذي يتم تنفيذ التطبيق عليه، يمكن للمهاجم تقديم مكتبة بهذا الاسم نفسه في CWD. نوصي بشدة بعدم استخدام هذه التقنية. بدلا من ذلك، استخدم التقنيات الموصى بها الموضحة في مقالة MSDN، "الحصول على إصدار النظام".

يجب أن يتصل التطبيق الذي يحمل مكونات إضافية خارجية ولا يمكنه إجبار المكونات الإضافية على استخدام مسار مؤهل لمكالمات LoadLibrary ب SetDllDirectory("") لإزالة CWD ثم استدعاء SetDllDirectory("موقع تثبيت المكون الإضافي") لإضافة دليل تثبيت المكون الإضافي إلى مسار البحث في DLL.

الهجمات المستندة إلى SearchPath

يوجد هجوم مماثل عندما يستخدم تطبيق 'API ل SearchPath' لتحديد موقع DLL وتحميل المسار الذي يتم إرجاعه بواسطة SearchPath بشكلديناميكي. فيما يلي ترتيب البحث الافتراضي ل API ل SearchPath:

  • الدليل الذي تم تحميل التطبيق منه

  • دليل العمل الحالي (CWD)

  • دليل النظام

  • دليل نظام 16 بت

  • دليل Windows

  • الدلائل المدرجة في متغير بيئة PATH

لا نوصي بهذا النمط لأنه غير آمن. لا نوصي باستخدام الدالة SearchPath كطريقة للبحث عن ملف .dll إذا كان الاستخدام المقصود للمخرج في استدعاء الدالة LoadLibrary. قد يؤدي ذلك إلى تحديد موقع ملف .dll غير صحيح لأن ترتيب البحث في الدالة SearchPath يختلف عن ترتيب البحث المستخدم بواسطة الدالة LoadLibrary. إذا كان عليك تحديد موقع ملف .dll وتحميله، فاستخدم الدالة LoadLibrary.

ShellExecute و CreateProcess


يمكن أن توجد تباينات لهذه المشاكل أيضا عندما يتصل المطورون بوظائف مماثلة مثل ShellExecuteو CreateProcessلتحميل القابلة للتنفيذ الخارجية. نوصي المطورين بتوخي الحذر عند تحميل الثنائيات وتحديد المسار المؤهل بالكامل. يجب أن يكون هذا أقل تعقيدا عند تحميل ثنائي بدلا من مكتبة.

الخطوات المستحسنة لمطوري البرامج

نوصي المطورين بإجراء ما يلي:

  • تحقق من صحة تطبيقاتها لمثيلات تحميل المكتبات غير الآمنة (يتم تقديم أمثلة على كل منها لاحقا في هذه المقالة). تتضمن هذه الخيارات ما يلي:

    • استخدام SearchPath لتحديد موقع مكتبة أو مكون.

    • استخدام LoadLibrary لتحديد إصدار نظام التشغيل.

  • استخدم المسارات المؤهلة بالكامل لكل المكالمات إلى LoadLibrary و CreateProcess و ShellExecute حيثما يمكنك ذلك.

  • قم بتنفيذ مكالمات إلى SetDllDirectory باستخدام سلسلة فارغة ("") لإزالة دليل العمل الحالي من ترتيب البحث الافتراضي ل DLL حيث يكون مطلوبا. يجب أن تدرك أن SetDllDirectory يؤثر على العملية بأكملها. لذلك، يجب عليك إجراء ذلك مرة واحدة مبكرا في عملية التهيوية، وليس قبل إجراء المكالمات إلى LoadLibrary وبعده. ونظرا لأن SetDllDirectory يؤثر على العملية بأكملها، فإن مؤشرات الترابط المتعددة التي تنادي SetDllDirectory مع قيم مختلفة قد تسبب سلوكا غير محدد. بالإضافة إلى ذلك، إذا تم تصميم العملية لتحميل DLLs الخاصة ب جهة خارجية، حتاج إلى إجراء اختبار لتحديد ما إذا كان إنشاء إعداد على مستوى العملية سيتسبب في عدم توافق. المشكلة المعروفة هي أنه عندما يعتمد أحد التطبيقات على Visual Basic for Applications، قد يتسبب الإعداد على مستوى العملية في عدم توافق.

  • استخدم الدالة SetSearchPathModeلتمكين وضع البحث في العملية الآمنة للعملية. هذا ينقل دليل العمل الحالي إلى المكان الأخير في قائمة البحث في SearchPath طوال مدة العملية.

  • تجنب استخدام SearchPath للتحقق من وجود DLL دون تحديد مسار مؤهل بالكامل، حتى لو تم تمكين وضع البحث الآمن، لأن هذا يمكن أن يؤدي إلى هجمات التحميل المسبق ل DLL.

إرشادات حول تحديد تحميل المكتبات غير الآمنة

في التعليمات البرمجية المصدر، فيما يلي أمثلة على تحميل المكتبات غير الآمنة:

  • في مثال التعليمة البرمجية التالي، يبحث التطبيق عن "schannel.dll" باستخدام أقل مسار بحث آمن. إذا تمكن المهاجم schannel.dll في CWD، سيتم تحميله حتى قبل أن يبحث التطبيق في دليل Windows عن المكتبة المناسبة.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • في مثال التعليمة البرمجية التالي، يحاول التطبيق تحميل المكتبة من مواقع أنظمة التشغيل والتطبيقات المختلفة الموضحة في بداية هذا المستند لمكة الطلب LoadLibrary(). في حالة وجود أي مخاطرة من عدم وجود الملف، قد يحاول التطبيق تحميل الملف من دليل العمل الحالي. هذا السيناريو أقل خطورة بقليل من المثال السابق. ومع ذلك، فإنه لا يزال يعرض مستخدم التطبيق للمخاطر إذا لم تكن البيئة قابلة للتنبؤ تماما.

    HMODULE handle = LoadLibrary("schannel.dll");




فيما يلي أمثلة على تحميل مكتبة أفضل وأكثر أمانا:

  • في مثال التعليمة البرمجية التالي، يتم تحميل المكتبة مباشرة باستخدام مسار مؤهل بالكامل. لا يمكن للمتطفل إدخال تعليمات برمجية ضارة ما لم يكن لديه أذونات الكتابة في دليل هدف التطبيق.

    HMODULE handle = LoadLibrary("c:\\windows\\system32\\schannel.dll");



    ملاحظة للحصول على معلومات حول كيفية تحديد دليل النظام، راجع الموارد التالية:

    GetSystemDirectory

    http://msdn.microsoft.com/en-us/library/ms724373%28VS.85%29.aspxSHGetKnownFolderPath

    http://msdn.microsoft.com/en-us/library/bb762188%28v=VS.85%29.aspx

  • في مثال التعليمات البرمجية التالية، تتم إزالة دليل العمل الحالي من مسار البحث قبل استدعاء LoadLibrary. هذا يقلل من المخاطر بشكل ملحوظ، حيث يجب على المهاجم التحكم إما في دليل التطبيق أو دليل Windows أو أي من الدلائل المحددة في مسار المستخدم من أجل استخدام هجوم التحميل المسبق ل DLL.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • على كل الأنظمة التي قمت بتثبيت تحديث الأمان 963027 (الموضح في MS09-014)،ستنقل التعليمات البرمجية التالية CWD بشكل دائم إلى النقطة الأخيرة في ترتيب البحث. ستفشل أي مكالمات لاحقة إلى الدالة SetSearchPathMode من داخل تلك العملية التي تحاول تغيير وضع البحث.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • في مثال التعليمات البرمجية التالية، تتم إزالة دليل العمل الحالي من مسار البحث قبل استدعاء LoadLibrary. هذا يقلل من المخاطر إلى حد كبير، حيث يجب على المهاجم التحكم في دليل التطبيق أو دليل windows أو أي من الدلائل المحددة في مسار المستخدم من أجل استخدام هجوم التحميل المسبق ل DLL.

    SetSearchPathMode (BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT );
    HMODULE handle = LoadLibrary("schannel.dll");

استخدام "مراقبة العملية" للكشف ديناميكيا عن التحميلات غير الآمنة

تنشر Microsoft أداة تسمى "مراقبة العملية". تمكن هذه الأداة المطورين والمسؤولين من تعقب سلوك عملية قيد التشغيل عن كثب. يمكن استخدام "مراقبة العملية" للكشف بشكل ديناميكي عما إذا كان أحد تطبيقاتك عرضة لهذا النوع من المشكلة.

  • لتنزيل "مراقبة العملية"، تفضل بزيارة صفحة ويب Microsoft التالية:

    http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

  • حاول بدء تشغيل التطبيق باستخدام تعيين CWD إلى دليل معين. على سبيل المثال، انقر نقرا مزدوجا فوق ملف يحتوي على ملحق تم تعيين معالج الملفات الخاص به إلى التطبيق.

  • إعداد "مراقبة العملية" باستخدام عوامل التصفية التالية:



    نص بديل

  • إذا تم ضرب مسار ضعيف، ستشاهد شيئا مماثلا للشيء التالي: نص بديليشير استدعاء مشاركة الملف البعيد لتحميل DLL إلى أن هذا البرنامج معرض

    للانهاء.

مزيد من المعلومات

لمزيد من المعلومات، تفضل بزيارة صفحات ويب Microsoft التالية: أمر البحث في مكتبة الارتباطات

الديناميكية

http://msdn.microsoft.com/library/ms682586(VS.85).aspxوثائق MSDN على الدالة SearchPath

http://msdn.microsoft.com/library/aa365527(VS.85).aspxوثائق MSDN على الدالة LoadLibrary

http://msdn.microsoft.com/library/ms684175(VS.85).aspxوثائق MSDN على الدالة SetDllDirectory

http://msdn.microsoft.com/library/ms686203(VS.85).aspxوثائق MSDN على الدالة SetSearchPathMode

http://msdn.microsoft.com/library/dd266735(VS.85).aspxمنشور مدونة من قبل باتر ليبلان، مهندس الأمان الأساسي مع Microsoft Office

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxمنشور مدونة من قبل مهى الرايس، فريق هندسة MSRC على هجمات التحميل المسبق ل DLL

http://blogs.technet.com/b/srd/archive/2009/04/14/ms09-014-addressing-the-safari-carpet-bomb-vulnerability.aspx

موارد إضافية

هل تحتاج إلى مزيد من المساعدة؟

الخروج من الخيارات إضافية؟

استكشف مزايا الاشتراك، واستعرض الدورات التدريبية، وتعرف على كيفية تأمين جهازك، والمزيد.

تساعدك المجتمعات على طرح الأسئلة والإجابة عليها، وتقديم الملاحظات، وسماعها من الخبراء ذوي الاطلاع الواسع.

هل كانت المعلومات مفيدة؟

ما مدى رضاك عن جودة اللغة؟
ما الذي أثّر في تجربتك؟
بالضغط على "إرسال"، سيتم استخدام ملاحظاتك لتحسين منتجات Microsoft وخدماتها. سيتمكن مسؤول تكنولوجيا المعلومات لديك من جمع هذه البيانات. بيان الخصوصية.

نشكرك على ملاحظاتك!

×