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
-
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.
-
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.
-
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.