Microsoft hesabıyla oturum açın
Oturum açın veya hesap oluşturun.
Merhaba,
Farklı bir hesap seçin.
Birden çok hesabınız var
Oturum açmak istediğiniz hesabı seçin.

Windows Vista Service Pack 1 (SP1) desteği 12 Temmuz 2011'de sona erer. Windows güvenlik güncelleştirmelerini almaya devam etmek için Windows Vista Service Pack 2'yi (SP2) çalıştırdığınızdan emin olun. Daha fazla bilgi için bu Microsoft web sayfasına bakın: Windows'un bazı sürümleri için destek sona eriyor.

Bir uygulama tam yol belirtmeden dinamik bağlantı kitaplığını (DLL) dinamik olarak yüklerken, Windows iyi tanımlanmış bir dizin kümesi arayarak DLL'yi bulmaya çalışır. Bir saldırgan dizinlerden birinin denetimine sahip olursa, uygulamayı, beklediği DLL yerine DLL'nin kötü amaçlı bir kopyasını yüklemeye zorlar. Bu saldırılar "DLL önceden yükleme saldırıları" olarak bilinir ve paylaşılan DLL kitaplıklarının dinamik olarak yüklenmesini destekleyen tüm işletim sistemlerinde yaygındır. Bu tür saldırılar, bir saldırgan tarafından uygulamayı çalıştıran kullanıcının bağlamında kod yürütülebilir. Uygulama Yönetici olarak çalıştır ediliyorsa, bu yerel bir ayrıcalık yükseltmesine neden olabilir. Bu saldırılara yenilenen ilgiyi biliyoruz. Bu sorunun ortak müşterilerimiz üzerindeki etkisini sınırlamak için, bu belgeyi geliştirici topluluğuna, bu sorunu müşterilerimizin bu sorundan haberleri olduğundan ve uygulamalarında bu sorunu ele alan gerekli araçlara sahip olduğundan emin olmak için sunuyoruz.

Özet

DLL'nin önceden yükleme saldırılarının açıklaması

LoadLibrary tabanlı saldırılar

Bir uygulama tam yol belirtmeden bir DLL'yi dinamik olarak yüklerken, Windows DLL Arama Sırası olarak bilinen iyi tanımlanmış bir dizin kümesi üzerinde doğrusal olarak arama yapmak yoluyla bu DLL'yi bulmaya çalışır. Windows DLL'yi DLL Arama Sırası içinde bulamazsa, o DLL'yi yükler. Bununla birlikte, Windows DLL'yi DLL Arama Sırası'nın hiçbir dizininde bulamazsa, DLL yükleme işlemi başarısız olur. Aşağıdakiler, DLL'leri dinamik olarak yüklemek için kullanılan LoadLibraryve LoadLibraryExişlevlerinin DLL Arama Sırasıdır:

  1. Uygulamanın yüklenemiyor olduğu dizin

  2. Sistem dizini

  3. 16 bit sistem dizini

  4. Windows dizini

  5. Geçerli çalışma dizini (CWD)

  6. PATH ortam değişkensinde listelenen dizinler



Aşağıdaki senaryoyu düşünün:


  • Bir uygulama, uygulamanın CWD'sinde bulmayı beklediğiniz tam nitelikli yolu belirtmeden bir DLL yükler.

  • Uygulama, DLL'i bulamadı mı, bu durumu işlemek için tamamen hazırlanmıştır.

  • Saldırgan uygulama hakkında bu bilgiyi bilir ve CWD'yi kontrol eder.

  • Saldırgan, CWD'de dll'nin kendi özel olarak hazırlanmış sürümünü kopyalar. Bu, saldırgana bunu yapma izninin olduğunu varsayıyor.

  • Windows, DLL Arama Sırası'nın dizinlerinde arama yapmakta ve dll'yi uygulamanın CWD'sinde bulur.

Bu senaryoda, özel olarak hazırlanmış DLL uygulama içinde çalışır ve geçerli kullanıcının ayrıcalıklarını kazanır.

Bu saldırıyı önlemek için, uygulamalar boş bir dize ("") kullanarak SetDllDirectory API'sini çağırarak geçerli çalışma dizinini

(CWD) DLL arama yolundan kaldırabilir. Bir uygulama geçerli dizinden bir DLL yüklemeye bağlı ise, lütfen geçerli çalışma dizinini alın ve tam bir LoadLibraryyoluna geçmek için bunu kullanın.



Bazı geliştiricilerin, kullanıcı tarafından hangi Windows sürümünün çalıştırılır olduğunu belirlemek üzere belirli bir DLL'nin var olup olmadığını doğrulamak için LoadLibrary'yi kullanıyor olduğunu da biliyoruz. Bunun, uygulamayı korumasız halel haleyy88e neden olacağını biliyor olmak gerekir. Etkilenen kitaplık, uygulamanın yürütül olduğu Windows sürümü üzerinde gerçekten yoksa, bir saldırgan CWD'ye aynı adı alan bir kitaplık kullanabilir. Bu tekniği kullanmamanizi kesinlikle öneririz. Bunun yerine, MSDN'de "Sistem Sürümünü Alma" makalesinde açıklanan önerilen teknikleri kullanın.

Üçüncü taraf eklentileri yüklayan ve eklentiyi LoadLibrary çağrıları için uygun bir yol kullanmaya zorlayan bir uygulama, CWD'yi kaldırmak için SetDllDirectory("") çağrısında bulunmalıdır ve eklenti yükleme dizinini DLL arama yoluna eklemek için SetDllDirectory("eklenti yükleme konumu") aranmalıdır.

SearchPath tabanlı saldırılar

Bir uygulama bir DLL'yi bulmak ve SearchPath tarafından döndürülen yolu dinamik olarak yüklemek için SearchPath API'sini kullandığında da benzer bir saldırı vardır. Aşağıdakiler, SearchPath API'si için varsayılan arama sırasıdır:

  • Uygulamanın yüklenemiyor olduğu dizin

  • Geçerli çalışma dizini (CWD)

  • Sistem dizini

  • 16 bit sistem dizini

  • Windows dizini

  • PATH ortam değişkensinde listelenen dizinler

Bu düzen güvenli değildir, çünkü bu düzeni önerilmez. Çıkışın hedeflenen kullanımı LoadLibrary işlevine yapılan bir aramada ise, SearchPath işlevinin .dll dosyasını bulma yöntemi olarak kullanılması önerilmez. Bunun sonucunda, SearchPath işlevinin arama sırası LoadLibrary işlevi tarafından kullanılan arama düzeninden farklı olduğundan yanlış .dll dosyası bulunamıyor. Bir .dll dosyasını bulup yüklemeniz gerekirse, LoadLibrary işlevini kullanın.

ShellExecute ve CreateProcess


Geliştiriciler dış yürütülebilir dosyaları yüklemek için ShellExecuteve CreateProcessgibi benzer işlevleri çağıran bu sorunların çeşitlemeleri de olabilir. Geliştiricilerin ikili dosyalar yüklerken dikkatli olmaları ve tam yol belirtmelerini öneririz. Bu, kitaplık yerine ikili bir değer yükleyrken daha az karmaşıklık getirir.

Yazılım geliştiriciler için önerilen adımlar

Geliştiricilerin şunları yapmalarını öneririz:

  • Güvenli olmayan kitaplık yüklemesi örnekleri için uygulamalarını doğrulama (bu makalenin devamlarında bunların örnekleri verilmiştir). Bunlar şunlardır:

    • Bir kitaplığın veya bileşenin konumunu tanımlamak için SearchPath kullanımı.

    • İşletim sisteminin sürümünü tanımlamak için LoadLibrary kullanımı.

  • LoadLibrary, CreateProcess ve ShellExecute'a yapılan tüm çağrılar için tam yolları kullanın.

  • Geçerli çalışma dizinini gereken varsayılan DLL arama sırasından kaldırmak için boş bir dizeyle ("") SetDllDirectory aramalarını gerçekleştirin. SetDllDirectory'nin sürecin tamamını etkileyeceğinin farkında olmak. Bu nedenle, bu işlemi LoadLibrary'ye yapılan çağrılardan önce ve sonra değil, işlem başlatma işlemi sırasında bir kez erkenden yapabilirsiniz. SetDllDirectory tüm işlemi etkileyeni olduğundan, SetDllDirectory'i farklı değerlerle çağıran birden çok iş parçacığı tanımlanmamış davranışa neden olabilir. Buna ek olarak, işlem üçüncü taraf URL'leri yüklemek üzere tasarlandısa, süreç genelinde bir ayarın uyumsuzluklara neden olup olmadığını belirlemek için test gerekir. Bilinen bir sorun, uygulama Visual Basic for Applications'a bağlı olduğunda, işlem genelindeki bir ayarın uyumsuzluklara neden olduğudur.

  • İşlemde güvenli süreç arama modunu etkinleştirmek için SetSearchPathModeişlevini kullanın. Bu işlem, geçerli çalışma dizinini, searchPath arama listesinde sürecin yaşam süresi boyunca en son yere taşır.

  • Tam bir yol belirtmeden, güvenli arama modu etkinleştirilse bile, dll varlığını kontrol etmek için SearchPath'i kullanmaktan kaçının, çünkü bu durum DLL Önceden Yükleme saldırılarına neden olabilir.

Güvenli olmayan kitaplık yüklemelerini belirleme kılavuzu

Kaynak kodda, aşağıdakiler güvenli olmayan kitaplığın yükleme örnekleridir:

  • Aşağıdaki kod örneğinde, uygulama en az güvenli schannel.dll yolu kullanarak "schannel.dll" için arama yaptı. Bir saldırgan CWD'schannel.dll yer alıyorsa, uygulama uygun kitaplık için Windows dizinlerinde arama yapana kadar yüklemesi gerekir.

    DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL); 
    HMODULE handle = LoadLibrary(result);
  • Aşağıdaki kod örneğinde, uygulama kitaplığı LoadLibrary() çağrısı için bu belgenin başında açıklanan çeşitli uygulama ve işletim sistemi konumlarından yüklemeye çalışır. Dosyanın var olmadığının bir riski varsa, uygulama dosyayı geçerli çalışma dizininden yüklemeye deneyebilir. Bu senaryo önceki örnektekinden biraz daha az tehlikelidir. Bununla birlikte, ortam tamamen öngörülebilir durumda değilken de uygulama kullanıcılarını risk altında sunar.

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




Aşağıda daha iyi ve daha güvenli kitaplık yüklemelerinin örnekleri verilmiştir:

  • Aşağıdaki kod örneğinde, kitaplık tam nitelikli bir yol kullanılarak doğrudan yüklenir. Zaten uygulamanın hedef dizininde yazma izinleri yoksa, saldırgana kötü amaçlı kod uygulama riski yoktur.

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



    Not Sistem dizinini belirleme hakkında bilgi için aşağıdaki kaynaklara bakın:

    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

  • Aşağıdaki kod örneğinde, LoadLibrary çağrılmadan önce geçerli çalışma dizini arama yolundan kaldırılır. Bu, riski önemli ölçüde azaltır çünkü saldırgan bir DLL önceden yükleme saldırısını kullanmak için uygulama dizinini, Windows dizinini veya kullanıcının yolunda belirtilen dizinleri denetlemesi gerekir.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Güvenlik güncelleştirmesi 963027'yi yüklemiş olan tüm sistemlerde (MS09-014'teaçıklanmıştır), aşağıdaki kod CWD'yi arama düzeninde son noktaya kalıcı olarak taşımaktadır. Daha sonra bu işlem içinden AramaPathMode'a yapılan ve arama modunu değiştirmeye çalışan SetSearchPathMode işlevine yapılan tüm aramalar başarısız olur.

    SetDllDirectory ("");
    HMODULE handle = LoadLibrary("schannel.dll");
  • Aşağıdaki kod örneğinde, LoadLibrary çağrılmadan önce geçerli çalışma dizini arama yolundan kaldırılır. Bu, riski önemli ölçüde azaltır çünkü saldırgan bir DLL önceden yükleme saldırısını kullanmak için uygulama dizinini, windows dizinini veya kullanıcının yolunda belirtilen dizinleri denetlemesi gerekir.

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

Güvenli olmayan yükleri dinamik olarak algılamak için Süreç İzleyicisi'nin kullanımı

Microsoft, Süreç İzleyicisi adlı bir araç yayımlar. Bu araç, geliştiricilerin ve yöneticilerin çalışan bir sürecin davranışını yakından izlemelerini sağlar. Süreç İzleyicisi, uygulamalardan birinin bu tür bir soruna açık olup olmadığını dinamik olarak algılamak için kullanılabilir.

  • Süreç İzleyicisi'ne indirmek için aşağıdaki Microsoft web sayfasını ziyaret edin:

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

  • Belirli bir dizine CWD kümesi kullanarak uygulama başlatmayı deneyin. Örneğin, dosya işleyicisi uygulamanıza atanmış bir uzantıya sahip dosyaya çift tıklayın.

  • Süreç İzleyicisi'nin aşağıdaki filtrelerle ayarlama:



    alternatif metin

  • Zayıf bir yola ulaşılırsa, aşağıdakine benzer bir şey görüyorsunuz: alternatif metinDll yüklemek için uzak dosya paylaşımına yapılan çağrı, bunun korumasız

    bir program olduğunu gösterir.

Ek Bilgi

Daha fazla bilgi için aşağıdaki Microsoft web sayfalarını ziyaret edin:

Dinamik Bağlantı Kitaplığı Arama Sırası

http://msdn.microsoft.com/library/ms682586(VS.85).aspxSearchPath işleviyle ilgili MSDN belgeleri

http://msdn.microsoft.com/library/aa365527(VS.85).aspxLoadLibrary işleviyle ilgili MSDN belgeleri

http://msdn.microsoft.com/library/ms684175(VS.85).aspxSetDllDirectory işleviyle ilgili MSDN belgeleri

http://msdn.microsoft.com/library/ms686203(VS.85).aspxSetSearchPathMode işleviyle ilgili MSDN belgeleri

http://msdn.microsoft.com/library/dd266735(VS.85).aspxDavid Leblanc'ın blog gönderisi, Microsoft Office ile Sorumlu Güvenlik Mühendisi

http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxAndrew Roths, MSRC Mühendislik ekibinin DLL önceden yükleme saldırılarına yönelik blog gönderisi

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

Ek kaynaklar

Daha fazla yardıma mı ihtiyacınız var?

Daha fazla seçenek mi istiyorsunuz?

Abonelik avantajlarını keşfedin, eğitim kurslarına göz atın, cihazınızın güvenliğini nasıl sağlayacağınızı öğrenin ve daha fazlasını yapın.

Topluluklar, soru sormanıza ve soruları yanıtlamanıza, geri bildirimde bulunmanıza ve zengin bilgiye sahip uzmanlardan bilgi almanıza yardımcı olur.

Bu bilgi yararlı oldu mu?

Dil kalitesinden ne kadar memnunsunuz?
Deneyiminizi ne etkiledi?
Gönder’e bastığınızda, geri bildiriminiz Microsoft ürün ve hizmetlerini geliştirmek için kullanılır. BT yöneticiniz bu verileri toplayabilecek. Gizlilik Bildirimi.

Geri bildiriminiz için teşekkürler!

×