דלג לתוכן הראשי
היכנס דרך 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. הספריות המופיעות במשתנה סביבת הנתיב



שקול את התרחיש הבא:


  • יישום טוען קובץ DLL מבלי לציין נתיב מלא שהוא מצפה למצוא בCWD של היישום.

  • היישום מוכן במלואו כדי לטפל במקרה כאשר הוא אינו מוצא את ה-DLL.

  • התוקף יודע מידע זה אודות היישום ושולט ב-CWD.

  • התוקף מעתיק את הגירסה המיוחדת שלהם של ה-DLL של ה-DLL ב-CWD. פעולה זו מניחה שלתוקף יש הרשאה לעשות זאת.

  • Windows מחפש בספריות בסדר החיפוש של DLL ומוצא את ה-DLL בCWD של היישום.

בתרחיש זה, קובץ ה-DLL בעל המבנה המיוחד פועל בתוך היישום ומקבל את ההרשאות של המשתמש הנוכחי.

המלצה

כדי למנוע התקפה זו, היישומים יכולים להסיר את מדריך העבודה הנוכחי (CWD) מנתיב החיפוש של DLL על-ידי התקשרות ל-API של SetDllDirectory באמצעות מחרוזת ריקה (""). אם יישום תלוי בטעינת קובץ DLL ממדריך הכתובות הנוכחי, השג את מדריך העבודה הנוכחי והשתמש באפשרות זו כדי להעביר את הנתיב המלא של LoadLibrary.



אנו גם מודעים לכך שמפתחים מסוימים משתמשים ב-LoadLibrary כדי לאמת אם קיים DLL ספציפי כדי לקבוע איזו גירסה של Windows מופעלת על-ידי המשתמש. עליך להיות מודע לכך שהדבר עלול לגרום ליישום להיות פגיע. אם הספריה המושפעת אכן אינה קיימת במהדורת Windows שהיישום מופעל בה, תוקף יכול להציג ספריה עם אותו שם ב-CWD. מומלץ מאוד להשתמש בטכניקה זו. במקום זאת, השתמש בטכניקות המומלצות המתוארות במאמר MSDN, "מקבל את גירסת המערכת"

. אפליקציה הטוענת תוספים של ספקים חיצוניים, ושאינה יכולה להכריח את התוספים להשתמש בנתיב מוסמך עבור שיחות LoadLibrary אמורות להתקשר SetDllDirectory ("") כדי להסיר את CWD ולאחר מכן להתקשר SetDllDirectory ("התקנת מיקום התוסף") כדי להוסיף את מדריך התקנת התוסף לנתיב החיפוש של DLL.

התקפות מבוססות SearchPath

התקפה דומה קיימת כאשר יישום משתמש ב-API של SearchPath כדי לאתר קובץ DLL ולטעון באופן דינאמי את הנתיב המוחזר על-ידי SearchPath. להלן סדר החיפוש המוגדר כברירת מחדל עבור ה-API של SearchPath:

  • הספריה שממנה נטענה היישום

  • מדריך העבודה הנוכחי (CWD)

  • מדריך המערכת

  • מדריך המערכת של 16 סיביות

  • מדריך הכתובות של Windows

  • הספריות המופיעות במשתנה סביבת הנתיב

אין אנו ממליצים על תבנית זו מכיוון שהיא אינה מאובטחת. איננו ממליצים על הפונקציה SearchPath כשיטה לאיתור קובץ. dll אם השימוש המיועד של הפלט נמצא בשיחה עם הפונקציה LoadLibrary. אפשרות זו עלולה לגרום לאיתור הקובץ הלא נכון של. dll מכיוון שסדר החיפוש של הפונקציה SearchPath שונה מסדר החיפוש שנמצא בשימוש על-ידי הפונקציה LoadLibrary. אם עליך לאתר ולטעון קובץ. dll, השתמש בפונקציה LoadLibrary.

ShellExecute ו-CreateProcess


וריאציות של בעיות אלה יכולות להתקיים גם כאשר מפתחים קוראים לפונקציות דומות כגון ShellExecuteו- CreateProcessכדי לטעון קבצי הפעלה חיצוניים. מומלץ להזהיר מפתחים כאשר הם מעמיסים בינאריים ומציינים את הנתיב המלא. פעולה זו אמורה להוות פחות מורכבות בעת טעינת בינארי במקום ספריה.

שלבים מומלצים עבור מפתחי תוכנה

מומלץ למפתחים לבצע את הפעולות הבאות:

  • אמת את היישומים שלהם עבור מופעים של טעינת ספריה לא מאובטחת (דוגמאות של כל אחת מהן ניתנות בהמשך מאמר זה). אלה כוללות את הפרטים הבאים:

    • השימוש ב-SearchPath כדי לזהות את מיקום הספריה או הרכיב.

    • השימוש ב-LoadLibrary כדי לזהות את הגירסה של מערכת ההפעלה.

  • השתמש בנתיבים מלאים עבור כל השיחות אל LoadLibrary, CreateProcess ו-ShellExecute שבהן תוכל להשתמש.

  • יישם שיחות ל-SetDllDirectory באמצעות מחרוזת ריקה ("") כדי להסיר את מדריך העבודה הנוכחי מתוך סדר החיפוש המוגדר כברירת מחדל של ה-DLL היכן שהוא נדרש. שים לב ש-SetDllDirectory משפיע על התהליך כולו. לכן, עליך לעשות זאת פעם אחת מוקדם יותר באתחול התהליך, לא לפני ואחרי שיחות אל LoadLibrary. מאחר ש-SetDllDirectory משפיע על התהליך כולו, הליכי משנה מרובים שיחות SetDllDirectory עם ערכים שונים עלולים לגרום לאופן פעולה לא מוגדר. בנוסף, אם התהליך מיועד לטעינה של קבצי Dll של ספקים חיצוניים, הבדיקה תצטרך לקבוע אם הגדרת הגדרה כלל-תהליך תגרום לחוסר תאימות. בעיה ידועה היא שכאשר יישום תלוי ב-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 set למדריך ספציפי. לדוגמה, לחץ פעמיים על קובץ בעל סיומת שהמטפל בקבצים שלו מוקצה ליישום שלך.

  • הגדרת צג התהליך עם המסננים הבאים



    :טקסט חלופי

  • אם מתבצעת פגיעה בנתיב פגיע, תראה משהו דומה לזה: טקסט חלופי

    את השיחה למיקום המשותף של הקבצים המרוחקים כדי לטעון קובץ DLL מציין שזוהי תוכנית פגיעה.

מידע נוסף

לקבלת מידע נוסף, בקר בדפי האינטרנט הבאים של Microsoft:

סדר חיפוש בספריית קישור דינאמי

http://msdn.microsoft.com/en-us/library/ms682586 (לעומת 85). aspxתיעוד של MSDN בפונקציה SearchPath

http://msdn.microsoft.com/en-us/library/aa365527 (לעומת 85). aspxתיעוד של MSDN בפונקציה LoadLibrary

http://msdn.microsoft.com/en-us/library/ms684175 (לעומת 85). aspxתיעוד של MSDN בפונקציה SetDllDirectory

http://msdn.microsoft.com/en-us/library/ms686203 (לעומת 85). aspxתיעוד של MSDN בפונקציה SetSearchPathMode

http://msdn.microsoft.com/en-us/library/dd266735 (לעומת 85). aspxפרסום בבלוג על-ידי David לאנק, מהנדס אבטחה ראשי עם 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. מנהל ה-IT שלך יוכל לאסוף נתונים אלה. הצהרת הפרטיות.

תודה על המשוב!

×