2013-07-20 26 views
5

İşlevinin bir parçası olarak popüler yönetilmeyen bir DLL dosyası kullanan bir C# .NET uygulaması yazdım. DLL, System.Runtime.InteropServices standart DllImport kullanılarak alınır. Ne yazık ki, uygulama (DllImport kullanarak çoğu .NET uygulamasıyla birlikte) DLL Hijacking'e karşı savunmasızdır. I.e. Bir saldırgan, ithal DLL dosyasının malicous kopyasını, uygulamam tarafından açılmış herhangi bir dosyayla aynı dizine yerleştirebilir. Bu, saldırganın kullanıcının makinesine tam denetimini verebilir..NET'te bir DLL Dijital İmzası Nasıl Doğrulanır?

Bu güvenlik açığını gidermek için, bu dosyayı almadan önce DLL dosyasının düzgün şekilde (varsayılan Authenticode ile) imzalandığından emin olmak istiyorum. İmzaların sigcheck.exe gibi araçlarla doğrulanabileceğini biliyorum, ancak bu benim C# kodumun içinden yapmam gerektiğinden benim için geçerli bir çözüm değil.

Bu yüzden sorum şu: DLL yüklenmeden önce bir DLL dosyasının yönetilen C# kodunun içinden geçerli bir Authenticode imzasına sahip olduğunu nasıl doğrulayabilirim?

Sınırlamalar:

  • ithal DLL, bana göre geliştirilmemiştir bir dış firmadan bu.
  • DLL, uygulamam ile birlikte dağıtılmıyor, uygulamanızı çalıştırmadan önce zaten yüklü olması bekleniyor.
  • İçe aktarılan DLL, birçok farklı sürümde (ve hatta daha fazlası) ortaya çıkmaktadır, bu yüzden onu almadan önce sadece verify an MD5 checksum of the DLL kullanamıyorum.

Başarısız yaklaşımlar:

  • Microsoft ancak bu bilgi .NET'in Dllımport için geçerli değildir, preventing "DLL preloading attacks" güzel bir writeup var.
  • Wintrust.dll dosyasından yönetilmeyen işlev WinVerifyTrust kullanımını öneren bazı insanlar gördüm. Bu tabii ki aptalca bir çözümdür, çünkü bunun yerine Wintrust.dll aracılığıyla DLL sıkıştırmaya karşı uygulamamı savunmasız kılabilir. Authenticode verifier'ini kullanmanız gerekir.
+0

Bu, büyük olasılıkla http://stackoverflow.com/questions/3281057/get-timestamp-from-authenticode-signed-files-in-net dosyasının dup dosyasıdır, ancak nasıl yönetilmeyen DLL dosyasının nasıl imzalandığını belirtmiyorsunuz Gerçekten emin olun. –

+1

Neden bir saldırgan sadece * programınızı değiştirmez? Yapması çok daha kolay. –

+0

Hala sigcheck.exe'yi kullanabileceğinizi düşünüyorum.İşlemi C# 'den çalıştırabilir ve çıktıyı yakalayabilirsiniz: http://stackoverflow.com/a/10380353/1415732 – Alden

cevap

1

Yanıtlar this question P/Invoke ürününü kullanmanızı önerir ve yönetilen bir çözüme ihtiyacınız varsa, diğer işlevler arasında Authenticode imzalama ve imza doğrulaması sunan SecureBlackbox kitaplığımızla ilgilenebilirsiniz. Ancak, kendinizi sahte DLL'den yüklemekten korurken, uygulamanın kendisini çatlamadan koruyamazsınız. Dolayısıyla imza doğrulaması, sizi sadece bir saldırı vektöründen korur elbette.

WinTrust.dll dosyasını değiştirmenin, bilgisayara erişim gerektiren farklı bir saldırı vektörüne bağlı olduğunu göstereyim. Bu durumda saldırgan, uygulamanızı tamamen yayabilir.

+0

"CryptQueryObject" (bu yanıtta önerildiği gibi) kullanarak imzayı doğrulamak için , bir CRIPT32.DLL DllImport requres. Gördüğüm gibi bu yerine benim uygulama WinTrust.dll ile nokta olarak aynı şekilde crypt32.dll DLL korsanlığı savunmasız yapardı. Ayrıca, açık kaynak olduğu için başvurumun kırık olduğundan endişelenmiyorum. Kullanıcılarımı, dosyalarımı 0wn3d olmaksızın güvenle uygulayabilmeleri için korumak istiyorum. DLL kaçırma için bir şans varsa – ErikH

+1

@ EricH, o zaman kullanıcının bilgisayar zaten tehlikeye ve sahte crypt32.dll zaten uygulamadan çok uzun, amaçlanan ne yaptı. –