CVE-2019-17666 פגיעות במנהל ההתקן (driver) של כרטיסי רשת אלחוטיים תוצרת Realtek תחת מערכות לינוקס , יכולים לגרום להשבתה (DOS) או אפילו להשתלטות על המערכת .
הפגיעות נמצאה ע"י Nicolas Waisman: https://twitter.com/nicowaisman/status/1185295690139873280
החולשה בקוד הינה מסוג buffer overflow והיא נמצאת בקוד כבר מזה 4 שנים לערך , מה שאומר שהפגיעות נמצאת בלינוקס קרנל עד גירסה 5.3.6 ורב הסיכויים שבמידה ויש לכם התקן רשת אלחוטי של Realtek ואתם עובדים תחת לינוקס , אתם בבעיה.
עד כמה חמורה הבעיה ?
כמובן שכל פגיעות בקרנל היא פגיעות חמורה ביותר , אבל בנוסף לכך , ישנם עוד כמה גורמים ההופכים את הפגיעות למסוכנת במיוחד:
- · מודבר על חולשה שקיימת במצב של קונפיגורציה דיפולטיבית – חולשות המנוצלות במצב קונפיגורציה דיפולטיבית נחשבות למסוכנות במיוחד מכיוון שמרבית המשתמשים לא משנים את ההגדרות הדיפולטיביות של המערכת .
- · מדובר על חולשה שמנוצלת ללא שום התערבות של המשתמש – המשתמש לא צריך לאשר שום דבר או להתקין שום דבר .
- · מדובר על כרטיס רשת אלחוטי – מה שאומר שהתוקף יכול להיות במרחק יחסית ועדיין לנצל את החולשה.
אז מה היא בעצם אותה חולשה ?
כאמור, מדובר על buffer overflow בדריבר RTLWIFI ששיך להתקן ה wifi של Realtek . הפגיעות נמצאת בחלק מהקוד המשויך לפונקצית ה Notice of Absence . פונקציה זו מאפשר ניהול חשמל חכם כנמצאים במצב של Wifi Direct .
מה ?
רשת אלחוטית עובדת בצורה של מחשב (לדוגמא הלפטופ שלנו) שמתחבר ל Access Point – אפשר לקרוא לזה נקודת גישה , או הראוטר האלחוטי שנמצא בכל בית.
אבל ניתן גם לייצר רשת בין 2 מחשבים , ללא ה access point . מצב זה נקרא Wifi Direct . 2 המחשבים ידברו בינהם , ויחליטו ביחד מי "יהפוך" ל access point .
עכשיו , חזרה לחולשה ..
תוקף , שנמצא בקרבת הקורבן , יכול לשלוח אותות לקורבן, אותות אלו נקראים Wi-Fi beacons , וכל עוד כרטיס הרשת האלחוטי של הקורבן דולק , הוא יקבל אותם.
התוקף , יכול לשנות את אחד השדות של אותות אלו ולהכניס שם מידע שיגרום ל buffer overflow ויכול לגרום לקריסה של מחשב הקורבן , או להשתלטות .
Nicolas Waisman הבין שלמרות שהערך של הפרמטר noa_len נבדק , עדיין ניתן לבצע buffer overflow כי אין בדיקה לגודל סופי של הערך.
אפשר לראות בקישור הזה: https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg2133004.html את התיקון שהכניסו לקוד (ודרכו להבין את הבעיה שהיתה) , הקוד נמצא בפונקציה :
static void rtl_p2p_noa_ie(struct ieee80211_hw *hw, void *data, unsigned int len)
התיקון בוצע ע"י הכנסה לבדיקה לגודל מקסימלי :
} else {
noa_num = (noa_len – 2) / 13;
if (noa_num > P2P_MAX_NOA_NUM)
noa_num = P2P_MAX_NOA_NUM;
}
בלינק הזה אתם יכולים לראות את הקוד המלא :
לסיכום :
למרות שמדובר בחולשה מאוד מסוכנת המגדרת CRTICAL , שניתנת לניצול כל עוד כרטיס הרשת גלוי , מרחוק וללא התערבות של המשתמש (כמובן רק למחשבי לינוקס ורק לבעלי כרטיס רשת של Realtek) , למרות שהצליחו לנצל את החולשה על מנת להשבית מחשב. עדיין לא נמצא דרך לנצל את החולשה על מנת לבצע השתלטות.
אבל כאמור , כל יום , לומדים דבר חדש , ולמרות שכרגע לא נראית שיש דרך לנצל את החולשה , לעולם אין לדעת מה עוד יתגלה.