Dynamic-Link Kitaplığı Güvenliği

Bir uygulama tam yol adı belirtmeden dinamik bağlantı kitaplığını dinamik olarak yüklediğinde, Windows Dynamic-Link Kitaplık Arama Sırası'nde açıklandığı gibi belirli bir sırada iyi tanımlanmış dizin kümesinde arama yaparak DLL'yi bulmaya çalışır. Bir saldırgan, DLL arama yolundaki dizinlerden birinin denetimini ele alırsa, DLL'nin kötü amaçlı bir kopyasını bu dizine yerleştirebilir. Buna bazen DLL ön yükleme saldırısı veya ikili dikim saldırısıdenir. Sistem, güvenliği aşılmış dizinde aramadan önce DLL'nin meşru bir kopyasını bulamazsa, kötü amaçlı DLL'yi yükler. Uygulama yönetici ayrıcalıklarıyla çalışıyorsa, saldırgan yerel ayrıcalık yükseltmesinde başarılı olabilir.

Örneğin, bir uygulamanın kullanıcının geçerli dizininden dll yüklemek için tasarlandığını ve DLL bulunamazsa düzgün bir şekilde başarısız olduğunu varsayalım. Uygulama, LoadLibrary yalnızca DLL adıyla çağırır ve bu da sistemin DLL'yi aramasına neden olur. Güvenli DLL arama modunun etkinleştirildiğini ve uygulamanın alternatif bir arama sırası kullanmadığını varsayarsak, sistem dizinleri aşağıdaki sırayla arar:

  1. Uygulamanın yüklendiği dizin.
  2. Sistem dizini.
  3. 16 bit sistem dizini.
  4. Windows dizini.
  5. Geçerli dizin.
  6. PATH ortam değişkeninde listelenen dizinler.

Örnekten devam edersek, uygulama hakkında bilgi sahibi olan bir saldırgan geçerli dizinin denetimini alır ve DLL'nin kötü amaçlı bir kopyasını bu dizine yerleştirir. Uygulama LoadLibrary çağrısıyla çalıştığında, sistem DLL'yi arar, geçerli dizinde DLL'nin kötü amaçlı kopyasını bulur ve yükler. ARDıNDAN DLL'nin kötü amaçlı kopyası uygulama içinde çalışır ve kullanıcının ayrıcalıklarını kazanır.

Geliştiriciler, şu yönergeleri izleyerek uygulamalarını DLL ön yükleme saldırılarına karşı korumaya yardımcı olabilir:

  • Mümkün olduğunda, LoadLibrary, LoadLibraryEx, CreateProcessveya ShellExecute işlevlerini kullanırken tam yol belirtin.

  • LoadLibraryEx işleviyle LOAD_LIBRARY_SEARCH bayraklarını kullanın veya bu bayrakları SetDefaultDllDirectories işleviyle kullanarak bir işlem için DLL arama sırası oluşturun ve ardından listeyi değiştirmek için AddDllDirectoryveya SetDllDirectory işlevlerinikullanın. Daha fazla bilgi için bkz. Dynamic-Link Kitaplık Arama Sırası.

    Windows 7, Windows Server 2008 R2, Windows Vista ve Windows Server 2008: Bu bayraklar ve işlevler KB2533623 yüklü sistemlerde kullanılabilir.

  • KB2533623 yüklü sistemlerde, LoadLibraryEx işlevine sahip LOAD_LIBRARY_SEARCH bayraklarını kullanın veya bu bayrakları SetDefaultDllDirectories işleviyle kullanarak bir işlem için DLL arama sırası oluşturun ve ardından listeyi değiştirmek için AddDllDirectoryveya SetDllDirectory işlevlerini kullanın. Daha fazla bilgi için bkz. Dynamic-Link Kitaplık Arama Sırası.

  • Uygulamanızın doğru DLL'yi kullandığından emin olmak için DLL yeniden yönlendirme veya bildirim kullanmayı göz önünde bulundurun.

  • Standart arama sırasını kullanırken güvenli DLL arama modunun etkinleştirildiğinden emin olun. Bu, kullanıcının geçerli dizinini daha sonra arama sırasına yerleştirir ve Windows'un kötü amaçlı bir kopyadan önce DLL'nin meşru bir kopyasını bulma olasılığını artırır. Güvenli DLL arama modu, Windows XP Service Pack 2 (SP2) ile başlayarak varsayılan olarak etkinleştirilir ve HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode kayıt defteri değeri tarafından denetlenür. Daha fazla bilgi için bkz. Dynamic-Link Kitaplık Arama Sırası.

  • Boş bir dize ("") ile SetDllDirectory çağırarak geçerli dizini standart arama yolundan kaldırmayı göz önünde bulundurun. Bu, LoadLibraryçağrılarının öncesinde ve sonrasında değil, işlem başlatma işleminde erken bir kez yapılmalıdır. SetDllDirectory tüm işlemi etkilediğini ve farklı değerlerle SetDllDirectory çağıran birden çok iş parçacığının tanımsız davranışa neden olabileceğini unutmayın. Uygulamanız üçüncü taraf DLL'leri yüklerse uyumsuzlukları belirlemek için dikkatli bir şekilde test edin.

  • Güvenli işlem arama modu etkinleştirilmediği sürece, sonraki bir LoadLibrary çağrısı için DLL'nin yolunu almak için SearchPath işlevini kullanmayın. Güvenli işlem arama modu etkinleştirilmediğinde, SearchPath işlevi LoadLibrary ' farklı bir arama sırası kullanır ve önce kullanıcının geçerli dizininde belirtilen DLL'yi arama olasılığı vardır. SearchPath işlevi için güvenli işlem arama modunu etkinleştirmek için BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE ile SetSearchPathModeişlevinikullanın. Bu işlem, geçerli dizini SearchPath işlemin ömrü için arama listesinin sonuna taşır. Geçerli dizinin arama yolundan kaldırılmadığını unutmayın, bu nedenle sistem geçerli dizine ulaşmadan önce DLL'nin geçerli bir kopyasını bulamazsa, uygulama hala savunmasızdır. SetDllDirectory'da olduğu gibi, SetSearchPathMode çağrısının sürecin ilk aşamasında yapılması gerekir ve tüm işlemi etkiler. Uygulamanız üçüncü taraf DLL'leri yüklerse uyumsuzlukları belirlemek için dikkatli bir şekilde test edin.

  • DLL'yi arayan bir LoadLibrary çağrısına dayalı olarak işletim sistemi sürümü hakkında varsayımlarda bulunmayın. Uygulama, DLL'nin yasal olarak mevcut olmadığı ancak dll'nin kötü amaçlı bir kopyası arama yolunda yer alan bir ortamda çalışıyorsa, DLL'nin kötü amaçlı kopyası yüklenebilir. Bunun yerine, Sistem Sürümünü Almabölümünde açıklanan önerilen teknikleri kullanın.

İşlem İzleyicisi aracı, güvenlik açığı olabilecek DLL yükleme işlemlerini tanımlamaya yardımcı olmak için kullanılabilir. İşlem İzleyicisi aracı https://technet.microsoft.com/sysinternals/bb896645.aspxkonumundan indirilebilir.

Aşağıdaki yordamda, uygulamanızdaki DLL yükleme işlemlerini incelemek için İşlem İzleyicisi'nin nasıl kullanılacağı açıklanmaktadır.

Uygulamanızdaki DLL yükleme işlemlerini incelemek için İşlem İzleyicisi'ni kullanmak

  1. İşlem İzleyicisi'ni başlatın.
  2. İşlem İzleyicisi'ne aşağıdaki filtreleri ekleyin:
    • İşlem CreateFile
    • İşlem: LoadImage
    • Yol .cpl içerir
    • Yol .dll içerir
    • Yol .drv içeriyor
    • Yol .exe içerir
    • Yol .ocx içeriyor
    • Yol .scr içeriyor
    • Yol .sys içerir
  3. Aşağıdaki filtreleri hariç tutun:
    • İşlem Adı procmon.exe
    • İşlem Adı Procmon64.exe
    • İşlem Adı Sistemdir
    • İşlem IRP_MJ_ ile başlar
    • İşlem FASTIO_ ile başlar
    • Sonuç BAŞARI
    • Yol pagefile.sys ile biter
  4. Geçerli dizin belirli bir dizine ayarlanmış olarak uygulamanızı başlatmayı deneme. Örneğin, dosya işleyicisi uygulamanıza atanmış uzantılı bir dosyaya çift tıklayın.
  5. Dll yüklemek için geçerli dizine yapılan çağrı gibi şüpheli görünen yollar için İşlem İzleyicisi çıkışını denetleyin. Bu tür bir çağrı, uygulamanızda bir güvenlik açığı olduğunu gösterebilir.