בפעם השנייה החודש, פרצת אבטחה חמורה מתגלה בקרנל של לינוקס והפעם היא משפיעה על כל גרסאותיו ב-8 השנים האחרונות.
בדר"כ כשמדברים על מערכות הפעלה מתעורר הויכוח איזו מהן הכי טובה, מהירה, יציבה אך בעיקר – בטוחה.
רוב המשתמשים הביתיים משתמשים במערכות ההפעלה של מיקרוסופט עקב ממשק המשתמש הגרפי הנוח. מולם עומדים משתמשי הלינוקס הטוענים (ובצדק) לעליונותן של ההפצות השונות של ה-Linux בתחומים רבים. יחד עם זאת, מוסכמה כללית היא שמערכות ההפעלה של מיקרוסופט נחותות מבחינה האבטחה. סטטיסטית, כמות הפרצות המתגלה בהן גדולה פי כמה מבמערכות ההפעלה המבוסססות על הקוד של לינוקס לאורך השנים.
מערכות ההפעלה של לינוקס חדרו לחיינו במגוון דרכים מגוונות ועל חלקן אף כתבנו לאחרונה. בין השאר גוגל הודיעה לאחרונה על פיתוח מערכת הפעלה Chrome OS המבוססת לינוקס, פוג'יקום הצטרפה לשאר היצרניות המשווקות את לינוקס כאחת ממערכות ההפעלה המגיעות עם המחשבים הניידים שלה ולאחרונה אף הושקה גרסה 9.04 של אובונטו, מערכת הפעלה עם ממשק גרפי מתקדם שהביאה את לינוקס להמונים.
יחד עם זאת, הפצות הלינוקס השונות לא כבשו את השוק כי בכל זאת, מול מכונת השיווק המשומנת של מיקרוסופט, יש ליצרניות הלינוקס עוד הרבה מה ללמוד. אל מול הדיבורים על כמה שמערכות חלונות הן פרוצות ומלאות באגים, עומדת לה בתדהמה העובדה הבאה: לפני זמן קצר התגלתה פרצה באבטחת ארכיטקטורת ה-Kernel (הליבה) של ה-Linux, בגרסאות 2.4 ו-2.6, שמאיימת לא רק על הפצה כזו או אחרת בגרסתה הנוכחית, אלא היא תקפה לרוב הפצות הלינוקס ב-8 השנים האחרונות (מאז שנת 2001).
הקרנל
בשביל להבין את מהות הבעיה, צריך מעט הקדמה על ה-Kernel (ליבה) של לינוקס: בליבת לינוקס, לכל סוקט יש מערך (struct) של מצביעים לפונקציות, הממשות פקודות שניתן לבצע על אותו הסוקט (bind וaccept למשל). אם יש פונקציה שלא ממומשת עבור סוג מסוים של סוקט, הקרנל מצפה שהמצביע יפנה לפונקציה סתומה (stub) כלשהי, על מנת שלא ייווצר מצב בו הפונקציה אינה ממומשת והמצביע יפנה ל-null. גם אם קרה המקרה, ופונקציה מסוימת מפנה ל-null, אין זה אומר כי תיווצר בעיה, מאחר ובמקרים רבים הקרנל מוודא את ערך המצביע לפני שהוא ניגש אל המקום בזכרון אליו מפנה המצביע.
במקרה שלנו, נתגלתה פונקציה (sock_sendpage) בקרנל שאיננה מוודאת את תקינות המצביעים אותם היא מקבלת, ולכן מסתמכת על אתחול נכון של אותו המערך עליו דובר קודם לכן. לאחר מחקר ובדיקה מעמיקה, נמצאו מספר פונקציות שאינן ממומשות, וכצפוי, גורמות לפעולה אשר נקראת null pointer dereference בקרנל, שמשמעותה היא הרצת קוד מ-page 0 בזיכרון. על מנת לנצל את הפרצה הזו, על המשתמש לשתול באותו איזור בזיכרון קוד זדוני ולגרום לקרנל לגשת לאותו הבאג, פעולות שהוכחו כפשוטות מאוד. מרגע זה ואילך, אותו הקוד ששתל המשתמש ירוץ תחת ההרשאות הגבוהות ביותר, ולמעשה יעניק למשתמש את היכולות לעשות ככל העולה על רוחו במערכת הפגיעה. פעולה כזו, של קבלת הרשאות גבוהות מהקיימות, נקראת local privilege escalation.
הפרצה משפיעה על רשימה ארוכה של פרוטוקולים, ביניהם: Appletalk, IPX, X.25, IRDA, Bluetooth, ISDN, AX25, SCTP via IPv6 ו-IUCV. היא מוגדרת כקריטית, בעיקר בגלל שיש הרבה דרכים לקבלshell על לינוקס (פרצותבשרתי web למשל) והרבה פחות דרכים לקבל הרשאות משתמש root (מקביל ל-Administrator ב-Windows), כך שברוב הפעמים, בשילוב עם באג נוסףשעוזר להשיג shell,לא נשאר הרבה לעשות. ישנן הפצות לינוקס כגון Linux SPLAT (ר"ת של Secure Platform) אשר חסינות מפני הפרצה כי ההרשאות ומרחב העבודה (Bash) שלהן תוגבר על ידי היצרנית, לאבטחה מוגברת.
הפרצה הנוכחית מצביעה ששום מערכת, מאובטחת ככל שתהיה, לא חסינה מפני נפלאות המח האנושי.
מוקדש לעידן נחום
עידן היה מתכנת מחונן עם מוח אנליטי מדהים ואחד ההאקרים המכובדים בישראל. מגיל 14 הוא נשם מחשבים ועוד בתקופה שלא ידעו בארץ מה זה לינוקס והאקינג, כבר היה מומחה בתחום. בשנת 2001 היה חלק מהצוות שיצר את ה-PaX הראשון ל-Windows. לאחר שירות בתחום אבטחת מידע ביחידת מחשבים מובחרת בצה"ל הוא עבד בענקיות אבטחת מידע בישראל והיה דמות מכובדת בקהילות הרלוונטיות בסצנה, תחת הכינוי tanin. עידן הלך לעולמו בטרם עת עקב החלטה לא נכונה שעלתה לו ביוקר, כאשר הוא בסה"כ בן 26. יהי זכרו ברוך.
תודה לעופר שרייבר על העזרה בהכנת הכתבה.