אבטחה רצינית: GnuTLS עוקב אחר OpenSSL, מתקן באג תזמון התקפה

אבטחה רצינית: GnuTLS עוקב אחר OpenSSL, מתקן באג תזמון התקפה

צומת המקור: 1956368

בשבוע שעבר כתבנו על חבורה של באגים בניהול זיכרון שתוקנו בעדכון האבטחה האחרון של ספריית ההצפנה הפופולרית OpenSSL.

יחד עם באגי הזיכרון האלה, דיווחנו גם על באג שדובב CVE-2022-4304: תזמון אורקל בפענוח RSA.

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

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

לא כל הנתונים מעובדים באופן שווה

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

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

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

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

גם אם אתה יכול לחלץ רק בייט אחד של טקסט רגיל, ובכן, זה לא אמור לקרות.

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

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

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

אבל "מיליון חבילות בשעה יותר או פחות מהרגיל" היא פשוט כבר לא וריאציה גדולה במיוחד.

באג "אורקל" דומה ב-GnuTLS

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

לזה יש את מזהה הבאגים CVE-2023-0361.

למרות ש-GnuTLS אינו פופולרי או בשימוש נרחב כמו OpenSSL, כנראה שיש לך מספר תוכניות ב-IT שלך, או אפילו במחשב שלך, שמשתמשות בו או כוללות אותו, אולי כולל FFmpeg, GnuPG, Mplayer, QEMU , Rdesktop, Samba, Wget ו-Wireshark.

למרבה האירוניה, פגם התזמון ב-GnuTLS הופיע בקוד שאמור היה לרשום שגיאות תזמון מלכתחילה.

כפי שאתה יכול לראות מהבדל הקוד (הבדל) להלן, המתכנת היה מודע לכך שכל מותנה (if ... then) הפעולה המשמשת בבדיקה והתמודדות עם שגיאת פענוח עשויה לייצר וריאציות של תזמון, מכיוון שמעבדים בדרך כלל לוקחים פרק זמן שונה בהתאם לאיזה דרך הקוד שלך הולך לאחר הוראה "ענף".

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

הבדל קוד של gnutls-3.7.8/lib/auth/rsa.c לעומת 3.7.9

אבל המתכנת עדיין רצה לרשום שאולי מתרחשת התקפה, מה שקורה אם if (ok) המבחן לעיל נכשל ומסתעף לתוך else { ... } סָעִיף.

בשלב זה, הקוד קורא ל- _gnutls_debug_log() פונקציה, שיכולה לקחת לא מעט זמן לעשות את עבודתה.

לכן הקודן הכניס קריאה מכוונת ל _gnutls_no_log() ב then { ... } חלק מהקוד, שמתיימר לרשום "התקפה" כשאין כזו, כדי לנסות להאריך את הזמן שהקוד מבלה בכל כיוון if (ok) הוראת סניף יכולה לקחת.

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

מה לעשות?

אם אתה מתכנת: תיקון הבאגים כאן היה פשוט, ופעל לפי עיקרון "פחות זה יותר".

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

...וקוד שלא הידור לא יוכל לפעול לעולם, בין אם בטעות או בתכנון.

אם אתה משתמש GnuTLS: הגרסה שיצאה לאחרונה 3.7.9 ו"טעם המוצר החדש" 3.8.0 יש לכלול את התיקון הזה, יחד עם כמה אחרים.

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

ב-Linux, חפש קבצים עם השם libgnutls*.so למצוא ספריות משותפות כלשהן, ולחפש gnutls-cli כדי למצוא עותקים כלשהם של תוכנית השירות של שורת הפקודה הכלולה לעתים קרובות עם הספרייה.

אתה יכול לרוץ gnutls-cli -vv כדי לברר איזו גרסה של libgnutls זה מקושר באופן דינמי ל:

 $ gnutls-cli -vv gnutls-cli 3.7.9 <-- הפצת הלינוקס שלי קיבלה את העדכון ביום שישי האחרון (2023-02-10)

בול זמן:

עוד מ ביטחון עירום