ข้ามไปที่เนื้อหาหลัก
การสนับสนุน
ลงชื่อเข้าใช้
ลงชื่อเข้าใช้ด้วย Microsoft
ลงชื่อเข้าใช้หรือสร้างบัญชี
สวัสดี
เลือกบัญชีอื่น
คุณมีหลายบัญชี
เลือกบัญชีที่คุณต้องการลงชื่อเข้าใช้

การสนับสนุน Windows Vista Service Pack 1 (SP1) สิ้นสุดลงในวันที่ 12 กรกฎาคม 2011 เมื่อต้องการรับการอัปเดตความปลอดภัยต่อใน Windows ตรวจสอบให้แน่ใจว่าคุณใช้ Windows Vista ที่มี Service Pack 2 (SP2) หากต้องการข้อมูลเพิ่มเติม โปรดดูเว็บเพจของ Microsoft นี้: การสนับสนุนจะสิ้นสุดลงใน Windows บางเวอร์ชัน

เมื่อแอปพลิเคชันโหลด Dynamic Link Library (DLL) แบบไดนามิกโดยไม่ระบุเส้นทางแบบเต็ม Windows จะพยายามค้นหา DLL โดยการค้นหาชุดไดเรกทอรีที่กําหนดอย่างดี ถ้าผู้โจมตีได้รับการควบคุมไดเรกทอรีหนึ่ง อาจบังคับให้แอปพลิเคชันโหลดสําเนาที่เป็นอันตรายของ DLL แทน DLL ที่โปรแกรมต้องการได้ การโจมตีเหล่านี้เรียกว่า "DLL โหลดการโจมตีล่วงหน้า" และเป็นเรื่องปกติของระบบปฏิบัติการทั้งหมดที่สนับสนุนการโหลดไลบรารี DLL ที่แชร์แบบไดนามิก ผลจากการโจมตีดังกล่าวอาจเป็นการที่ผู้โจมตีสามารถเรียกใช้โค้ดในบริบทของผู้ใช้ที่เรียกใช้แอปพลิเคชันได้ เมื่อแอปพลิเคชันถูกเรียกใช้ในฐานะผู้ดูแลระบบ ซึ่งอาจไปสู่ระดับสิทธิ์ภายใน เราทราบเกี่ยวกับความสนใจในการต่ออายุการโจมตีเหล่านี้ เมื่อต้องการจํากัดผลกระทบที่ปัญหานี้มีต่อลูกค้าของเรา เราจะเผยแพร่เอกสารนี้ไปยังชุมชนนักพัฒนาเพื่อให้แน่ใจว่าพวกเขาทราบเกี่ยวกับปัญหานี้ และมีเครื่องมือที่จําเป็นในการแก้ไขปัญหาในแอปพลิเคชันของพวกเขา

สรุป

อธิบายของ DLL โหลดการโจมตีไว้ล่วงหน้า

การโจมตีตาม LoadLibrary

เมื่อแอปพลิเคชันโหลด DLL แบบไดนามิกโดยไม่ระบุเส้นทางที่มีคุณสมบัติครบถ้วน Windows จะพยายามค้นหา DLL นี้โดยการค้นหาแบบเชิงเส้นผ่านชุดไดเรกทอรีที่กําหนดอย่างดี หรือที่เรียกว่า ลําสั่งซื้อการค้นหา DLL ถ้า Windows ค้นหา DLL ภายในลสั่งซื้อการค้นหา DLL จะโหลด DLL นั้น อย่างไรก็ตาม ถ้า Windows ไม่พบ DLL ในไดเรกทอรีใดๆ ในลําดับการค้นหา DLL จะส่งกลับความล้มเหลวในการโหลด DLL ต่อไปนี้เป็นลสั่งซื้อ DLL Search Order ของ ฟังก์ชัน LoadLibraryและ LoadLibraryExซึ่งใช้ในการโหลด DLL แบบไดนามิก:

  1. ไดเรกทอรีที่โหลดแอปพลิเคชัน

  2. ไดเรกทอรีของระบบ

  3. ไดเรกทอรีระบบ 16 บิต

  4. ไดเรกทอรี Windows

  5. ไดเรกทอรีที่ใช้งานได้ในปัจจุบัน (CWD)

  6. ไดเรกทอรีที่แสดงอยู่ในตัวแปรสภาพแวดล้อมของ PATH



พิจารณาสถานการณ์สมมติต่อไปนี้


  • แอปพลิเคชันจะโหลด DLL โดยไม่ระบุเส้นทางที่มีคุณสมบัติเต็มที่คาดว่าจะพบใน CWD ของแอปพลิเคชัน

  • แอปพลิเคชันเตรียมพร้อมอย่างสมบูรณ์เพื่อจัดการกับกรณีที่ไม่พบ DLL

  • ผู้โจมตีจะรู้ข้อมูลนี้เกี่ยวกับแอปพลิเคชันและควบคุม CWD

  • ผู้โจมตีจะคัดลอก DLL เวอร์ชันที่สร้างขึ้นเป็นพิเศษของตนเองใน CWD โดยถือว่าผู้โจมตีมีสิทธิ์ในการนี้

  • Windows จะค้นหาผ่านไดเรกทอรีใน DLL Search Order และค้นหา DLL ใน CWD ของแอปพลิเคชัน

ในสถานการณ์นี้ DLL ที่สร้างขึ้นมาเป็นพิเศษจะเรียกใช้ภายในแอปพลิเคชันและได้รับสิทธิ์ของผู้ใช้ปัจจุบัน

ข้อแนะนนะเพื่อป้องกันการโจมตีนี้ แอปพลิเคชันสามารถเอาไดเรกทอรีที่ใช้งานได้ในปัจจุบัน (CWD) ออกจากเส้นทางการค้นหา DLL โดยการเรียกใช้

SetDllDirectory API โดยใช้สตริงว่าง ("") ถ้าแอปพลิเคชันขึ้นกับการโหลด DLL จากไดเรกทอรีปัจจุบัน โปรดรับไดเรกทอรีที่ใช้งานได้ปัจจุบัน และใช้ไดเรกทอรีนั้นส่งผ่านในเส้นทางที่มีคุณสมบัติสมบูรณ์ของLoadLibrary



นอกจากนี้ เรายังทราบว่านักพัฒนาบางรายใช้ LoadLibrary เพื่อตรวจสอบว่า DLL ที่ระบุแสดงอยู่เพื่อระบุว่าผู้ใช้ใช้งาน Windows เวอร์ชันใดอยู่หรือไม่ คุณควรทราบว่าการนี้อาจช่วยให้แอปพลิเคชันมีความเสี่ยง ถ้าไลบรารีที่ได้รับผลกระทบไม่มีอยู่บนการเผยแพร่ Windows ที่แอปพลิเคชันถูกเรียกใช้ ผู้โจมตีอาจแนะนะไลบรารีที่มีชื่อเดียวกันนั้นลงใน CWD เราขอแนะใช้อย่างยิ่งต่อการใช้เทคนิคนี้ แต่ให้ใช้เทคนิคที่แนะนาที่อธิบายไว้ในบทความ MSDN "Getting the System Version. (รับเวอร์ชันของระบบ)"

แอปพลิเคชันที่โหลดปลั๊กอินของบริษัทอื่นและไม่สามารถบังคับให้ปลั๊กอินใช้เส้นทางที่เข้าเกณฑ์ของการโทร LoadLibrary ควรเรียก SetDllDirectory("") เพื่อเอา CWD ออก แล้วเรียกใช้ SetDllDirectory("plugin install location") เพื่อเพิ่มไดเรกทอรีการติดตั้งปลั๊กอินลงในเส้นทางการค้นหา DLL

การโจมตีโดยใช้ SearchPath

การโจมตีที่คล้ายกันมีอยู่เมื่อแอปพลิเคชันใช้ SearchPath API เพื่อค้นหา DLL และโหลดเส้นทางที่ส่งกลับโดย SearchPathแบบไดนามิก ต่อไปนี้คือลสั่งซื้อเริ่มต้นการค้นหาของ SearchPath API:

  • ไดเรกทอรีที่โหลดแอปพลิเคชัน

  • ไดเรกทอรีที่ใช้งานได้ในปัจจุบัน (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 ที่มีค่าที่แตกต่างกันอาจทําให้เกิดลักษณะการไม่สามารถระบุได้ นอกจากนี้ ถ้ากระบวนการนี้ถูกออกแบบมาเพื่อโหลด DLL ของบริษัทอื่น คุณจะต้องทดสอบเพื่อตรวจสอบว่าการทําการตั้งค่าทั้งกระบวนการจะทําให้เกิดความไม่เข้ากันหรือไม่ ปัญหาที่ทราบแล้วคือเมื่อแอปพลิเคชันขึ้นอยู่กับ Visual Basic for Applications การตั้งค่าทั้งกระบวนการอาจทําให้เกิดความไม่เข้ากัน

  • ใช้ฟังก์ชัน SetSearchPathModsเพื่อเปิดใช้งานโหมดการค้นหากระบวนการที่ปลอดภัยของกระบวนการ การจะเป็นการย้ายไดเรกทอรีที่ใช้งานได้ในปัจจุบันไปยังที่สุดท้ายในรายการค้นหาของ 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 ไปยังจุดสุดท้ายในล>การค้นหาอย่างถาวร การโทรไปยังฟังก์ชัน SetSearchPathMod1 ในภายหลังจากภายในกระบวนการที่พยายามเปลี่ยนโหมดการค้นหาจะล้มเหลว

    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 ต่อไปนี้:

ใบสั่งการค้นหา Dynamic Link Library

http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspxเอกสารประกอบ MSDN บนฟังก์ชัน SearchPath

http://msdn.microsoft.com/en-us/library/aa365527(VS.85).aspxเอกสารประกอบ MSDN บนฟังก์ชัน LoadLibrary

http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspxเอกสารประกอบ MSDN บนฟังก์ชัน SetDllDirectory

http://msdn.microsoft.com/en-us/library/ms686203(VS.85).aspxเอกสารประกอบ MSDN บนฟังก์ชัน SetSearchPathMod1

http://msdn.microsoft.com/en-us/library/dd266735(VS.85).aspxโพสต์ในบล็อกโดย David Leblanc วิศวกรด้านความปลอดภัยของอาจารย์ใหญ่กับ Microsoft Office

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxโพสต์ในบล็อกโดย Andrew Roths ทีมวิศวกรรม MSRC ใน DLL โหลดการโจมตีไว้ล่วงหน้า

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

แหล่งข้อมูลเพิ่มเติม

ต้องการความช่วยเหลือเพิ่มเติมหรือไม่

ต้องการตัวเลือกเพิ่มเติมหรือไม่

สํารวจสิทธิประโยชน์ของการสมัครใช้งาน เรียกดูหลักสูตรการฝึกอบรม เรียนรู้วิธีการรักษาความปลอดภัยอุปกรณ์ของคุณ และอื่นๆ

ชุมชนช่วยให้คุณถามและตอบคําถาม ให้คําติชม และรับฟังจากผู้เชี่ยวชาญที่มีความรู้มากมาย

ข้อมูลนี้เป็นประโยชน์หรือไม่

คุณพึงพอใจกับคุณภาพภาษาเพียงใด
สิ่งที่ส่งผลต่อประสบการณ์ใช้งานของคุณ
เมื่อกดส่ง คำติชมของคุณจะถูกใช้เพื่อปรับปรุงผลิตภัณฑ์และบริการของ Microsoft ผู้ดูแลระบบ IT ของคุณจะสามารถรวบรวมข้อมูลนี้ได้ นโยบายความเป็นส่วนตัว

ขอบคุณสำหรับคำติชมของคุณ!

×