Megjegyzés: Felülvizsgálva 2023. június 22-én a megoldás és a kerülő megoldások frissítése érdekében
Megjegyzés: Felülvizsgálva 2023. június 15-én a 4-es és 5-ös kerülő megoldás frissítése érdekében
Háttér
A Microsoft 2023. június 13-án kiadott egy biztonsági frissítést a .NET-keretrendszer és a .NET számára, amely hatással van arra, hogy a futtatókörnyezet hogyan importálja az X.509-tanúsítványokat. E módosítások miatt előfordulhat, hogy az X.509-tanúsítvány importálása CryptographicException hibát vált ki olyan forgatókönyvekben, amikor az importálás a frissítés előtt sikeres lett volna.
Ez a dokumentum az érintett alkalmazások módosításait és kerülő megoldásait ismerteti.
Érintett szoftverek
- .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
- new X509Certificate(byte[])
- X509Certificate.Import(bájt[])
- new X509Certificate2(byte[])
- X509Certificate2.Import(bájt[])
- X509Certificate2Collection.Import(bájt[])
A változás leírása
A 2023. június 13-i módosítást megelőzően, amikor a .NET-keretrendszer és a .NET bináris tanúsítványblobot jelenít meg importálásra, a .NET-keretrendszer és a .NET általában delegálja a blob érvényesítését és importálását a mögöttes operációs rendszerre. Windows rendszeren például a .NET-keretrendszer és a .NET rendszer általában a PFXImportCertStore API-t használja az ellenőrzéshez és az importáláshoz.
A 2023. június 13-i változástól kezdve, amikor a .NET-keretrendszer és a .NET bináris tanúsítványblobot mutat be importálásra, a .NET-keretrendszer és a .NET bizonyos körülmények között további ellenőrzést fog végezni, mielőtt átadja a blobot a mögöttes operációs rendszernek. Ez a kiegészítő 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 kártékony módon kimeríti-e az erőforrásokat importáláskor. Mivel ez egy további ellenőrzés azon felül, amit a mögöttes operációs rendszer általában végezne, letilthatja azokat a tanúsítványblobokat, amelyek a 2023. június 13-i módosítás előtt sikeresen importálódtak volna.
Ismert regressziók
Ha egy X.509-tanúsítványt PFX-blobként exportált szokatlanul magas jelszó-iterációs 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ó létesítmény közelítési arányt használ valahol 2000 és 10 000 között. A biztonsági frissítés telepítését követően a 600 000-nél nagyobb iterációszámot tartalmazó tanúsítványok importálása sikertelen lesz.
Ha egy X.509-tanúsítványt null jelszóval exportált (pl. a jelszón keresztül
X509Certificate.Export(X509ContentType.Pfx, (string)null)vagy a jelszó nélkül,X509Certificate.Export(X509ContentType.Pfx)]előfordulhat, hogy a tanúsítvány importálása sikertelen lesz.
Megjegyzés
A fenti regresszióval a KB5028608-ben tárgyalt 22. június 22-i frissítés foglalkozott.
Ha egy X.509-tanúsítványt PFX-blobként exportált a Windows biztonsági azonosító titkos kulcsának védelmére szolgáló képességét használva, előfordulhat, hogy a tanúsítvány importálása sikertelen lesz. Ez hatással lesz a következő módokon létrehozott PFX-blobokra:
- A Windows Tanúsítványexportáló varázslóján keresztül, és a varázslóban megadva, hogy a titkos kulcsot védeni kell a tartományi felhasználó számára; vagy
- A PowerShell Export-PfxCertificate parancsmagján keresztül, ahol egy explicit
-ProtectToargumentum meg van adva; vagy - A certutil segédprogrammal, ahol egy explicit
-protecttoargumentum meg van adva; vagy - A PFXExportCertStoreEx API-n keresztül, ahol a PKCS12_PROTECT_TO_DOMAIN_SIDS jelölő meg van adva.
Megoldás & kerülő megoldások
Számos kerülő megoldás létezik attól függően, hogy célzott módosításokat szeretne-e végezni a kód egyes híváshelyein, vagy egy alkalmazás működését szeretné megváltoztatni, vagy az egész gépre kiterjedő változtatásokat szeretne végrehajtani.
1. lehetőség (előnyben részesített) – Frissített javítás telepítése
Megjegyzés
Ez az ajánlott megoldás, mivel az ügyfelek gyakran jelentett regresszióit kezeli, és nem igényel semmilyen 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-ben tárgyalt 2023. június 22-i frissítésben javítottuk.
A Microsoft azt javasolja a 2023. június 13-i kiadással bevezetett regressziókat tapasztaló ügyfeleknek, hogy próbálják meg telepíteni ezt a frissített javítást, mielőtt megpróbálják végrehajtani a dokumentumban később felsorolt kerülő megoldásokat.
2. lehetőség: A hívási webhely módosítása
Alkalmazhatóság: Ez a beállítás a .NET-keretrendszer és a .NET összes verziójára vonatkozik.
Fontolja meg, hogy az importált blob megbízható-e. Például a blob lekérése megbízható helyről történt, például egy az Ön ellenőrzése alatt álló adatbázisból vagy konfigurációs fájlból, vagy egy nem hitelesített vagy nem jogosultsággal rendelkező ügyfél által küldött hálózati kérelemen keresztül történt?
A Microsoft kifejezetten javasolja, hogy ne importáljon nem hitelesített vagy jogosultsággal nem rendelkező ügyfelektől kapott PFX-blobokat, mivel ezek a blobok rosszindulatú erőforrás-kimerítési viselkedést tartalmazhatnak.
Ha egy nem megbízható féltől kapott nyilvános kulcsú tanúsítványblobot kell importálnia, az alábbi kóddal biztonságosan importálhat ilyen blobokat. Ez a mintakód a GetCertContentType metódust használja a tanúsítványblob alapjául szolgáló típus meghatározásához, és elutasítja a PFX-blobokat olyan esetekben, amikor csak nyilvános kulcsú tanúsítványblob importálását várja. A X509Certificate2(byte[]) konstruktor biztonságosan használható, ha nem megbízható nem PFX-blobokat ad meg.
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 titkos kulcs 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ás által végrehajtott további érvényesítési ellenőrzéseket egy másik konstruktor túlterhelésének meghívásával. Meghívhatja például a konstruktor túlterhelését, amely elfogad egy sztringjelszó argumentumot, és null értéket ad át az argumentum értékeként.
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 érvényesítés módosítása vagy letiltása környezeti változó használatával
Alkalmazhatóság: Ez a beállítás csak a .NET-keretrendszer összes verziójára vonatkozik. Nem vonatkozik a .NET 6.0+ verzióra.
Míg a .NET-keretrendszer alapértelmezés szerint az importálási műveleteket legfeljebb 600 000 jelszóra korlátozza, ez a korlát alkalmazás- vagy gépszintű szinten konfigurálható egy környezeti változó használatával. Ez az új korlátozás a fent felsorolt érintett API-k összes indítására vonatkozik majd.
A korlát módosításához állítsa a környezeti változót COMPlus_Pkcs12UnspecifiedPasswordIterationLimit 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ábbiak szerint.
- Ez a szám határozza meg a teljes iterációs korlátot, amely a MAC-iterációk száma, a titkosított széf tartalom és a beburkolt táska iterációs számának összege. Ha manuálisan exportált egy PFX-et explicit iterációs szám <iter_count> használatával (például az openssl pkcs12 -export -iter <iter_count> használatával), é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 közelítések teljes száma kismértékben meghaladja az itt megadott explicit korlátokat.
COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000
A további ellenőrzések teljes letiltásához állítsa a környezeti változót a -1 speciális sentinelértékre, az alábbiak szerint.
- ⚠️ Figyelmeztetés: Csak akkor állítsa a környezeti változó értékét -1-re, ha biztos abban, hogy a célalkalmazás nem kezeli a nem megbízható tanúsítványbevitelt.
COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1
4. lehetőség – A további ellenőrzés módosítása vagy letiltása az AppContext használatával
Alkalmazhatóság: Ez a beállítás csak a .NET 6.0+verzióra vonatkozik. Nem vonatkozik a .NET-keretrendszerre
Bár a .NET alapértelmezés szerint legfeljebb 600 000 jelszó iterációjára korlátozza az importálási műveleteket, ez a korlát az AppContext kapcsoló használatával az alkalmazásra vonatkozóan konfigurálható. Ez az új korlátozás a fent felsorolt érintett API-k összes indítására vonatkozik majd.
A korlát módosításához állítsa be az AppContext kapcsolót System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit az új korlát értékére. Ha például 1 000 000 (egymillió) iterációra szeretné állítani a korlátot, az alábbiak szerint állítsa be a kapcsolót.
- Ez a szám határozza meg a teljes iterációs korlátot, amely a MAC-iterációk száma, a titkosított széf tartalom és a beburkolt táska iterációs számának összege. Ha manuálisan exportált egy PFX-et explicit iterációs szám <iter_count> használatával (például az openssl pkcs12 -export -iter <iter_count> használatával), é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 közelítések teljes száma kis mértékben meghaladja az itt megadott korlátokat.
A kapcsoló beállítása az alkalmazás projektfájljában (.csproj vagy .vbproj):
<!--
- Ez a kapcsoló csak akkor működik, ha az aktuális projektfájl egy alkalmazáshoz tartozik. Nincs hatása, ha az aktuális projektfájl megosztott könyvtárat képvisel.
-->
<ItemGroup>
- <RuntimeHostConfigurationOption include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" value="1000000" />
</ItemGroup>
Másik lehetőségként elhelyezhet egy runtimeconfig.template.json nevű fájlt a következő tartalommal ugyanabba a könyvtárba, 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áról további információt a .NET futtatókörnyezet konfigurációs beállításait tartalmazó dokumentációs lapon talál.
A további ellenőrzések teljes letiltásához állítsa a konfigurációs kapcsolót a -1 speciális őrzőértékre, az alábbiak szerint.
⚠️ 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ánybevitelt.
Az alkalmazás projektfájlján belül (.csproj vagy .vbproj):
<!--
- Ez a kapcsoló csak akkor működik, ha az aktuális projektfájl egy alkalmazáshoz tartozik. Nincs hatása, ha az aktuális projektfájl megosztott könyvtárat képvisel.
-->
<ItemGroup>
- <RuntimeHostConfigurationOption include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" value="-1" />
</ItemGroup>
Vagy a runtimeconfig.template.json fájlon belül:
{
- "configProperties": {
- "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": -1
}
}
5. lehetőség: A további ellenőrzés módosítása vagy letiltása a gépre kiterjedően a beállításjegyzéken keresztül (csak a Windows .NET-keretrendszer esetében)
Alkalmazhatóság: Ez a beállítás csak a .NET-keretrendszer összes verziójára vonatkozik. Nem vonatkozik a .NET 6.0+ verzióra.
Bár a .NET-keretrendszer alapértelmezés szerint az importálási műveleteket legfeljebb 600 000 jelszó iterációjára korlátozza, ez a korlát a HKLM beállításjegyzék használatával az egész gépre vonatkozóan konfigurálható. Ez az új korlátozás a fent felsorolt érintett API-k összes indítására vonatkozik majd.
A korlát módosításához a beállításkulcs HKLM\Software\Microsoft\.NETFrameworkalatt állítsa be az új korlát értékét Pkcs12UnspecifiedPasswordIterationLimit . Ha például 1 000 000 (egymillió) iterációra szeretné állítani a korlátot, futtassa az alábbi parancsokat rendszergazda jogú parancssorból.
- Ez a szám határozza meg a teljes iterációs korlátot, amely a MAC-iterációk száma, a titkosított széf tartalom és a beburkolt táska iterációs számának összege. Ha manuálisan exportált egy PFX-et explicit iterációs szám <iter_count> használatával (például az openssl pkcs12 -export -iter <iter_count> használatával), és importálni szeretné ezt a PFX-blobot, állítsa ezt a beállításazonosítót legalább akkorára, mint az összes várt iteráció összege. A gyakorlatban a .NET-keretrendszer lehetővé teheti, hogy a közelítések teljes száma kis mértékben meghaladja az itt megadott explicit korlátokat.
- A beállításjegyzék-beállítás architektúrafüggő. Annak érdekében, hogy az alkalmazások a célarchitektúrájuktól függetlenül megfigyeljék a konfigurált értéket, ne felejtse el módosítani mind a 32 bites, mind a 64 bites beállításjegyzéket az alábbiak szerint.
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 letiltásához állítsa a beállításazonosítót -1 értékre egy rendszergazda jogú parancssorban, az alábbiak szerint.
- ⚠️ Figyelmeztetés: Csak akkor állítsa a beállításazonosítót -1-re, ha biztos abban, hogy a célszámítógépen futó szolgáltatások nem kezelik a nem megbízható tanúsítványbevitelt.
- 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ájuktól függetlenül megfigyeljék a konfigurált értéket, ne felejtse el módosítani mind a 32 bites, mind a 64 bites beállításjegyzéket az alábbiak szerint.
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 beállításértéket egy rendszergazda jogú 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 a .NET-keretrendszer a PFXImportCertStore funkción keresztül importálja a tanúsítványokat. Ez a függvény saját ellenőrzést hajt végre, beleértve a PFX-blobok maximálisan engedélyezett iterációs számának saját korlátait is. Ezek az ellenőrzések a PFX-importálás után is megtörténnek. A . A fent ismertetett NET-specifikus környezeti változók és beállításkulcsok nincsenek hatással arra, hogy a PFXImportCertStore hogyan hajtja végre ezeket az ellenőrzéseket.