Applies To.NET

Not: Çözümü ve geçici çözümleri güncelleştirmek için 22 Haziran 2023'e düzeltildi

Not: 15 Haziran 2023,4 ve 5 seçeneklerine geçici bir çözüm olarak düzeltildi 

Arka plan

13 Haziran 2023'te Microsoft, .NET Framework ve .NET için çalışma zamanının X.509 sertifikalarını içeri aktarma şeklini etkileyen bir güvenlik güncelleştirmesi yayımladı. Bu değişiklikler X.509 sertifika içeri aktarma işleminin güncelleştirmeden önce içeri aktarmanın başarılı olacağı senaryolarda CryptographicException oluşturmasına neden olabilir.

Bu belgede, etkilenen uygulamalar için kullanılabilecek değişiklik ve geçici çözümler açıklanmaktadır.

Etkilenen yazılım

  • .NET Framework 2.0

  • .NET Framework 4.6.2, 4.7, 4.7.1, 4.7.2

  • .NET Framework 4.8

  • .NET Framework 4.8.1

  • .NET 6.0

  • .NET 7.0

Etkilenen API'ler

Değişikliğin açıklaması

13 Haziran 2023 tarihinden önce, .NET Framework ve .NET'e içeri aktarma için bir ikili sertifika blobu sunulduğunda değişiklik .NET Framework ve .NET genellikle blobun doğrulanıp temel alınan işletim sistemine aktarılmasını temsilci olarak belirler. Örneğin, Windows'da .NET Framework ve .NET genellikle doğrulama ve içeri aktarma için PFXImportCertStore API'sini kullanır.

13 Haziran 2023 itibarıyla, .NET Framework ve .NET'e içeri aktarma için ikili sertifika blobu sunulduğunda .NET Framework ve .NET bazı durumlarda blobu temel işletim sistemine teslim etmeden önce ek doğrulama gerçekleştirir. Bu ek doğrulama, gelen sertifikanın içeri aktarma işleminde kaynakları kötü amaçlı olarak tüketip tüketmeyeceğini belirlemek için bir dizi buluşsal denetim gerçekleştirir. Bu, temel işletim sisteminin normalde gerçekleştireceği performansın ötesinde ek doğrulama olduğundan, 13 Haziran 2023'ten önce başarıyla içeri aktarılan sertifika bloblarını engelleyebilir.

Bilinen regresyonlar

  1. Bir X.509 sertifikası, yaygın olmayan yüksek parola yineleme sayısı kullanılarak PFX blobu olarak dışarı aktarıldıysa, bu sertifika artık içeri aktarılamayabilir. Çoğu sertifika dışarı aktarma tesisi 2.000 - 10.000 arasında bir yerde yineleme sayısı kullanır. Güvenlik güncelleştirmesi uygulandıktan sonra, yineleme sayısı 600.000'den büyük olan sertifikalar için içeri aktarma başarısız olur.

  2. X.509 sertifikası null parola kullanılarak dışarı aktarıldıysa [örneğin,X509Certificate.Export(X509ContentType.Pfx, (string)null)veya parolasızX509Certificate.Export(X509ContentType.Pfx)]aracılığıyla bu sertifika artık içeri aktarılamaz.  

    Not: Yukarıdaki regresyon, KB5028608'de ele alınan 22 Haziran 2023 Güncelleştirmesi'nde giderilmiştir.

  3. Bir X.509 sertifikası, Windows'un özel anahtarı SID'ye koruma özelliği kullanılarak PFX blobu olarak dışarı aktarıldıysa, bu sertifika artık içeri aktarılamaz. Bu, aşağıdaki şekilde oluşturulan PFX bloblarını etkiler:

    • Windows Sertifika Dışarı Aktarma Sihirbazı aracılığıyla ve sihirbazda özel anahtarın bir etki alanı kullanıcısı için korunması gerektiğini belirterek; Veya

    • Açık bir -ProtectTo bağımsız değişkeninin sağlandığı PowerShell'in Export-PfxCertificate cmdlet'i aracılığıyla; Veya

    • Açık bir -protectto bağımsız değişkeninin sağlandığı certutil yardımcı programı aracılığıyla; Veya

    • PKCS12_PROTECT_TO_DOMAIN_SIDS bayrağının sağlandığı PFXExportCertStoreEx API'sini kullanarak.

Çözüm & Geçici Çözümler

Kodunuzun içindeki tek tek çağrı sitelerinde hedeflenen değişiklikler yapmak mı yoksa tek bir uygulamanın davranışını değiştirmek mi yoksa makine genelinde değişiklikler yapmak mı istediğinize bağlı olarak çeşitli geçici çözümler mevcuttur.

Seçenek 1 (tercih edilen) - Güncelleştirilmiş bir düzeltme eki yükleme

Not: Yaygın olarak bildirilen müşteri regresyonlarını giderdiğinden ve uygulamada kod değişikliği gerektirmediğinden bu tercih edilen seçenektir.

Uygulanabilirlik: Bu seçenek .NET Framework ve .NET'in tüm sürümleri için geçerlidir.

Bu sorun, KB5028608'de ele alınan 22 Haziran 2023 Güncelleştirmesi'nde giderilmiştir.

Microsoft, 13 Haziran 2023'te kullanıma sunulan regresyonlarla karşılaşan müşterilerin, bu belgenin devamında listelenen geçici çözümleri denemeden önce bu güncelleştirilmiş düzeltme ekini yüklemeyi denemelerini önerir.

Seçenek 2 - Arama sitesini değiştirme

Uygulanabilirlik: Bu seçenek .NET Framework ve .NET'in tüm sürümleri için geçerlidir.

İçeri aktardığınız blob'un güvenilir olup olmadığını göz önünde bulundurun. Örneğin blob, denetiminizdeki veritabanı veya yapılandırma dosyası gibi güvenilir bir konumdan mı alındı yoksa kimliği doğrulanmamış veya ayrıcalıksız bir istemci tarafından yapılan bir ağ isteği aracılığıyla mı sağlandı?

Microsoft, kimliği doğrulanmamış veya ayrıcalıksız istemciler tarafından sağlanan PFX bloblarını içeri aktarmamanızı kesinlikle önerir. Bu bloblar kötü amaçlı kaynak tükenme davranışları içerebilir.

Güvenilmeyen bir taraf tarafından size verilen bir ortak anahtar sertifika blobunu içeri aktarmanız gerekiyorsa, bu tür bir blobu güvenli bir şekilde içeri aktarmak için aşağıdaki kodu kullanabilirsiniz. Bu örnek kod, sertifika blobunun temel türünü belirlemek için GetCertContentType yöntemini kullanır ve yalnızca ortak anahtar sertifika blobunu içeri aktarmayı beklediğiniz durumlarda PFX bloblarını reddeder. X509Certificate2(byte[]) oluşturucu, güvenilmeyen PFX olmayan bloblar verildiğinde kullanım için güvenlidir.

using System.Security.Cryptography.X509Certificates;
public static X509Certificate2 ImportPublicCertificateBlob(byte[] blob)
{
     if (X509Certificate2.GetCertContentType(blob) == X509ContentType.Pfx)
    {
          throw new Exception("PFX blobs are disallowed.");
    }
   else
   {
         // Import only after we have confirmed it's not a PFX.
        return new X509Certificate2(blob);
    }
} 

Parolasız özel anahtar sertifika blobunu içeri aktarmanız gerekiyorsa ve blob'un güvenilir olduğunu belirlediyseniz, farklı bir oluşturucu aşırı yüklemesini çağırarak 13 Haziran 2023 güvenlik sürümü tarafından gerçekleştirilen ek doğrulama denetimlerini gizleyebilirsiniz. Örneğin, bir dize parolası bağımsız değişkenini kabul eden ve bağımsız değişken değeri için null geçiren oluşturucu aşırı yüklemesini çağırabilirsiniz. 

byte[] blobToImport = GetBlobToImport(); // fetch this from a database, config, etc. 

// REGRESSION - byte[] ctor performs additional security checks X509Certificate2 certA = new X509Certificate2(blobToImport);

// RECOMMENDED WORKAROUND - different ctor overload suppresses additional security checks X509Certificate2 certB = new X509Certificate2(blobToImport, (string)null);

Seçenek 3 - Ortam değişkeni kullanarak ek doğrulamayı değiştirme veya gizleme

Uygulanabilirlik: Bu seçenek yalnızca .NET Framework tüm sürümleri için geçerlidir.  .NET 6.0+ için geçerli değildir.

varsayılan olarak .NET Framework içeri aktarma işlemlerini parolanın en fazla 600.000 yinelemesini alacak şekilde sınırlasa da, bu sınır bir ortam değişkeni kullanılarak uygulama genelinde veya makine genelinde yapılandırılabilir. Bu yeni sınır, yukarıda listelenen Etkilenen API'lerin tüm çağrıları için geçerlidir.

Sınırı değiştirmek için ortam değişkeniniCOMPlus_Pkcs12UnspecifiedPasswordIterationLimityeni sınırın olması gereken değere ayarlayın. Örneğin, sınırı 1.000.000 (bir milyon) yineleme olarak ayarlamak için ortam değişkenini aşağıda gösterildiği gibi ayarlayın.

  • Bu sayı, MAC yineleme sayısının, şifrelenmiş güvenli içeriklerin ve kısıtlanmış torbanın yineleme sayısının toplamı olan toplam yineleme sınırını denetler. Açık yineleme sayısı <iter_count> kullanarak bir PFX'i el ile dışarı aktardıysanız (örneğin, openssl pkcs12 -export -iter <iter_count> aracılığıyla) ve bu PFX blobunu içeri aktarmak istiyorsanız, bu ortam değişkenini en az tüm beklenen yinelemelerin toplamı kadar büyük bir değere ayarlayın. Uygulamada, .NET Framework ve .NET, toplam yineleme sayısının burada yapılandırılan açık sınırı biraz aşmasına izin verebilir.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000

Ek denetimleri tamamen engellemek için ortam değişkenini aşağıda gösterildiği gibi -1 özel sentinel değerine ayarlayın.

  • ⚠️ Uyarı: Hedef uygulamanın güvenilmeyen sertifika girişini işlemediğinden eminseniz ortam değişkeni değerini yalnızca -1 olarak ayarlayın.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1

Seçenek 4 - AppContext kullanarak ek doğrulamayı değiştirme veya gizleme

Uygulanabilirlik: Bu seçenek yalnızca .NET 6.0+ için geçerlidir.  .NET Framework için geçerli değildir

.NET varsayılan olarak içeri aktarma işlemlerini parolanın en fazla 600.000 yinelemesini alacak şekilde sınırlasa da, bu sınır AppContext anahtarı kullanılarak uygulama genelinde yapılandırılabilir. Bu yeni sınır, yukarıda listelenen Etkilenen API'lerin tüm çağrıları için geçerlidir.

Sınırı değiştirmek için System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit AppContext anahtarını yeni sınırın olması gereken değere ayarlayın. Örneğin, sınırı 1.000.000 (bir milyon) yineleme olarak ayarlamak için anahtarı aşağıda gösterildiği gibi ayarlayın.

  • Bu sayı, MAC yineleme sayısının, şifrelenmiş güvenli içeriklerin ve kısıtlanmış torbanın yineleme sayısının toplamı olan toplam yineleme sınırını denetler. Açık yineleme sayısı <iter_count> kullanarak bir PFX'i el ile dışarı aktardıysanız (örneğin, openssl pkcs12 -export -iter <iter_count> aracılığıyla) ve bu PFX blobunu içeri aktarmak istiyorsanız, bu ortam değişkenini en az tüm beklenen yinelemelerin toplamı kadar büyük bir değere ayarlayın. Uygulamada.NET, toplam yineleme sayısının burada yapılandırılan açık sınırları biraz aşmasına izin verebilir.

Anahtarı uygulamanızın proje dosyasında (.csproj veya .vbproj) ayarlamak için:

<!--

  • This switch only works if the current project file represents an application. It has no effect if the current project file represents a shared library.

-->

<ItemGroup>

  • <RuntimeHostConfigurationOption Include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" Value="1000000" />

</ItemGroup>

Alternatif olarak, uygulamanızın proje dosyasını içeren aynı dizine aşağıdaki içeriklerle runtimeconfig.template.json adlı bir dosya yerleştirebilirsiniz:

{

     "configProperties": {

  • "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": 1000000

      }

}

.NET çalışma zamanı yapılandırma ayarlarını değiştirme hakkında daha fazla bilgi için .NET Çalışma Zamanı yapılandırma ayarları belge sayfasına bakın.

Ek denetimleri tamamen engellemek için yapılandırma anahtarını aşağıda gösterildiği gibi -1 özel sentinel değerini ayarlayın.

⚠️ Uyarı: Hedef uygulamanın güvenilmeyen sertifika girişini işlemediğinden eminseniz AppContext anahtarını yalnızca -1 olarak ayarlayın.

Uygulamanın proje dosyasında (.csproj veya .vbproj):

<!--

  • This switch only works if the current project file represents an application. It has no effect if the current project file represents a shared library.

-->

<ItemGroup>

  • <RuntimeHostConfigurationOption Include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" Value="-1" />

</ItemGroup>

Veya runtimeconfig.template.json dosyasının içinde:

{

  • "configProperties": { 
  •     "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": -1

     }

}

Seçenek 5 - Kayıt defteri aracılığıyla ek doğrulama makinesi genelinde değiştirme veya gizleme (.NET Framework için yalnızca Windows)

Uygulanabilirlik: Bu seçenek yalnızca .NET Framework tüm sürümleri için geçerlidir.  .NET 6.0+ için geçerli değildir.

varsayılan olarak .NET Framework içeri aktarma işlemlerini parolanın en fazla 600.000 yinelemesini alacak şekilde sınırlasa da, bu sınır HKLM kayıt defteri kullanılarak makine genelinde yapılandırılabilir. Bu yeni sınır, yukarıda listelenen Etkilenen API'lerin tüm çağrıları için geçerlidir.

Sınırı değiştirmek için, kayıt defteri anahtarıHKLM\Software\Microsoft\.NETFrameworkaltındaPkcs12UnspecifiedPasswordIterationLimitdeğerini yeni sınırın olması gereken değere ayarlayın. Örneğin, sınırı 1.000.000 (bir milyon) yineleme olarak ayarlamak için, yükseltilmiş komut isteminden aşağıda gösterildiği gibi komutları çalıştırın.

  • Bu sayı, MAC yineleme sayısının, şifrelenmiş güvenli içeriklerin ve kısıtlanmış torbanın yineleme sayısının toplamı olan toplam yineleme sınırını denetler. Açık yineleme sayısı <iter_count> kullanarak bir PFX'i el ile dışarı aktardıysanız (örneğin, openssl pkcs12 -export -iter <iter_count> aracılığıyla) ve bu PFX blobunu içeri aktarmak istiyorsanız, bu kayıt defteri değerini en az tüm beklenen yinelemelerin toplamı kadar büyük bir değere ayarlayın. Uygulamada, .NET Framework toplam yineleme sayısının burada yapılandırılan herhangi bir açık sınırı biraz aşmasına izin verebilir.

  • Kayıt defteri ayarı mimariye bağımlıdır. Uygulamaların hedef mimarilerinden bağımsız olarak yapılandırılan değerinizi gözlemlediğinden emin olmak için, aşağıda gösterildiği gibi hem 32 bit hem de 64 bit kayıt defterlerini değiştirmeyi unutmayın.

reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_DWORD /d 1000000 /reg:32 reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_DWORD /d 1000000 /reg:64

Ek denetimleri tamamen engellemek için, aşağıda gösterildiği gibi yükseltilmiş bir komut isteminden kayıt defteri değerini -1 olarak ayarlayın.

  • ⚠️ Uyarı: Kayıt defteri değerini yalnızca hedef makinede çalışan hizmetlerin güvenilmeyen sertifika girişini işlemediğinden eminseniz -1 olarak ayarlayın.

  • -1 sentinel değerini ayarlamak için REG_DWORD türü yerine REG_SZ türünü kullanın. Kayıt defteri ayarı mimariye bağımlıdır. Uygulamaların hedef mimarilerinden bağımsız olarak yapılandırılan değerinizi gözlemlediğinden emin olmak için, aşağıda gösterildiği gibi hem 32 bit hem de 64 bit kayıt defterlerini değiştirmeyi unutmayın.

reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_SZ /d -1 /reg:32 reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_SZ /d -1 /reg:64

Kayıt defteri değişikliklerini geri almak için, yükseltilmiş komut isteminden Pkcs12UnspecifiedPasswordIterationLimit reg değerini silin.

reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:32 reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:64

Windows'a özgü notlar

Windows.NET Framework PFXImportCertStore işlevi aracılığıyla sertifikaları içeri aktarın. Bu işlev, bir PFX blob'un izin verilen en yüksek yineleme sayımına kendi sınırlarını koymak da dahil olmak üzere kendi doğrulamasını gerçekleştirir. Bu denetimler PFX içeri aktarıldıktan sonra da gerçekleşir. . Yukarıda açıklanan NET'e özgü ortam değişkenleri ve kayıt defteri anahtarları, PFXImportCertStore'un bu denetimleri nasıl gerçekleştirdiğini etkilemez.

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.