Poznámka: Zrevidované 22. júna 2023 s cieľom aktualizovať riešenie a alternatívne riešenia
Poznámka: Revidované 15. júna 2023 s cieľom aktualizovať možnosti 4 a 5
Pozadí
13. júna 2023 vydala spoločnosť Microsoft aktualizáciu zabezpečenia pre .NET Framework a .NET, ktorá ovplyvňuje spôsob, akým runtime importuje certifikáty X.509. Tieto zmeny môžu spôsobiť X.509 certifikát import hodiť CryptographicException v scenároch, kde import by bol úspešný pred aktualizáciou.
Tento dokument popisuje zmeny a alternatívne riešenia dostupné pre ovplyvnené aplikácie.
Ovplyvnený softvér
-
.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
Ovplyvnené rozhrania API
Popis zmeny
Pred 13. júnom 2023 by zmena, keď sa .NET Framework a .NET prezentujú s binárnym certifikačným objektom BLOB na import, .NET Framework a .NET zvyčajne delegujú overenie a import objektu BLOB do základného OS. Napríklad v systémoch Windows by .NET Framework a .NET pri overovaní a importe zvyčajne využívali rozhranie PFXImportCertStore API.
Od 13. júna 2023 sa zmena, keď sa .NET Framework a .NET prezentujú s binárnym certifikačným objektom BLOB na import, .NET Framework a .NET za určitých okolností vykonajú ďalšie overenie pred odovzdaním objektu BLOB základnému operačnému systému. Toto dodatočné overenie vykoná sériu heuristických kontrol, aby sa zistilo, či by prichádzajúci certifikát mohol po importe škodlivé vyčerpať prostriedky. Keďže ide o ďalšie overenie nad rámec toho, čo by základný operačný systém bežne vykonával, môže blokovať objekty BLOB certifikátu, ktoré by sa úspešne importovali pred 13. júnom 2023, zmeniť.
Známe regresie
-
Ak bol certifikát X.509 exportovaný ako objekt BLOB PFX s nezvyčajne vysokým počtom iterácií hesiel, tento certifikát sa teraz nemusí importovať. Väčšina zariadení na export certifikátov používa počet iterácií niekde medzi 2 000 – 10 000. Po použití aktualizácie zabezpečenia zlyhá import pre certifikáty obsahujúce počet iterácií väčší ako 600 000.
-
Ak bol certifikát X.509 exportovaný pomocou hesla s hodnotou null [napr. prostredníctvomX509Certificate.Export(X509ContentType.Pfx, (string)null)aleboX509Certificate.Export(X509ContentType.Pfx)]bez hesiel, tento certifikát sa teraz nemusí importovať.
Poznámka: Vyššie uvedená regresia bola riešená v aktualizácii z 22. júna 2023, o ktorej sa diskutovalo v kb5028608.
-
Ak bol certifikát X.509 exportovaný ako objekt BLOB PFX s použitím možnosti Windowsu chrániť súkromný kľúč do identifikátora SID, tento certifikát sa teraz nemusí importovať. Ovplyvní to objekty BLOB PFX vytvorené nasledujúcimi spôsobmi:
-
Prostredníctvom Sprievodcu exportom certifikátov systému Windows a zadaním v sprievodcovi, že súkromný kľúč by mal byť chránený používateľovi domény. Alebo
-
Prostredníctvom rutiny typu cmdlet Export-PfxCertificate prostredia PowerShell, kde sa poskytuje explicitný -ProtectTo argument; Alebo
-
Prostredníctvom pomôcky certutil , kde je uvedený explicitný -protectto argument; Alebo
-
Prostredníctvom rozhrania PFXExportCertStoreEx API, kde je uvedený príznak PKCS12_PROTECT_TO_DOMAIN_SIDS.
-
Riešenie & alternatívnych riešení
Existujú rôzne alternatívne riešenia v závislosti od toho, či chcete vykonať cielené zmeny na jednotlivých lokalitách hovorov v rámci kódu, alebo chcete zmeniť správanie jednej aplikácie alebo chcete vykonať zmeny v celom počítači.
Možnosť 1 (preferovaná) – Inštalácia aktualizovanej opravy
Poznámka: Toto je preferovaná možnosť, pretože sa zaoberá bežne hlásenými regresiami zákazníkov a nevyžaduje žiadne zmeny kódu v aplikácii.
Použiteľnosť: Táto možnosť sa vzťahuje na všetky verzie .NET Framework a .NET.
Tento problém bol vyriešený v aktualizácii z 22. júna 2023, ktorá bola prediskutovaná v kb5028608.
Spoločnosť Microsoft odporúča, aby zákazníci, u ktorých sa vyskytli regresie zavedené do 13. júna 2023, vyskúšali inštaláciu tejto aktualizovanej opravy pred pokusom o alternatívne riešenia uvedené ďalej v tomto dokumente.
Možnosť č. 2: Úprava lokality volania
Použiteľnosť: Táto možnosť sa vzťahuje na všetky verzie .NET Framework a .NET.
Zvážte, či objekt BLOB, ktorý importujete, je dôveryhodný. Bol objekt BLOB napríklad načítaný z dôveryhodného umiestnenia, napríklad z databázy alebo konfiguračného súboru pod vaším ovládacím prvkom, alebo bol poskytnutý prostredníctvom sieťovej požiadavky vykonanej neovereným alebo neprivilegovaným klientom?
Spoločnosť Microsoft dôrazne odporúča, aby ste neimportovali objekty BLOB PFX, ktoré vám poskytli neoverení alebo neprivilegovaní klienti, pretože tieto objekty BLOB môžu obsahovať škodlivé vyčerpanie prostriedkov.
Ak potrebujete importovať objekt BLOB certifikátu verejného kľúča, ktorý vám dal nedôveryhodný účastník, môžete použiť nasledujúci kód na bezpečný import takéhoto objektu BLOB. Tento vzorový kód používa metódu GetCertContentType na určenie základného typu objektu BLOB certifikátu a odmieta objekty BLOB PFX v prípadoch, keď očakávate iba importovanie objektu BLOB certifikátu verejného kľúča. KonštruktorX509Certificate2(byte[]) je bezpečný na použitie, ak sú zadané nedôveryhodné objekty BLOB, ktoré nie sú objektmi PFX.
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);
}
}
Ak potrebujete importovať objekt BLOB certifikátu súkromného kľúča bez hesla a zistili ste, že objekt BLOB je dôveryhodný, môžete potlačiť ďalšie overovacie kontroly vykonané 13. júna 2023, vydanie zabezpečenia volaním iného preťaženia konštruktora. Môžete napríklad volať preťaženie konštruktora, ktorý akceptuje argument hesla reťazca a pre hodnotu argumentu odovzdať hodnotu null.
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);
Možnosť č. 3: Úprava alebo potlačenie ďalšieho overenia pomocou premennej prostredia
Použiteľnosť: Táto možnosť sa vzťahuje len na všetky verzie .NET Framework. Nevzťahuje sa na .NET 6.0+.
Hoci .NET Framework predvolene obmedziť operácie importu tak, aby nevybrali viac ako 600 000 iterácií hesla, tento limit je možné nakonfigurovať v rámci celej aplikácie alebo celého počítača pomocou premennej prostredia. Tento nový limit sa bude vzťahovať na všetky vyvolania ovplyvnených rozhraní API uvedených vyššie.
Ak chcete zmeniť limit, nastavte premennú prostrediaCOMPlus_Pkcs12UnspecifiedPasswordIterationLimitna hodnotu nového limitu. Ak chcete napríklad nastaviť limit na 1 000 000 (jeden milión) iterácií, nastavte premennú prostredia tak, ako je to znázornené nižšie.
-
Toto číslo určuje celkový limit iterácie, čo je súčet počtu iterácií MAC, šifrovaného bezpečného obsahu a počtu iterácií zašifrovaného vaku. Ak ste manuálne exportovali PFX pomocou explicitného počtu iterácií <iter_count> (napr. prostredníctvom opensl pkcs12 -export -iter <iter_count>) a chcete importovať tento objekt BLOB PFX, nastavte túto premennú prostredia na hodnotu aspoň tak veľkú ako súčet všetkých očakávaných iterácií. V praxi môžu .NET Framework a .NET povoliť, aby celkový počet iterácií mierne prekročil akýkoľvek explicitný limit nakonfigurovaný na tomto mieste.
COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000
Ak chcete úplne potlačiť dodatočné kontroly, nastavte premennú prostredia na špeciálnu sentinelovú hodnotu -1, ako je znázornené nižšie.
-
⚠️ Upozornenie: Hodnotu premennej prostredia nastavte na hodnotu -1 iba vtedy, ak ste si istí, že cieľová aplikácia neslúže nedôveryhodný vstup certifikátu.
COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1
Možnosť č. 4 : Úprava alebo potlačenie ďalšieho overenia pomocou appcontextu
Použiteľnosť: Táto možnosť sa vzťahuje len na .NET 6.0+. Nevzťahuje sa na .NET Framework
Zatiaľ čo .NET predvolene obmedzuje operácie importu tak, aby nepreberal viac ako 600 000 iterácií hesla, tento limit je možné nakonfigurovať v celej aplikácii pomocou prepínača AppContext. Tento nový limit sa bude vzťahovať na všetky vyvolania ovplyvnených rozhraní API uvedených vyššie.
Ak chcete zmeniť limit, nastavte prepínač AppContext System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit na hodnotu nového limitu. Ak chcete napríklad nastaviť limit na 1 000 000 (jeden milión) iterácií, nastavte prepínač tak, ako je znázornené nižšie.
-
Toto číslo určuje celkový limit iterácie, čo je súčet počtu iterácií MAC, šifrovaného bezpečného obsahu a počtu iterácií zašifrovaného vaku. Ak ste manuálne exportovali PFX pomocou explicitného počtu iterácií <iter_count> (napr. prostredníctvom opensl pkcs12 -export -iter <iter_count>) a chcete importovať tento objekt BLOB PFX, nastavte túto premennú prostredia na hodnotu aspoň tak veľkú ako súčet všetkých očakávaných iterácií. V praxi môže .NET povoliť, aby celkový počet iterácií mierne prekročil akýkoľvek explicitný limit nakonfigurovaný na tomto mieste.
Ak chcete nastaviť prepínač v súbore projektu aplikácie (.csproj alebo .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>
Prípadne môžete umiestniť súbor s názvom runtimeconfig.template.json s nasledujúcim obsahom do toho istého adresára, ktorý obsahuje súbor projektu vašej aplikácie:
{
"configProperties": {
- "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": 1000000
}
}
Ďalšie informácie o zmene nastavení konfigurácie runtime platformy .NET nájdete na stránke dokumentácie s nastaveniami konfigurácie .NET Runtime.
Ak chcete úplne potlačiť ďalšie kontroly, nastavte prepínač konfigurácie špeciálnu indikátorovú hodnotu -1, ako je znázornené nižšie.
⚠️ Upozornenie: Prepínač AppContext nastavte na hodnotu -1 iba vtedy, ak ste si istí, že cieľová aplikácia nezadáva nedôveryhodný vstup certifikátu.
V súbore projektu aplikácie (.csproj alebo .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>
Alebo v rámci súboru runtimeconfig.template.json:
{
- "configProperties": {
- "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": -1
}
}
Možnosť č. 5: Úprava alebo potlačenie ďalšieho overovacieho zariadenia prostredníctvom databázy Registry (iba pre .NET Framework systému Windows)
Použiteľnosť: Táto možnosť sa vzťahuje len na všetky verzie .NET Framework. Nevzťahuje sa na .NET 6.0+.
Hoci .NET Framework predvolene obmedziť operácie importu tak, aby neprekročilo 600 000 iterácií hesla, tento limit je možné nakonfigurovať v celom počítači pomocou databázy Registry HKLM. Tento nový limit sa bude vzťahovať na všetky vyvolania ovplyvnených rozhraní API uvedených vyššie.
Ak chcete zmeniť limit, v kľúči databázy RegistryHKLM\Software\Microsoft\.NETFrameworknastavte hodnotuPkcs12UnspecifiedPasswordIterationLimitna nový limit. Ak chcete napríklad nastaviť limit na 1 000 000 (jeden milión) iterácií, spustite príkazy, ako je znázornené nižšie, z príkazového riadka bez oprávnení.
-
Toto číslo určuje celkový limit iterácie, čo je súčet počtu iterácií MAC, šifrovaného bezpečného obsahu a počtu iterácií zašifrovaného vaku. Ak ste manuálne exportovali PFX pomocou explicitného počtu iterácií <iter_count> (napr. prostredníctvom opensl pkcs12 -export -iter <iter_count>) a chcete importovať objekt BLOB PFX, nastavte túto hodnotu databázy Registry na hodnotu aspoň tak veľkú ako súčet všetkých očakávaných iterácií. V praxi môže .NET Framework umožniť, aby celkový počet iterácií mierne prekročil akýkoľvek explicitný limit nakonfigurovaný na tomto mieste.
-
Nastavenie databázy Registry závisí od architektúry. Ak chcete zabezpečiť, aby aplikácie dodržiavali nakonfigurovanú hodnotu bez ohľadu na ich cieľovú architektúru, nezabudnite upraviť 32-bitovú aj 64-bitovú registra, ako je to znázornené nižšie.
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
Ak chcete úplne potlačiť ďalšie kontroly, nastavte hodnotu databázy Registry na -1 z príkazového riadka bez oprávnení, ako je to znázornené nižšie.
-
⚠️ Upozornenie: Hodnotu databázy Registry nastavte na hodnotu -1 iba vtedy, ak máte istotu, že služby spustené v cieľovom počítači neslúžia na spracovanie nedôveryhovania vstupu certifikátu.
-
Ak chcete nastaviť indikátor -1, namiesto typu REG_DWORD použite typ REG_SZ. Nastavenie databázy Registry závisí od architektúry. Ak chcete zabezpečiť, aby aplikácie dodržiavali nakonfigurovanú hodnotu bez ohľadu na ich cieľovú architektúru, nezabudnite upraviť 32-bitovú aj 64-bitovú registra, ako je to znázornené nižšie.
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
Ak chcete vrátiť zmeny databázy Registry, odstráňte hodnotu databázy Registry Pkcs12UnspecifiedPasswordIterationLimit z príkazového riadka bez oprávnení.
reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:32 reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:64
Poznámky špecifické pre Windows
Vo Windowse .NET Framework importovať certifikáty prostredníctvom funkcie PFXImportCertStore. Táto funkcia vykonáva vlastné overenie vrátane uvedenia vlastných limitov do maximálneho povoleného počtu iterácií objektu BLOB PFX. Tieto kontroly sa budú aj naďalej vykonávať pri importe PFX. V súbore . Premenné prostredia špecifické pre net a kľúče databázy Registry popísané vyššie nemajú vplyv na to, ako PFXImportCertStore vykonáva tieto kontroly.