פינג של מוות! FreeBSD מתקן באג קריסתי בכלי הרשת PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

פינג של מוות! FreeBSD מתקן באג crashtastic בכלי הרשת

אחד מכלי הרשת הנמוכים הראשונים שכל משתמש מחשב לומד עליהם הוא המכובד ping תוֹעֶלֶת.

הפקודה, הנקראת על שם אפקט הקול המכונה מכל סצנת סרטי מלחמה מהאסכולה הישנה הכוללת צוללות, היא הד מטאפורי (ראו מה עשינו שם?) של הגרסה התת-ימית של RADAR הידועה בשם SONAR.

אתה שולח רעש p-i-n-g (יותר כמו רעש d-o-i-n-n-n-n-g, ב מציאות) לתוך המעמקים המלוחים, ועל ידי מדידת כמה זמן לוקח להד המפחיד שלו לחזור אליך, ועל ידי הערכת מהירות הקול באוקיינוס ​​שמסביב, אתה יכול לחשב את המרחק לעצם שהפיק את ההד.

באופן מסקרן, בהתחשב בעובדה שבטח שמעתם את הקיצור TCP/IP המשמש כתיאור כללי של דבק הפרוטוקול שמפעיל את האינטרנט, ping טכנית אינו משתמש ב-TCP/IP כלל.

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

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

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

פינג שונה

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

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

כתוצאה מכך, ping משתמש בפרוטוקול ברמה הרבה יותר נמוכה מאשר TCP.

ואכן, ping אפילו לא משתמש בבן דוד היותר מזדמן של TCP UDP, קיצור של פרוטוקול יחידת נתונים של משתמש, שהיא דרך להעביר נתחי נתונים שהיא מהירה וקלה, אבל היא מכונה בדרך כלל שלח-ותקווה (או, אם אתה טיפוס ציני, ריסוס-ו-Pray).

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

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

בדרך כלל מטופלים ישירות בליבת מערכת ההפעלה, כך שכמעט בטוח שמנות ICMP/IP יעברו גם אם אף תוכנת רשת ברמה גבוהה יותר לא עלתה כהלכה, ICMP כולל בעיקר שני סוגי הודעות מיוחדים:

  • הקלד 0x08. נקרא רשמית ICMP Echo, זה סוג של חבילה נקרא בדרך כלל בקשת הד. זה מה ש ping התוכנית שולחת על מנת לחפש מחשבים פעילים ברשת.
  • הקלד 0x00. נקרא רשמית ICMP Echo Reply, סוג החבילה הזה הוא בדיוק מה שכתוב. מחשב שחי, מקוון ולא מוגדר לחסום תעבורת ICMP Echo אמור לשלוח מנות מסוג זה ישירות חזרה למחשב שביקש זאת.

כמו זה:

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com דפוס: 0x4e414b45445345435552495459 PING news-sophos.go-vip 192.0.66.227 בתים מ-56 (84): icmp_seq=64 ttl=192.0.66.227 time=192.0.66.227 ms 1 בתים מ-53 (84.0): icmp_seq=64 ttl=192.0.66.227 time=192.0.66.227 ms 2 (53): icmp_seq=85.1 ttl=64 time=192.0.66.227 ms --- news-sophos.go-vip.net סטטיסטיקת פינג --- 192.0.66.227 מנות שודרו, 3 התקבלו, 53% אובדן מנות, זמן 84.8ms rtt min/ avg/max/mdev = 3/3/0/2004 אלפיות השנייה

לראות א ping בפעולה ברמה מעט נמוכה יותר, נשתמש בקוד Lua שתוכל למצוא בסוף המאמר כדי לבנות חבילת ICMP Echo משלנו, וכדי לקרוא את התשובה שחוזרת, אם בכלל:

$ sudo luax ping.lua nakedsecurity.sophos.com שולח בקשת ICMP ECHO ל- 192.0.66.227 --> 00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65 | 71 75 00000010 65 73d 74 4 65 73 73 61 67 65 20 42 42 35 |estMessage BB41A36| 5 6 00000020 46 |F31D | חזרתי--> 44 1 00000000 45 00 f00 af 37 6 00 00 35 01f c94 7 0 e00 |E..42....3.....B.| 7 XX XX XX XX 5 00000010 00b 00 bb 0a 02f 5d 6 1 50e 69 |.........Zo.Ping| 6 67 00000020 52 65 71 75 65 73d 74 4 65 73 73 61 67 65 |בקשה הודעה ב| 20 42 00000030 42 35 41 36 46 |B31A44F5D |

אגב, היינו צריכים להשתמש sudo למעלה כדי להפעיל את הסקריפט שלנו עם הרשאות משתמש-על, מכיוון שיצרנו את מה שמכונה a שקע IP גולמי - כזה שניתן לעצב בכל פורמט בסיסי שאנו אוהבים, כולל TCP, UDP, ולפי הצורך כאן, ICMP.

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

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

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

בוחן את התשובה

כפי שאתה עשוי לזהות ב-Data dump מהסקריפט שלנו למעלה, פונקציית שקע הרשת שבה אנו משתמשים כדי לקרוא בחזרה נתונים מהשרת המגיב כוללת לא רק את נתוני ICMP Echo Reply, אלא גם את ה-IP ברמה נמוכה (כותרות פרוטוקול אינטרנט) בחבילה הבסיסית.

לא ניסינו לנתח או לעבד נתונים אלה בדרך אחרת, אלא את FreeBSD ping התוכנית צריכה לעשות זאת כדי להבין את התשובה, לרבות להבין את כל הודעות השגיאה שחוזרות.

אם ping נדחה בדרך כלשהי, תשובת ה-Echo תכלול בדרך כלל לא רק כותרות IP משלו (כפי שנראה לעיל), אלא גם עותק עזר של כותרות ה-IP ונתוני ה-ICMP שהופיעו בבקשה היוצאת המקורית.

כותרות מנות IPv4 בדרך כלל נראות כמו שאתה רואה למעלה, היכן שכותרות ה-IP מתחילות 45 00 00 37... והמשך למשך 20 בתים בסך הכל, עד וכולל את הבתים המוצגים כ ...XX XX XX XX, שהיא כתובת ה-IP של המחשב הנייד שלי.

כמו זה:

00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX |.... | גרסת IP ואורך כותרת: 0x45 (4 = IPv4, 5 = חמש מילים של 32 סיביות, כלומר 20 בתים סוג שירות ונתוני גודש: 0x00 אורך כולל של חבילה: 0x0037 (עשרוני 55) מידע רצף: F6 AF 00 00 Time-to -חי (דילוג שמאלה): 0x35 (עשרוני 53) סוג פרוטוקול: 0x01 (ICMP) סכום בדיקה: 0x947F (עשרוני 38015) מספר ה-IP של המחשב שליחת: C0 00 42 E3 (192.0.66.227 = nakeds.comity) IP.sophos'security. מחשב נייד): XX XX XX XX (מועד = מספר ה-IP שלי)

של FreeBSD ping מתכנתים, כך נראה, הניחו שכותרות מהסוג הזה, אכן, תמיד יהיו באורך 20 בתים בדיוק, בהתבסס על ערך אורך הכותרת הזה בבייט הראשון של 0x45, מציין IPv4 (0x4?) עם 5-DWORD (0x?5), או כותרת של 20 בתים.

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

אתה יכול לנחש לאן זה הולך.

לאותו בייט ראשון בכותרת IPv4 יכול להיות כל ערך מבחינה חוקית 0x45 (גודל הכותרת המינימלי של 5 DWORDs, או 20 בתים, כפי שמוצג) עד 0x4F (מציין 15 DWORDs, מכיוון ש-0xF הוא 15 עשרוני, או 60 בתים של נתוני כותרת בסך הכל), ובכך מאפשר בצורה מסודרת תוספת אופציונלית של 40 בתים של נתוני כותרת.

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

היזהרו מפושעי רשת שמעמידים אתכם במבחן

כפי שאתה יכול לדמיין, בהתחשב בכך שכמעט אף פעם לא נעשה שימוש בשדות הנוספים האלה, ייתכן שלעולם לא תראה חבילת IPv4 עם שום דבר מלבד 0x45 בהתחלה, ועם 20 בתים של נתוני כותרת בסך הכל, אלא אם כן נתקלת בחבורה של פושעי סייבר שמוכנים להעמיד אותך למבחן.

למרבה הצער, אין הרבה מה לעצור תוקף מלהרכיב שרת שמנחש אם אתה משתמש ב-FreeBSD, ויוצר בכוונה מנות ICMP/IP Echo Reply גדולות מדי כדי לעורר הצפת מאגר ערימה בתוך שלך ping תכנית.

אם אי פעם תבדוק אם השרת שלהם פעיל (מה שאתה עשוי לעשות אפילו, או אולי במיוחד, אם אתה חושב שזה חשוד!), אתה יכול להיות ממוקד עם תשובה ממולכדת.

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

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

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

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

כפי שתואר לעיל, כוחות משתמש-על נדרשים רק כדי לרכוש שקע IP גולמי ממערכת ההפעלה, לא כדי להשתמש ב- sendto() ו recvfrom() מתפקד על השקע לאחר מכן.

הבאג הזה קיבל את המזהה הרשמי CVE-2022-23093; זה מתועד בייעוץ האבטחה FreeBSD-SA-22:15.ping.

מה לעשות?

  • אם אתה משתמש FreeBSD, פשוט עדכן את המהדורות המושפעות (FreeBSD 12 ו-FreeBSD 13) לגרסאות האחרונות שלהן, שם הבאג הזה תוקן.
  • אם אתה מתכנת רשת, ודא תמיד שהבאת בחשבון כותרות מנות שעלולות להצביע על שינויים חריגים בגודל. העובדה שמעולם לא ראית וריאציה כלשהי בעצמך לא מונעת ממך להתמודד מחר עם חבילה יוצאת דופן אך חוקית לחלוטין.
  • אם אתה מנהל רשת, שקול חסימת מנות IPv4 עם כותרות IP שגודלן אינו 20 בתים. אם נראה שאתה באמת צריך לאפשר לחלק ממוצרי תוכנה להשתמש באפשרויות כותרות חריגות של IPv4, שקול לרשום מנות חריגות אלה כדי ללמוד מדוע.

תיזהר שם בחוץ!


קוד דוגמה להדגמת תנועת פינג


בול זמן:

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