Applies To.NET

הערה: מתוקן ב- 22 ביוני 2023 כדי לעדכן פתרון ופתרונות

הערה: 15 ביוני 2023 מתוקן כדי לעדכן את האפשרויות 4 ו- 5 

רקע

ב- 13 ביוני 2023, Microsoft פרסמה עדכון אבטחה ל- .NET Framework ו- .NET שמשפיע על האופן שבו זמן הריצה מייבא אישורי X.509. שינויים אלה עשויים לגרום לייבוא אישור X.509 לתבליט CryptographicException בתרחישים שבהם הייבוא הצליח לפני העדכון.

מסמך זה מתאר את השינוי ואת הפתרונות הזמינים עבור יישומים מושפעים.

התוכנה המושפעת

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

ממשקי API מושפעים

תיאור השינוי

לפני ה- 13 ביוני 2023, ישתנה, כאשר .NET Framework ו- .NET יוצגו עם blob של אישור בינארי לייבוא, .NET Framework ו- .NET ינציגו בדרך כלל אימות וייבא את ה- blob אל מערכת ההפעלה המשמשת תחילה. לדוגמה, ב- Windows, .NET Framework ו- .NET מסת האישורים בדרך כלל על ה- API של PFXImportCertStore לאימות ולייבוא.

נכון ל- 13 ביוני 2023, ישתנה כאשר .NET Framework ו- .NET יוצגו עם Blob של אישור בינארי לייבוא, .NET Framework ו- .NET בנסיבות מסוימות יבצעו אימות נוסף לפני העברת ה- Blob אל מערכת ההפעלה המשמשת כברירת מחדל. אימות נוסף זה מבצע סידרה של בדיקות הטוריות כדי לקבוע אם האישור הנכנס ימפלט משאבים באופן זדוני בעת הייבוא. מאחר שזהו אימות נוסף מעבר למה שמערכת ההפעלה המשמשת כדרך כלל מבצעת, היא עשויה לחסום blob של אישורים שיובאו בהצלחה לפני ה- 13 ביוני 2023, ישתנו.

רגרסיות ידועות

  1. אם אישור X.509 מיוצא כ- blob של PFX באמצעות ספירת איטרציית סיסמה גבוהה באופן לא רגיל, הייבוא של אישור זה עשוי להיכשל כעת. רוב מתקני ייצוא האישורים משתמשים בספירת איטרציה בין 2,000 ל- 10,000. לאחר החלת עדכון האבטחה, הייבוא ייכשל עבור אישורים המכילים ספירת איטרציה הגדולה מ- 600,000.

  2. אם אישור X.509 מיוצא באמצעות סיסמת Null [לדוגמה, באמצעותX509Certificate.Export(X509ContentType.Pfx, (string)null)או באמצעות סיסמהX509Certificate.Export(X509ContentType.Pfx)], הייבוא של אישור זה עשוי להיכשל כעת.  

    הערה: רגרסיה לעיל טופלה בעדכון של 22 ביוני 2023 שפורסם ב- KB5028608.

  3. אם אישור X.509 מיוצא כ- Blob של PFX באמצעות היכולת של Windows להגן על המפתח הפרטי ל- SID, הייבוא של אישור זה עשוי להיכשל כעת. פעולה זו תשפיע על blobs של PFX שנוצרים בנימוסים הבאים:

    • באמצעות אשף ייצוא האישורים של Windows וציון באשף שיש להגן על המפתח הפרטי למשתמש תחום; או

    • באמצעות ה- cmdlet Export-PfxCertificate של PowerShell שבו מסופק ארגומנט -ProtectTo מפורש; או

    • באמצעות כלי השירות certutil שבו סופק ארגומנט -protectto מפורש; או

    • באמצעות ה - API של PFXExportCertStoreEx PKCS12_PROTECT_TO_DOMAIN_SIDS דגל ה- PFX.

פתרונות & עקיפת הבעיה

קיימים דרכים שונות לעקיפת הבעיה, בהתאם לשאלה אם ברצונך לבצע שינויים ייעודיים באתרים ספציפיים של שיחות בתוך הקוד שלך, או אם ברצונך לשנות את אופן הפעולה של יישום יחיד, או שברצונך לבצע שינויים ברחבי המחשב.

אפשרות 1 (מועדפת) - התקנת תיקון מעודכן

הערה: זוהי האפשרות המועדפת מאחר שהיא מתייחסת ל רגרסיות של לקוחות שדווחו בדרך כלל, והיא אינה דורשת שינויי קוד ביישום.

ישימות: אפשרות זו חלה על כל הגירסאות של .NET Framework ו- .NET.

בעיה זו טופלה בעדכון של 22 ביוני 2023 שפורסם ב- KB5028608.

Microsoft ממליצה ללקוחות שנתקלים הרגרסיות שהוצגו ב- 13 ביוני 2023, נסה להתקין תיקון מעודכן זה לפני שתנסה את הפתרונות המפורטים בהמשך מסמך זה.

אפשרות 2 - שינוי אתר השיחה

ישימות: אפשרות זו חלה על כל הגירסאות של .NET Framework ו- .NET.

שקול אם ה- Blob שאתה מייבא מהימן. לדוגמה, האם ה- Blob אוחזר ממיקום מהימן, כגון קובץ מסד נתונים או קובץ תצורה תחת השליטה שלך, או אם הוא סופק באמצעות בקשת רשת שבוצעה על-ידי לקוח לא מאומת או לא מורשה?

Microsoft ממליצה לא לייבא blobs של PFX שסופקו לך על-ידי לקוחות לא מאומתים או לא מורשהים, מפני ש- blobים אלה עשויים להכיל אופני פעולה של מיצוי משאבים זדוניים.

אם עליך לייבא Blob של אישור מפתח ציבורי שסופק לך על-ידי צד לא מהימן, באפשרותך להשתמש בקוד הבא כדי לייבא בבטחה Blob כזה. קוד לדוגמה זה משתמש בפעולת השירות GetCertContentType כדי לקבוע מהו סוג הבסיס של blob של האישור, והוא דוחה רכיבי blob של PFX במקרים שבהם אתה מצפה לייבא blob של אישור מפתח ציבורי בלבד. בנאיX509Certificate2(byte[]) בטוח לשימוש כאשר blobs שאינו מהימן שאינו 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);
    }
} 

אם עליך לייבא Blob של אישור מפתח פרטי ללא סיסמה וקבעת שה- Blob מהימן, באפשרותך להעלים את בדיקות האימות הנומריות שבוצעו על-ידי 13 ביוני, 2023, על-ידי קריאה להמון בנאי אחר. לדוגמה, באפשרותך לקרוא לבנאי עומס יתר שמקבל ארגומנט של סיסמת מחרוזת ומעביר 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 - שינוי או העלמות של האימות הנוסף באמצעות משתנה סביבה

ישימות: אפשרות זו חלה על כל הגירסאות של .NET Framework בלבד.  הוא אינו חל על .NET 6.0+.

בעוד .NET Framework מגביל פעולות ייבוא המוגדרות כברירת מחדל כדי לקבל לא יותר מ- 600,000 רציפת סיסמה, ניתן להגדיר מגבלה זו על בסיס כלל יישום או מחשב באמצעות משתנה סביבה. מגבלה חדשה זו תחול על כל ההפעלות של ממשקי ה- API המושפעים המפורטים לעיל.

כדי לשנות את המגבלה, הגדר את משתנהCOMPlus_Pkcs12UnspecifiedPasswordIterationLimitלערך של המגבלה החדשה. לדוגמה, כדי להגדיר את המגבלה ל- 1,000,000 (מיליון) תדירות, הגדר את משתנה הסביבה כפי שמוצג להלן.

  • מספר זה קובע את מגבלת הטראטיציה הכוללת, שהיא הסכום של ספירת הטרטרציה של MAC, התוכן הבטוח המוצפן וספירת הטרטרציה של שק אכופה. אם ייצאת באופן ידני PFX באמצעות ספירת איטראציה מפורשת <iter_count> (לדוגמה, באמצעות פתיחת pkcs12 -export -iter <iter_count>) וברצונך לייבא blob זה של PFX, הגדר משתנה סביבה זה לערך לפחות גדול כמו הסכום של כל ההחזרים הצפויים. בפועל, .NET Framework ו- .NET עשויים לאפשר לספירת הטרציה הכוללת לחרוג מעט ממגבלה מפורשת שתצורתה נקבעה כאן.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000

כדי להעלים לחלוטין את ההמחאות הנו נוספות, הגדר את משתנה הסביבה לערך ה-sentinel המיוחד -1, כפי שמוצג להלן.

  • ⚠️ אזהרה: הגדר את ערך משתנה הסביבה ל- -1 רק אם אתה בטוח כי יישום היעד אינו מטפל בקלט אישור לא מהימן.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1

אפשרות 4 - שינוי או העלמות של האימות הנוסף באמצעות AppContext

ישימות: אפשרות זו חלה על .NET 6.0+only.  הוא אינו חל על .NET Framework

על אף שפעולות ייבוא המגבלה של .NET המהוות ברירת מחדל לוקחות לא יותר מ- 600,000 איתירות של סיסמה, ניתן להגדיר מגבלה זו ברחבי היישום באמצעות הבורר AppContext. מגבלה חדשה זו תחול על כל ההפעלות של ממשקי ה- API המושפעים המפורטים לעיל.

כדי לשנות את המגבלה, הגדר את בורר AppContext System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit לערך של המגבלה החדשה. לדוגמה, כדי להגדיר את המגבלה ל- 1,000,000 (מיליון) תדירות, הגדר את הבורר כפי שמוצג להלן.

  • מספר זה קובע את מגבלת הטראטיציה הכוללת, שהיא הסכום של ספירת הטרטרציה של MAC, התוכן הבטוח המוצפן וספירת הטרטרציה של שק אכופה. אם ייצאת באופן ידני PFX באמצעות ספירת איטראציה מפורשת <iter_count> (לדוגמה, באמצעות פתיחת pkcs12 -export -iter <iter_count>) וברצונך לייבא blob זה של PFX, הגדר משתנה סביבה זה לערך לפחות גדול כמו הסכום של כל ההחזרים הצפויים. בפועל, .NET עשוי לאפשר לספירת הפעולות הכוללות לחרוג מעט ממגבלה מפורשת שתצורתה נקבעה כאן.

כדי להגדיר את הבורר בתוך קובץ הפרוייקט של היישום (.csproj או .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>

לחלופין, באפשרותך למקם קובץ בשם runtimeconfig.template.json עם התוכן הבא באותה ספריה המכילה את קובץ הפרוייקט של היישום שלך:

{

     "configProperties": {

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

      }

}

לקבלת מידע נוסף אודות שינוי הגדרות תצורה של זמן ריצה של .NET, עיין בדף התיעוד של הגדרות תצורת זמן ריצה של .NET

כדי להעלים לחלוטין את ההמחאות הנו נוספות, הגדר את בורר התצורה את ערך ה- Sentinel המיוחד -1, כפי שמוצג להלן.

⚠️ אזהרה: הגדר את הבורר AppContext ל- -1 רק אם אתה בטוח כי יישום היעד אינו מטפל בקלט אישור לא מהימן.

בתוך קובץ הפרוייקט של היישום (.csproj או .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>

לחלופין, בתוך הקובץ runtimeconfig.template.json:

{

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

     }

}

אפשרות 5 - שינוי או העלמות של מחשב האימות הנוסף ברחבי מחשב באמצעות הרישום (Windows בלבד עבור .NET Framework)

ישימות: אפשרות זו חלה על כל הגירסאות של .NET Framework בלבד.  הוא אינו חל על .NET 6.0+.

למרות .NET Framework מגביל פעולות ייבוא המוגדרות כברירת מחדל כך שידרשו לא יותר מ- 600,000 איצורים של סיסמה, ניתן להגדיר מגבלה זו ברחבי המחשב באמצעות הרישום HKLM. מגבלה חדשה זו תחול על כל ההפעלות של ממשקי ה- API המושפעים המפורטים לעיל.

כדי לשנות את המגבלה, תחת מפתחHKLM\Software\Microsoft\.NETFramework, הגדר את ערךPkcs12UnspecifiedPasswordIterationLimitלמגבלה החדשה. לדוגמה, כדי להגדיר את המגבלה ל- 1,000,000 (מיליון) רציפים, הפעל את הפקודות כפי שמוצג להלן משורת פקודה עם הרשאות מלאות.

  • מספר זה קובע את מגבלת הטראטיציה הכוללת, שהיא הסכום של ספירת הטרטרציה של MAC, התוכן הבטוח המוצפן וספירת הטרטרציה של שק אכופה. אם ייצאת PFX באופן ידני באמצעות ספירת איטראציה מפורשת <iter_count> (לדוגמה, באמצעות פתיחת pkcs12 -export -iter <iter_count>) וברצונך לייבא blob זה של PFX, הגדר ערך רישום זה לערך של לפחות כסכום כל ה איטראציות הצפויות. בפועל, .NET Framework לאפשר לספירת הטרציה הכוללת לחרוג מעט ממגבלה מפורשת שתצורתה נקבעה כאן.

  • הגדרת הרישום תלויה בארכיטקטורה. כדי להבטיח שאפליקציות יבחין בערך שתצורתו נקבעה ללא קשר לארכיטקטורה המוגדרת כיעד, זכור לשנות הן את הרישום של 32 הסיביות והן את הרישום של 64 הסיביות, כפי שמוצג להלן.

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

כדי להעלים לחלוטין את ההבדקות הנו נוספות, הגדר את ערך הרישום ל- -1 משורת פקודה עם הרשאות מלאות, כפי שמוצג להלן.

  • ⚠️ אזהרה: הגדר את ערך הרישום ל- -1 רק אם אתה בטוח שהשירותים הפועלים במחשב היעד אינם מטפלים בקלט אישור לא מהימן.

  • כדי להגדיר את ה- -1 sentinel, REG_SZ הסוג הזמני במקום REG_DWORD הסוג. הגדרת הרישום תלויה בארכיטקטורה. כדי להבטיח שאפליקציות יבחין בערך שתצורתו נקבעה ללא קשר לארכיטקטורה המוגדרת כיעד, זכור לשנות הן את הרישום של 32 הסיביות והן את הרישום של 64 הסיביות, כפי שמוצג להלן.

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

כדי להחזיר את שינויי הרישום, מחק את הערך Pkcs12UnspecifiedPasswordIterationLimit reg משורת פקודה עם הרשאות מלאות.

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

הערות ספציפיות ל- Windows

ב- Windows, .NET Framework ייבוא אישורים באמצעות הפונקציה PFXImportCertStore. פונקציה זו מבצעת אימות משלה, כולל הצבת מגבלות משלה בספירת איטרציה המותרת המרבית של PFX blob. פעולות אלה עדיין יתבצעו בעת ייבוא PFX. ה- . משתני סביבה ומפתחות רישום ספציפיים ל- NET המתוארים לעיל אינם משפיעים על האופן שבו PFXImportCertStore מבצע בדיקות אלה.

זקוק לעזרה נוספת?

מעוניין באפשרויות נוספות?

גלה את יתרונות המנוי, עיין בקורסי הדרכה, למד כיצד לאבטח את המכשיר שלך ועוד.

קהילות עוזרות לך לשאול שאלות ולהשיב עליהן, לתת משוב ולשמוע ממומחים בעלי ידע עשיר.