Poznámka: Upravené 22. júna 2023, aby sa aktualizovalo riešenie a alternatívne riešenia
Poznámka: Upravené 15. júna 2023, aby sa aktualizovala práca na možnostiach 4 a 5
Pozadie
13. júna 2023 spoločnosť Microsoft vydala 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ť, že import certifikátu X.509 vyhodí kryptografickú výnimku v scenároch, v ktorých by bol import úspešný pred aktualizáciou.
V tomto dokumente sa popisujú 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
- new X509Certificate(byte[])
- X509Certificate.Import(byte[])
- new X509Certificate2(byte[])
- X509Certificate2.Import(byte[])
- X509Certificate2Collection.Import(byte[])
Popis zmeny
Pred zmenou z 13. júna 2023, keď sa rozhraniam .NET Framework a .NET zobrazí binárny certifikát BLOB na import, .NET Framework a .NET zvyčajne delegujú overovanie a import objektu BLOB do základného operačného systému. Napríklad vo Windowse sa rozhrania .NET Framework a .NET zvyčajne spoliehajú na overovanie a importovanie rozhrania API PFXImportCertStore.
Od zmeny 13. júna 2023, keď sa rozhraniam .NET Framework a .NET zobrazí binárny certifikát 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áva sériu heuristických kontrol s cieľom určiť, či prichádzajúci certifikát pri importe neoprávnene vyčerpá zdroje. Keďže ide o dodatočné overenie nad rámec toho, čo by základný operačný systém normálne vykonával, môže blokovať objekty blob certifikátu, ktoré by sa úspešne importovali pred zmenou z 13. júna 2023.
Známe regresie
Ak sa certifikát X.509 exportoval ako objekt BLOB PFX s použitím neobvykle vysokého počtu 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 sa certifikát X.509 exportoval s použitím nulového hesla [napr. cez
X509Certificate.Export(X509ContentType.Pfx, (string)null)alebo bezX509Certificate.Export(X509ContentType.Pfx)]hesla), tento certifikát sa teraz nemusí importovať.
Poznámka
Vyššie uvedená regresia bola vyriešená v aktualizácii z 22. júna 2023, o ktorej sa diskutovalo v KB5028608.
Ak sa certifikát X.509 exportoval ako objekt BLOB PFX pomocou možnosti Windowsu chrániť súkromný kľúč na SID, tento certifikát sa teraz nemusí podariť importovať. Bude to mať vplyv na objekty BLOB PFX vytvorené nasledujúcimi spôsobmi:
- prostredníctvom Sprievodcu exportom certifikátov systému Windows a v sprievodcovi určí, že súkromný kľúč by mal byť chránený pred používateľom domény; alebo
- prostredníctvom rutiny typu cmdlet Export-PfxCertificate prostredia PowerShell, kde je zadaný explicitný
-ProtectToargument; alebo - Via the certutil utility where an explicit
-protecttoargument is provided; or - Prostredníctvom rozhrania API PFXExportCertStoreEx , kde je zadaný príznak PKCS12_PROTECT_TO_DOMAIN_SIDS.
Riešenie & alternatívne riešenia
Existujú rôzne alternatívne riešenia v závislosti od toho, či chcete v kóde vykonať cielené zmeny na jednotlivých miestach volania, alebo chcete zmeniť správanie jednej aplikácie, prípadne chcete vykonať zmeny v celom počítači.
Možnosť č. 1 (preferovaná) – Nainštalujte aktualizovanú opravu
Poznámka
Táto možnosť sa uprednostňuje, pretože rieši bežne hlásené regresie zákazníkov a nevyžaduje v aplikácii žiadne zmeny kódu.
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, o ktorej sa diskutovalo v KB5028608.
Spoločnosť Microsoft odporúča, aby zákazníci, ktorí majú regresie zavedené vo vydaní z 13. júna 2023, vyskúšali nainštalovať túto aktualizovanú opravu predtým, ako vyskúšajú alternatívne riešenia uvedené ďalej v tomto dokumente.
2. možnosť: Úprava miesta hovoru
Použiteľnosť: Táto možnosť sa vzťahuje na všetky verzie .NET Framework a .NET.
Zvážte, či je importovaný objekt blob dôveryhodný. Bol objekt BLOB načítaný napríklad z dôveryhodného umiestnenia, ako je napríklad databáza alebo konfiguračný súbor pod vašou kontrolou, alebo bol poskytnutý prostredníctvom sieťovej požiadavky neovereného alebo neprivilegovaného klienta?
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 by mohli obsahovať škodlivé správania spôsobujúce vyčerpanie prostriedkov.
Ak potrebujete importovať objekt BLOB certifikátu verejného kľúča , ktorý vám poskytla nedôveryhodná strana, na bezpečný import takéhoto objektu BLOB môžete použiť nasledujúci kód. Tento vzorový kód používa metódu GetCertContentType na určenie základného typu objektu BLOB certifikátu a odmietne objekty BLOB PFX v prípadoch, keď očakávate len import objektu BLOB certifikátu verejného kľúča. Konštruktor X509Certificate2(byte[]) je bezpečný na použitie, keď sú dané nedôveryhodné non-PFX objekty BLOB.
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 tento objekt BLOB je dôveryhodný, môžete potlačiť ďalšie kontroly overenia vykonané vydaním zabezpečenia z 13. júna 2023 volaním iného preťaženia konštruktora. Môžete napríklad zavolať preťaženie konštruktora, ktoré prijme argument reťazca hesla a pre hodnotu argumentu predá 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);
3. možnosť: Úprava alebo potlačenie dodatočného overovania pomocou premennej prostredia
Použiteľnosť: Táto možnosť platí len pre všetky verzie rozhrania .NET Framework. Nevzťahuje sa to na .NET 6.0+.
Hoci rozhranie .NET Framework predvolene obmedzuje operácie importu tak, aby nepotrebovali viac ako 600 000 iterácií hesla, tento limit je možné nakonfigurovať v rámci celej aplikácie alebo 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 limit zmeniť, nastavte premennú COMPlus_Pkcs12UnspecifiedPasswordIterationLimit prostredia na hodnotu nového limitu. Ak chcete napríklad nastaviť limit na 1 000 000 (jeden milión) iterácií, nastavte premennú prostredia podľa nižšie uvedeného obrazu.
- Toto číslo určuje celkový limit iterácie, ktorý je súčtom počtu iterácií MAC, šifrovaného bezpečného obsahu a počtu iterácií zahaleného vrecka. Ak ste manuálne exportovali PFX pomocou explicitného počtu <iterácií iter_count> (napríklad pomocou openssl pkcs12 -export -iter <iter_count>) a chcete importovať tento objekt BLOB PFX, nastavte túto premennú prostredia minimálne na takú veľkú, ako je 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, ktorý je tu nakonfigurovaný.
COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000
Ak chcete úplne potlačiť ďalšie kontroly, nastavte premennú prostredia na hodnotu špeciálneho signálu -1, ako je uvedené nižšie.
- ⚠ ️ Upozornenie: Hodnotu premennej prostredia nastavte na hodnotu -1 iba v prípade, že ste si istí, že cieľová aplikácia nespracováva vstup nedôveryhodného certifikátu.
COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1
4. možnosť: Úprava alebo potlačenie dodatočného overenia pomocou AppContext
Použiteľnosť: Táto možnosť sa vzťahuje len na .NET 6.0+. Nevzťahuje sa na .NET Framework
Hoci .NET predvolene obmedzuje operácie importu tak, aby nemuseli presiahnuť 600 000 iterácií hesla, tento limit je možné nakonfigurovať v rámci celej aplikácie 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 limit zmeniť, nastavte prepínač AppContext System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit na hodnotu toho, čo by mal byť nový limit. Ak chcete napríklad nastaviť limit na 1 000 000 (jeden milión) iterácií, nastavte prepínač podľa obrázka nižšie.
- Toto číslo určuje celkový limit iterácie, ktorý je súčtom počtu iterácií MAC, šifrovaného bezpečného obsahu a počtu iterácií zahaleného vrecka. Ak ste manuálne exportovali PFX pomocou explicitného počtu <iterácií iter_count> (napríklad pomocou openssl pkcs12 -export -iter <iter_count>) a chcete importovať tento objekt BLOB PFX, nastavte túto premennú prostredia minimálne na takú veľkú, ako je 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 explicitne nakonfigurovaný limit.
Ak chcete nastaviť prepínač v rámci súboru projektu aplikácie (.csproj alebo .vbproj):
<!--
- Tento prepínač funguje iba v prípade, ak aktuálny súbor projektu predstavuje aplikáciu. Ak aktuálny súbor projektu predstavuje zdieľanú knižnicu, nemá to žiaden vplyv.
-->
<ItemGroup>
- <RuntimeHostConfigurationOption include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" Value="1000000" />
</ItemGroup>
Prípadne môžete do toho istého adresára, v ktorom sa nachádza súbor projektu vašej aplikácie, umiestniť súbor s názvom runtimeconfig.template.json s nasledujúcim obsahom:
{
"configProperties": {
- "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": 1000000
}
}
Ďalšie informácie o zmene nastavení konfigurácie modulu runtime rozhrania .NET nájdete na stránke s dokumentáciou nastavenia konfigurácie modulu runtime rozhrania .NET.
Ak chcete úplne potlačiť ďalšie kontroly, nastavte prepínač konfigurácie špeciálnu hodnotu Sentinel -1, ako je znázornené nižšie.
⚠ ️ Upozornenie: Prepínač AppContext nastavte na hodnotu -1 iba v prípade, že ste si istí, že cieľová aplikácia nespracováva zadávanie nedôveryhodného certifikátu.
V rámci projektového súboru aplikácie (.csproj alebo .vbproj):
<!--
- Tento prepínač funguje iba v prípade, ak aktuálny súbor projektu predstavuje aplikáciu. Ak aktuálny súbor projektu predstavuje zdieľanú knižnicu, nemá to žiaden vplyv.
-->
<ItemGroup>
- <RuntimeHostConfigurationOption include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" value="-1" />
</ItemGroup>
Alebo v súbore runtimeconfig.template.json:
{
- "configProperties": {
- "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": -1
}
}
5. možnosť: Úprava alebo potlačenie dodatočného overovania v celom počítači prostredníctvom databázy Registry (Windows len pre .NET Framework)
Použiteľnosť: Táto možnosť platí len pre všetky verzie rozhrania .NET Framework. Nevzťahuje sa to na .NET 6.0+.
Hoci rozhranie .NET Framework predvolene obmedzuje operácie importu tak, aby netrvalo viac ako 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 limit zmeniť, v kľúči HKLM\Software\Microsoft\.NETFrameworkdatabázy Registry nastavte hodnotu Pkcs12UnspecifiedPasswordIterationLimit na 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 obmedzených oprávnení.
- Toto číslo určuje celkový limit iterácie, ktorý je súčtom počtu iterácií MAC, šifrovaného bezpečného obsahu a počtu iterácií zahaleného vrecka. Ak ste manuálne exportovali súbor PFX pomocou explicitného počtu <iterácií iter_count> (napríklad pomocou openssl pkcs12 -export -iter <iter_count>) a chcete importovať tento objekt BLOB PFX, nastavte túto hodnotu databázy Registry minimálne na takú veľkú, ako je súčet všetkých očakávaných iterácií. V praxi môže rozhranie .NET Framework povoliť, aby celkový počet iterácií mierne prekročil ľubovoľný explicitný limit nakonfigurovaný v tomto článku.
- 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ú verziu databázy Registry, ako je uvedené 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 hodnotu -1 z príkazového riadka bez obmedzených oprávnení, ako je uvedené nižšie.
- ⚠️ Upozornenie: Hodnotu databázy Registry nastavte na hodnotu -1 iba vtedy, ak ste si istí, že služby spustené v cieľovom počítači nespracovávajú zadávanie nedôveryhodných certifikátov.
- Ak chcete nastaviť hodnotu -1 sentinel, použite namiesto typu REG_DWORD 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ú verziu databázy Registry, ako je uvedené 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 zrušiť zmeny v databáze Registry, odstráňte hodnotu databázy Registry Pkcs12UnspecifiedPasswordIterationLimit z príkazového riadka bez obmedzených 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 importuje certifikáty prostredníctvom funkcie PFXImportCertStore. Táto funkcia vykonáva vlastné overenie vrátane stanovenia vlastných limitov na maximálny povolený počet iterácií objektu BLOB PFX. Tieto kontroly sa budú vykonávať aj po dovoze PFX. Dialógové okno . Premenné prostredia špecifické pre sieť a kľúče databázy Registry popísané vyššie nemajú vplyv na spôsob, akým PFXImportCertStore vykonáva tieto kontroly.