KB5025823 .NET uygulamalarının X.509 sertifikalarını içeri aktarma biçimindeki değişiklik

Uygulandığı Öğe
.NET

Bilginize: Çözümü ve geçici çözümleri güncelleştirmek için 22 Haziran 2023'te revize edildi

Bilginize: 4. ve 5. seçenekler için geçici çözümü güncelleştirmek üzere 15 Haziran 2023'te revize edildi

Arka fon

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

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

Etkilenen yazılım

  • .NET Framework.NET Framework 2.0
  • .NET Framework.NET Framework 4.6.2, 4.7, 4.7.1, 4.7.2
  • .NET Framework.NET Framework 4.8
  • .NET Framework.NET Framework 4.8.1
  • .NET 6.0
  • .NET 7.0

Etkilenen API'ler

Değişiklik açıklaması

13 Haziran 2023'teki değişiklikten önce, .NET Framework ve .NET içeri aktarma için ikili sertifika blobu sunulduğunda, .NET Framework ve .NET genellikle blobun doğrulamasını ve içeri aktarmasını temel alınan işletim sistemine devrederdi. Örneğin, Windows'ta .NET Framework.NET Framework ve .NET doğrulama ve içe aktarma için genellikle PFXImportCertStore API'sini kullanır.

13 Haziran 2023'teki değişiklikten itibaren, .NET Framework ve .NET içeri aktarma için ikili sertifika blobu sunulduğunda, .NET Framework ve .NET bazı durumlarda blobu temel alınan işletim sistemine teslim etmeden önce ek doğrulama gerçekleştirir. Bu ek doğrulama, gelen sertifikanın içeri aktarma sırasında kaynakları kötü amaçlı olarak tüketip tüketmeyeceğini belirlemek için bir dizi sezgisel denetim gerçekleştirir. Bu, temel alınan işletim sisteminin normalde gerçekleştireceği performansın ötesinde ek doğrulama olduğundan, 13 Haziran 2023 değişikliğinden önce başarıyla içeri aktarılmış olan sertifika bloblarını engelleyebilir.

Bilinen regresyonlar

  1. Bir X.509 sertifikası, alışılmadık derecede yüksek parola yineleme sayısı kullanılarak PFX blobu olarak dışarı aktarıldıysa, bu sertifika artık içeri aktarılamayabilir. Sertifika dışarı aktarma tesislerinin çoğu, 2.000 - 10.000 arasında bir 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 işlemi başarısız olur.

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

    Not

    Yukarıdaki gerileme, KB5028608'te ele alınan 22 Haziran 2023 Güncelleştirmesinde ele alınmıştır.

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

    • Windows'un Sertifika Dışa Aktarma Sihirbazı aracılığıyla ve sihirbazda özel anahtarın bir etki alanı kullanıcısına karşı korunması gerektiğini belirterek; veya
    • açık bir -ProtectTo bağımsız değişkenin sağlandığı PowerShell'in Export-PfxCertificate cmdlet'i aracılığıyla; veya
    • Açık bir -protectto argümanın sağlandığı certutil yardımcı programı aracılığıyla; veya
    • PKCS12_PROTECT_TO_DOMAIN_SIDS bayrağının sağlandığı PFXExportCertStoreEx API'si aracılığıyla.

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

Kodunuzdaki tek tek çağrı sitelerinde hedefli değişiklikler yapmak isteyip istemediğinize veya tek bir uygulamanın davranışını değiştirmek isteyip istemediğinize veya makine genelinde değişiklikler yapmak isteyip istemediğinize bağlı olarak çeşitli geçici çözümler vardır.

1. Seçenek (tercih edilen) - Güncelleştirilmiş bir yama yükleyin

Not

Bu, yaygın olarak bildirilen müşteri regresyonlarını giderdiğinden ve uygulamada herhangi bir kod değişikliği gerektirmediğinden tercih edilen seçenektir.

Uygulanabilirlik: Bu seçenek .NET Framework.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ştirmesinde ele alınmıştır.

Microsoft, 13 Haziran 2023 sürümüyle birlikte gelen gerileme yaşayan müşterilerin bu belgenin ilerleyen bölümlerinde listelenen geçici çözümleri denemeden önce bu güncelleştirilmiş yamayı yüklemeyi denemelerini önerir.

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

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

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

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

Güvenilmeyen bir tarafça size verilen bir ortak anahtar sertifika blobunu içeri aktarmanız gerekiyorsa, böyle 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ün ne olduğunu belirlemek için GetCertContentType yöntemini kullanır ve yalnızca bir ortak anahtar sertifika blobunu içeri aktarmayı beklediğiniz durumlarda PFX bloblarını reddeder. Oluşturucu X509Certificate2(byte[]) , 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 bir özel anahtar sertifika blobunu içeri aktarmanız gerekiyorsa ve blobun 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 parola 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);

3. Seçenek - 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.

.NET Framework varsayılan olarak içeri aktarma işlemlerini bir parolanın 600.000 yinelemesinden daha fazla sürmeyecek şekilde sınırlarken, 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çerli olacaktır.

Sınırı değiştirmek için, ortam değişkenini COMPlus_Pkcs12UnspecifiedPasswordIterationLimit yeni sınırın değerine 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 örtülü torbanın yineleme sayısının toplamı olan toplam yineleme sınırını kontrol eder. Açık bir yineleme sayımı <iter_count> kullanarak bir PFX'i manuel olarak dışa aktardıysanız (örneğin, openssl pkcs12 -export -iter <iter_count> aracılığıyla) ve bu PFX blobunu içe 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 herhangi bir açık sınırı biraz aşmasına izin verebilir.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000

Ek denetimleri tamamen bastırmak için, ortam değişkenini aşağıda gösterildiği gibi özel sentinel değeri -1'e ayarlayın.

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

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1

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

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

.NET varsayılan olarak içeri aktarma işlemlerini bir parolanın 600.000'den fazla yinelemesini almayacak şekilde sınırlarken, 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çerli olacaktır.

Sınırı değiştirmek için AppContext anahtarını System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit yeni sınırın değerine 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 örtülü torbanın yineleme sayısının toplamı olan toplam yineleme sınırını kontrol eder. Açık bir yineleme sayımı <iter_count> kullanarak bir PFX'i manuel olarak dışa aktardıysanız (örneğin, openssl pkcs12 -export -iter <iter_count> aracılığıyla) ve bu PFX blobunu içe aktarmak istiyorsanız, bu ortam değişkenini en az tüm beklenen yinelemelerin toplamı kadar büyük bir değere ayarlayın. Pratikte .NET, toplam yineleme sayısının burada yapılandırılan herhangi bir açık sınırı biraz aşmasına izin verebilir.

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

<!--

  • Bu anahtar yalnızca geçerli proje dosyası bir uygulamayı temsil ediyorsa çalışır. Geçerli proje dosyasının paylaşılan bir kitaplığı temsil etmesi durumunda hiçbir etkisi yoktur.

-->

<ItemGroup>

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

</ItemGroup>

Alternatif olarak, aşağıdaki içeriğe sahip runtimeconfig.template.json adlı bir dosyayı, uygulamanızın proje dosyasını içeren aynı dizine 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 kontrolleri tamamen bastırmak için, konfigürasyon anahtarını aşağıda gösterildiği gibi özel sentinel değeri -1 olarak ayarlayın.

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

Uygulamanın proje dosyası içinde (.csproj veya .vbproj):

<!--

  • Bu anahtar yalnızca geçerli proje dosyası bir uygulamayı temsil ediyorsa çalışır. Geçerli proje dosyasının paylaşılan bir kitaplığı temsil etmesi durumunda hiçbir etkisi yoktur.

-->

<ItemGroup>

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

</ItemGroup>

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

{

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

     }

}

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

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.

.NET Framework varsayılan olarak içeri aktarma işlemlerini bir parolanın 600.000 yinelemesinden fazlasını almayacak şekilde sınırlarken, 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çerli olacaktır.

Sınırı değiştirmek için kayıt defteri anahtarı HKLM\Software\Microsoft\.NETFrameworkaltında, değeri Pkcs12UnspecifiedPasswordIterationLimit yeni sınırın ne olması gerektiğine ayarlayın. Örneğin, sınırı 1.000.000 (bir milyon) yineleme olarak ayarlamak için, yükseltilmiş bir komut isteminden aşağıda gösterilen komutları çalıştırın.

  • Bu sayı, MAC yineleme sayısının, şifrelenmiş güvenli içeriklerin ve örtülü torbanın yineleme sayısının toplamı olan toplam yineleme sınırını kontrol eder. Açık bir yineleme sayımı <iter_count> kullanarak bir PFX'i manuel olarak dışa aktardıysanız (örneğin, openssl pkcs12 -export -iter <iter_count> aracılığıyla) ve bu PFX blobunu içe 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ğlıdır. Uygulamaların hedef mimarilerinden bağımsız olarak yapılandırılmış 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ı: Yalnızca hedef makinede çalışan hizmetlerin güvenilmeyen sertifika girişini işlemediğinden eminseniz kayıt defteri değerini -1 olarak ayarlayın.
  • -1 nöbetçisini ayarlamak için, REG_DWORD türü yerine REG_SZ türünü kullanın. Kayıt defteri ayarı mimariye bağlıdır. Uygulamaların hedef mimarilerinden bağımsız olarak yapılandırılmış 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 kayıt defteri 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'ta, .NET Framework.NET Framework PFXImportCertStore işlevi aracılığıyla sertifikaları içe aktarır. Bu işlev, PFX blobunun izin verilen en yüksek yineleme sayısına kendi sınırlarını yerleştirmek de dahil olmak üzere kendi doğrulamasını gerçekleştirir. Bu kontroller yine de PFX ithalatı üzerine yapılacaktır. Bu . 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.