Applies To.NET

Megjegyzés: 2023. június 22-én módosítottuk a megoldás és a kerülő megoldások frissítése érdekében

Megjegyzés: 2023. június 15-én módosítottuk a 4. és az 5. lehetőséggel kapcsolatos munka frissítéséhez 

Háttér

2023. június 13-án a Microsoft kiadott egy biztonsági frissítést a .NET-keretrendszer és a .NET-hez, amely hatással van arra, hogy a futtatókörnyezet hogyan importálja az X.509-tanúsítványokat. Ezek a módosítások miatt előfordulhat, hogy az X.509-tanúsítvány importálása CryptographicException kivételt eredményez olyan esetekben, amikor az importálás a frissítés előtt sikerült volna.

Ez a dokumentum az érintett alkalmazások esetében elérhető módosításokat és kerülő megoldásokat ismerteti.

Érintett szoftver

  • .NET-keretrendszer 2.0

  • .NET-keretrendszer 4.6.2, 4.7, 4.7.1, 4.7.2

  • .NET-keretrendszer 4.8

  • .NET-keretrendszer 4.8.1

  • .NET 6.0

  • .NET 7.0

Érintett API-k

A módosítás leírása

2023. június 13-a előtt módosítsa a módosítást, amikor a .NET-keretrendszer és a .NET bináris tanúsítványblobot jelenik meg importálásra, a .NET-keretrendszer és a .NET általában delegálja a blob ellenőrzését és importálását az alapul szolgáló operációs rendszerre. Windows rendszeren például a .NET-keretrendszer és a .NET általában a PFXImportCertStore API-ra támaszkodik az ellenőrzéshez és az importáláshoz.

2023. június 13-án a változás, amikor a .NET-keretrendszer és a .NET bináris tanúsítványblobot kap importálásra, .NET-keretrendszer és .NET bizonyos körülmények között további ellenőrzést végeznek, mielőtt átadják a blobot az alapul szolgáló operációs rendszernek. Ez a további ellenőrzés heurisztikus ellenőrzések sorozatát hajtja végre annak megállapításához, hogy a bejövő tanúsítvány rosszindulatúan kimeríti-e az erőforrásokat importáláskor. Mivel ez az ellenőrzés a mögöttes operációs rendszer által általában végrehajtottakon túl további ellenőrzés, blokkolhatja azokat a tanúsítványblobokat, amelyek a 2023. június 13-i módosítás előtt sikeresen importálva lettek volna.

Ismert regressziók

  1. Ha egy X.509-tanúsítványt PFX-blobként exportáltak egy ritkán magas jelszó-iterációszám használatával, előfordulhat, hogy a tanúsítvány importálása sikertelen lesz. A legtöbb tanúsítványexportálási létesítmény iterációs számot használ valahol 2000 és 10 000 között. A biztonsági frissítés alkalmazása után az importálás sikertelen lesz a 600 000-nél nagyobb iterációs számot tartalmazó tanúsítványok esetében.

  2. Ha egy X.509-tanúsítványt null jelszóval exportáltak [példáulX509Certificate.Export(X509ContentType.Pfx, (string)null)vagy a jelszó nélküliX509Certificate.Export(X509ContentType.Pfx)]keresztül, előfordulhat, hogy a tanúsítvány importálása sikertelen lesz.  

    Megjegyzés: A fenti regresszióval a KB5028608-ban tárgyalt 2023. június 22-i frissítés foglalkozik.

  3. Ha egy X.509-tanúsítvány PFX-blobként lett exportálva, és a Windows képes megvédeni a titkos kulcsot egy SID-hez, előfordulhat, hogy a tanúsítvány importálása sikertelen lesz. Ez a következő módon létrehozott PFX-blobokra lesz hatással:

    • A Windows Tanúsítványexportáló varázslóján keresztül, és a varázslóban megadva, hogy a titkos kulcsot egy tartományi felhasználónak kell védeni; Vagy

    • A PowerShell Export-PfxCertificate parancsmagján keresztül, ahol explicit -ProtectTo argumentum van megadva; Vagy

    • A certutil segédprogramon keresztül, ahol explicit -protectto argumentumot ad meg; Vagy

    • A PFXExportCertStoreEx API-val, ahol a PKCS12_PROTECT_TO_DOMAIN_SIDS jelző van megadva.

Megoldás & kerülő megoldások

Különböző áthidaló megoldások léteznek attól függően, hogy célzott módosításokat szeretne végezni a kódon belül az egyes hívási helyeken, vagy egy alkalmazás viselkedését szeretné módosítani, vagy gépi szintű módosításokat szeretne végezni.

1. lehetőség (előnyben részesített) – Frissített javítás telepítése

Megjegyzés: Ez az előnyben részesített lehetőség, mivel a gyakran jelentett ügyfélregressziókat kezeli, és nem igényel kódmódosítást az alkalmazásban.

Alkalmazhatóság: Ez a beállítás a .NET-keretrendszer és a .NET összes verziójára vonatkozik.

Ezt a problémát a KB5028608-ban tárgyalt, 2023. június 22-i frissítésben javítottuk.

A Microsoft azt javasolja, hogy azok az ügyfelek, akik 2023. június 13-án megjelent regressziót tapasztalnak, először telepítse ezt a frissített javítást, mielőtt megpróbálkoznak a jelen dokumentumban később felsorolt megkerülő megoldásokkal.

2. lehetőség – A hívási hely módosítása

Alkalmazhatóság: Ez a beállítás a .NET-keretrendszer és a .NET összes verziójára vonatkozik.

Gondolja át, hogy az importált blob megbízható-e. Például a blobot megbízható helyről, például egy adatbázisból vagy konfigurációs fájlból kérték le az Ön felügyelete alatt, vagy egy nem hitelesített vagy nemprivilegált ügyfél által küldött hálózati kérésen keresztül kapta?

A Microsoft határozottan javasolja, hogy ne importálja a nem hitelesített vagy nem kiemelt ügyfelek által biztosított PFX-blobokat, mivel ezek a blobok rosszindulatú erőforrás-elfogyási viselkedéseket tartalmazhatnak.

Ha nem megbízható féltől kapott nyilvánoskulcs-tanúsítványblobot kell importálnia, az alábbi kóddal biztonságosan importálhatja az ilyen blobot. Ez a mintakód a GetCertContentType metódussal határozza meg, hogy mi a tanúsítványblob mögöttes típusa, és elutasítja a PFX-blobokat olyan esetekben, amikor csak egy nyilvános kulcsú tanúsítványblob importálására számít. AX509Certificate2(byte[]) konstruktor biztonságosan használható nem megbízható nem PFX-blobok esetén.

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);
    }
} 

Ha jelszó nélküli titkoskulcs-tanúsítványblobot kell importálnia, és megállapította, hogy a blob megbízható, letilthatja a 2023. június 13-i biztonsági kiadásban végrehajtott további ellenőrzési ellenőrzéseket egy másik konstruktor-túlterhelés meghívásával. Meghívhatja például a konstruktor túlterhelését, amely elfogadja a sztring jelszóargumentumát, és null értéket ad át az argumentum értékének. 

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. lehetőség – A további ellenőrzés módosítása vagy mellőzése környezeti változó használatával

Alkalmazhatóság: Ez a beállítás csak az .NET-keretrendszer összes verziójára vonatkozik.  Nem vonatkozik a .NET 6.0-s vagy újabb verziókra.

Bár .NET-keretrendszer alapértelmezés szerint a jelszó legfeljebb 600 000 iterációját veszi igénybe, ez a korlát alkalmazás- vagy gépszintű alapon konfigurálható egy környezeti változó használatával. Ez az új korlát a fent felsorolt érintett API-k összes meghívására vonatkozik.

A korlát módosításához állítsa aCOMPlus_Pkcs12UnspecifiedPasswordIterationLimitkörnyezeti változót az új korlát értékére. Ha például 1 000 000 (egymillió) iterációra szeretné állítani a korlátot, állítsa be a környezeti változót az alább látható módon.

  • Ez a szám szabályozza a teljes iterációs korlátot, amely a MAC-iterációk számának, a titkosított biztonságos tartalmaknak és az útválasztásos zsákok iterációinak száma. Ha manuálisan exportált egy PFX-et egy explicit iterációszám-<iter_count> (például az openssl pkcs12 -export -iter <iter_count>), és importálni szeretné ezt a PFX-blobot, állítsa ezt a környezeti változót legalább akkora értékre, mint az összes várt iteráció összege. A gyakorlatban a .NET-keretrendszer és a .NET lehetővé teheti, hogy a teljes iterációszám kis mértékben meghaladja az itt konfigurált explicit korlátot.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000

A további ellenőrzések teljes mellőzéséhez állítsa a környezeti változót a -1 speciális sentinel értékre az alább látható módon.

  • ⚠️ Figyelmeztetés: Csak akkor állítsa a környezeti változó értékét -1 értékre, ha biztos abban, hogy a célalkalmazás nem kezeli a nem megbízható tanúsítványbemenetet.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1

4. lehetőség – A további ellenőrzés módosítása vagy mellőzése az AppContext használatával

Alkalmazhatóság: Ez a beállítás csak a .NET 6.0-s és újabb verziókra vonatkozik.  Nem vonatkozik a .NET-keretrendszer

Bár a .NET alapértelmezés szerint legfeljebb 600 000 iterációt vesz igénybe egy jelszó importálásához, ez a korlát alkalmazásszintű konfigurálható az AppContext kapcsolóval. Ez az új korlát a fent felsorolt érintett API-k összes meghívására vonatkozik.

A korlát módosításához állítsa a System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit AppContext kapcsolót az új korlát értékére. Ha például 1 000 000 (egymillió) iterációra szeretné állítani a korlátot, állítsa be a kapcsolót az alább látható módon.

  • Ez a szám szabályozza a teljes iterációs korlátot, amely a MAC-iterációk számának, a titkosított biztonságos tartalmaknak és az útválasztásos zsákok iterációinak száma. Ha manuálisan exportált egy PFX-et egy explicit iterációszám-<iter_count> (például az openssl pkcs12 -export -iter <iter_count>), és importálni szeretné ezt a PFX-blobot, állítsa ezt a környezeti változót legalább akkora értékre, mint az összes várt iteráció összege. A gyakorlatban a .NET lehetővé teheti, hogy a teljes iterációszám kis mértékben túllépje az itt konfigurált explicit korlátot.

A kapcsoló beállítása az alkalmazás projektfájljában (.csproj vagy .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="1000000" />

</ItemGroup>

Másik lehetőségként elhelyezhet egy runtimeconfig.template.json nevű fájlt, amelyben a következő tartalom található ugyanabban a könyvtárban, amely az alkalmazás projektfájlját tartalmazza:

{

     "configProperties": {

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

      }

}

A .NET-futtatókörnyezet konfigurációs beállításainak módosításával kapcsolatos további információkért tekintse meg a .NET-futtatókörnyezet konfigurációs beállításainak dokumentációs oldalát.

A további ellenőrzések teljes mellőzéséhez állítsa be a konfigurációs kapcsolót a -1 speciális sentinel értékre, az alább látható módon.

⚠️ Figyelmeztetés: Csak akkor állítsa az AppContext kapcsolót -1 értékre, ha biztos abban, hogy a célalkalmazás nem kezeli a nem megbízható tanúsítványbemenetet.

Az alkalmazás projektfájljában (.csproj vagy .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>

Vagy a runtimeconfig.template.json fájlban:

{

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

     }

}

5. lehetőség – A további érvényesítési gépi beállítások módosítása vagy letiltása a beállításjegyzéken keresztül (csak Windows .NET-keretrendszer esetén)

Alkalmazhatóság: Ez a beállítás csak az .NET-keretrendszer összes verziójára vonatkozik.  Nem vonatkozik a .NET 6.0-s vagy újabb verziókra.

Bár .NET-keretrendszer alapértelmezés szerint a jelszó legfeljebb 600 000 iterációját veszi igénybe, ez a korlát gépszintű konfigurálható a HKLM beállításjegyzékével. Ez az új korlát a fent felsorolt érintett API-k összes meghívására vonatkozik.

A korlát módosításához a beállításkulcsHKLM\Software\Microsoft\.NETFrameworkalatt állítsa aPkcs12UnspecifiedPasswordIterationLimitértéket az új korlátra. Ha például 1 000 000 (egymillió) iterációra szeretné állítani a korlátot, futtassa az alábbi parancsokat egy emelt szintű parancssorból.

  • Ez a szám szabályozza a teljes iterációs korlátot, amely a MAC-iterációk számának, a titkosított biztonságos tartalmaknak és az útválasztásos zsákok iterációinak száma. Ha manuálisan exportált egy PFX-et explicit iterációszám-<iter_count> (például openssl pkcs12 -export -iter <iter_count>), és importálni szeretné ezt a PFX-blobot, állítsa ezt a beállításjegyzék-értéket legalább akkora értékre, mint az összes várt iteráció összege. A gyakorlatban .NET-keretrendszer lehetővé teheti, hogy a teljes iterációszám kissé meghaladja az itt konfigurált explicit korlátot.

  • A beállításjegyzék-beállítás architektúrafüggő. Annak érdekében, hogy az alkalmazások a célarchitektúrától függetlenül betartsák a konfigurált értéket, ne felejtse el módosítani a 32 bites és a 64 bites beállításjegyzékeket is, ahogy az alább látható.

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

A további ellenőrzések teljes mellőzéséhez állítsa a beállításazonosítót -1 értékre egy emelt szintű parancssorból, ahogy az alább látható.

  • ⚠️ Figyelmeztetés: Csak akkor állítsa a beállításjegyzék értékét -1 értékre, ha biztos abban, hogy a célgépen futó szolgáltatások nem kezelik a nem megbízható tanúsítványbemenetet.

  • A -1 sentinel beállításához a REG_DWORD típus helyett használja a REG_SZ típust. A beállításjegyzék-beállítás architektúrafüggő. Annak érdekében, hogy az alkalmazások a célarchitektúrától függetlenül betartsák a konfigurált értéket, ne felejtse el módosítani a 32 bites és a 64 bites beállításjegyzékeket is, ahogy az alább látható.

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

A beállításjegyzék módosításainak visszaállításához törölje a Pkcs12UnspecifiedPasswordIterationLimit reg értéket egy emelt szintű parancssorból.

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

Windows-specifikus megjegyzések

Windows rendszeren .NET-keretrendszer importálja a tanúsítványokat a PFXImportCertStore függvényen keresztül. Ez a függvény saját ellenőrzést hajt végre, beleértve a saját korlátainak elhelyezését a PFX-blobok megengedett maximális iterációinak számára. Ezek az ellenőrzések a PFX-importáláskor is lezajlanak. A. A fent leírt NET-specifikus környezeti változók és beállításkulcsok nem befolyásolják, hogy a PFXImportCertStore hogyan végzi el ezeket az ellenőrzéseket.

További segítségre van szüksége?

További lehetőségeket szeretne?

Fedezze fel az előfizetés előnyeit, böngésszen az oktatóanyagok között, ismerje meg, hogyan teheti biztonságossá eszközét, és így tovább.

A közösségek segítségével kérdéseket tehet fel és válaszolhat meg, visszajelzést adhat, és részletes ismeretekkel rendelkező szakértőktől hallhat.