odhcpd הוא השירות שמחלק כתובות ברשת בנתבים שמריצים OpenWrt, והוא מטפל גם ב-DHCPv6, גם ב-DHCPv4 וגם בהודעות הניתוב. בגרסאות שלפני 25.12 מספיקה חבילת DHCPv6 אחת, בלי שם משתמש ובלי סיסמה, כדי לדרוס זיכרון בתוך השירות הזה. הציון הוא 9.8 מתוך 10, והתיקון נמצא בגרסה 25.12.
מה החולשה?
כשהנתב מקבל בקשה לכתובת, הוא מרכיב את התשובה שלו באזור זיכרון זמני בגודל קבוע, 512 בתים. בקשת DHCPv6 אחת יכולה לשאת בתוכה כמה וכמה בקשות כתובת, מה שהרשומה מכנה IA options, וכשיש בה מספיק מהן התשובה שנבנית כמעט ממלאת את כל השטח שהוקצה. בנקודה הזאת הקוד שמטפל בתשובה כותב מעבר לקצה ודורס את מה שיושב שם. לכשל הזה קוראים גלישת חוצץ במחסנית, והסיווג הרשמי הוא CWE-121.
שני פרטים ברשומה הם מה שהופך את זה מבאג לבעיה. הראשון הוא שלא מדובר בטעות אחת במקום אחד: הרשומה מתארת שתי נקודות גלישה נפרדות באותה שרשרת קריאות, ושתיהן נגישות מהרשת באמצעות חבילת UDP אחת שאינה דורשת אימות. אין משתמש שצריך ללחוץ על משהו ואין שלב מקדים.
הפרט השני הוא מה שחסר במכשיר עצמו. בשרת רגיל שתי הגנות מקובלות מקהות כשל כזה: ערך שמירה שהמערכת שותלת מעבר לאזור הזיכרון ובודקת לפני שהיא חוזרת מהפונקציה, מה שקרוי stack canary, ופיזור אקראי של כתובות הזיכרון, ASLR, שמקשה על התוקף לדעת לאן בכלל להפנות את ההרצה. הרשומה אומרת במפורש שבמכשירים משובצים כמו נתבים שתי ההגנות האלה חסרות לעיתים קרובות, ושבגלל זה הרצת קוד כאן היא תרחיש מעשי ולא תיאורטי.
ושתי ההגנות החסרות פוגשות עובדה שלישית שהרשומה מציינת: ב-OpenWrt השירות הזה רץ בהרשאות root. הדירוג מסמן פגיעה גבוהה בסודיות, בשלמות ובזמינות, ושלושתן יחד הן בדיוק מה שמקבל מי שמריץ קוד כ-root על הנתב. התוצאה אינה קריסה של רכיב אחד.
מי מושפע?
הטווח שהרשומה נותנת פשוט: odhcpd בכל הגרסאות שלפני 25.12.
מי שמריץ OpenWrt מריץ את odhcpd כמעט בוודאות, כי זהו השירות שמחלק כתובות במערכת הזאת והוא נמצא שם בהתקנה רגילה מההתחלה. השאלה אינה אם הוא מותקן אלא איזו גרסה רצה.
בישראל OpenWrt אינו מה שמגיע עם הנתב מספק האינטרנט. הוא נמצא אצל מי שהחליף את הקושחה של הנתב בעצמו, אצל מי שקנה חומרה במיוחד כדי להריץ אותו, ובמעבדות ובצוותי פיתוח שמשתמשים בו כבסיס. זה קהל קטן, וזה גם בדיוק הקהל שאין לו מי שיעדכן במקומו: בנתב של הספק הקושחה מתעדכנת מרחוק בלי שאף אחד נגע בה, ובנתב שהקמתם בעצמכם היא מתעדכנת כשאתם מעדכנים אותה.
האם מנוצלת בפועל?
נכון לעדכון האחרון של הרשומה, ב-23 באוקטובר 2026, אין ידיעה על ניצול בפועל. החולשה אינה מופיעה בקטלוג ה-KEV של CISA, סוכנות הסייבר האמריקאית, שאוספת שם את החולשות שיש עדות לכך שתוקפים משתמשים בהן.
זה אינו אומר שהחולשה אינה מנוצלת, אלא שלא ידוע על כך. בין חבילת UDP אחת בלי אימות לבין נתב שמריץ קוד בהרשאות root אין הרבה שלבים, והמצב הזה יכול להשתנות. הדף הזה מתעדכן כשהוא משתנה.
מי שרוצה לראות מה בדיוק תוקן יכול לקרוא את התיקונים עצמם, שפתוחים לעיון במאגר הקוד של odhcpd.
מה עושים?
1. בדקו איזו גרסה רצה אצלכם. בממשק הניהול של OpenWrt, LuCI, מספר הגרסה מופיע תחת Status ואז Overview. מי שמתחבר ב-SSH יכול לקרוא אותו מתוך הקובץ /etc/openwrt_release.
2. אם odhcpd אצלכם מתחת ל-25.12, עדכנו. העדכון מגיע בשתי דרכים: שדרוג קושחה מלא לגרסת OpenWrt שכוללת את odhcpd 25.12, או עדכון החבילה odhcpd לבדה דרך מנהל החבילות של המערכת. אם לא עדכנתם מזמן, הדרך הראשונה עדיפה, כי זאת אינה החולשה היחידה שתוקנה בדרך.
3. אם אינכם משתמשים ב-IPv6 בכלל, כבו את שירות ה-DHCPv6 בהגדרות הממשק. הכשל יושב בקוד שמרכיב את התשובה ל-DHCPv6, ושירות שאינו פועל אינו מרכיב תשובות. זה אינו תחליף לעדכון, אבל זה סוגר את הדרך שבה החבילה מגיעה.
4. ודאו שממשק הניהול של הנתב והשירותים שלו אינם נגישים מצד האינטרנט אלא מהרשת הפנימית בלבד. בנתב מוכן מהמדף זאת הגדרת ברירת המחדל, ובמכשיר שהוקם ידנית זה בדיוק הפריט שנשכח.