אפאצ'י HTTPd Devs נחשב מזיק

רקע
במשך 25 השנים האחרונות, אני מפתח ראשי של apreq תת-פרויקט בתוך שרת Apache HTTPd פרויקט אב. הרעיון המקורי של libapreqכבטוח/בעל ביצועים הגשת טופס HTML וגם עוגייה ספריית הפירוק, יצאה משיתוף פעולה בין לינקולן שטיין ודאג MacEachern בסוף 90s.
זה היה החזון שלי אז להפוך את הספרייה לקשורה גנרית, לא פרל C ספרייה שתתמוך בכריכות שפה משפות תכנות אחרות, ולכן דחפתי לפרויקט להיות הומואים מטריה HTTPd במקום מטריה אפאצ’י-פרל פרויקט.
עם הופעתו של httpd-2.Xחדש לגמרי I/O Filter ארכיטקטורה שנוצרה httpd כמו גם הפרדה מוחלטת של APR מהליבה עצמה כמטרה כללית יותר, כמו זמן ריצה של ניידות ל-POSIX C פרויקטים כמו Subversion. למעשה, libapreq2 מיושר יותר עם Apache APR פרויקט ברוח זו, ו API פרל שלה משקף את זה כחלק שלה APR::Request בנייה. יש לו מצב מובנה CGI לפעולה עצמאית, מחוץ ל httpd זמן ריצה, מה שהופך את בדיקת היחידה לרוח.
אך המרכיב העיקרי של apreq2 תמיד היה mod_apreq2 מודול אפאצ’י, אשר נתפס לראשונה על ידי Bill Wrowe בתחילת 2000s. מה שהוא עיצב, במהלך מפגש סיעור מוחות איתי (באופן אישי), הייתה ספריית מנתח יחידה פנימית ל httpd, כי משותף הבקשה שהוגשה גוף עם כל מודול בעל עניין מרכזי בזמן הריצה. משמעות הדבר היא אספקת נתונים שנותחו למודולים המחוברים למנוע עיבוד הבקשות לפני, במהלך, ו אחרי שהמטפל בתוכן פועל. והיה צורך לעבוד גם עבור בקשות משנה, בין אם מטפל התוכן צרך את הנתונים המנותחים ובין אם לאו, או נצרך ופורק מחדש את גוף הבקשה הגולמית עצמו.
הסברתי את מטרות העיצוב כמה פעמים במהלך השנים, אפילו בשנת 2012 על פיתוח@httpd. אבל זה תמיד היה כמו לדבר עם הרוח עם החבר’ה האלה; פשוט לא היה אכפת להם.
ענני סערה מתכנסים
בעוד חזון זה היה מוצלח מאוד, עם כריכות שפה זמין עבור מספר שפות כמו Perl, PHP, TCL, Rמאז 2010 היא הוכיחה את עצמה כטרגית. קהילת משתמשים קיימת כולל את כולםלא רק החברים של Perl קהילה.
מה קרה? פיליפ גולוצ’י, פרל / FreeBSD עמית שלי באותו זמן, התחיל להרגיז כי אנו לקדם את הפרויקט להשתחרר מתוך שרת HTTPd עצמו. מה פיליפ לא ידע כל כך טוב אז זה היה עד כמה פלבי, vapid וטריטוריאלי הקבוצה הזו הפכהזה היה אומר שצריך לשתף איתם פעולה ישירות. החלטות מוכוונות משתמש על בסיס הקוד.
ב-2012, פיליפ קיבל את מה שהוא רצה, ואני הפסקתי להתנגד לו. מזלג הפרויקט הקיים והעתק C רכיבי ספרייה לליבת HTTPd.
נפילה
בשנת 2018 התפטרתי מהמוסד בהמוניהם1. אתה יכול לנחש את הסיבות.
בשנת 2020 או כך, צוות האבטחה של גוגל ניצל שחרור אלפא של httpd 2.5 על ידי fuzzing עותק בן 8 של apreq2. הם מצאו כמה נקודות חמות שהיו צריכות תיקון.
במקום לקבל את האדיבות של להגיע פיליפ, יצחק גולדסטנט, מקס קלרמן (@MaxKellermann), אני (@joesuf4), או כל מי שמעורב בפיתוח libapreq2, מהנדס זוטר בצוות HTTPd הלך על העסק של “תיקון באגים” נקודות התורפה שגוגל מצאה. אתה יכול לראות תיעוד של עבודת ניסוי וטעייה שלו בכל שחרור מאז.
כמובן שה-CVE המדווח נכתב על ידי חובבנים:
זה בלתי אפשרי לגרום גלישת חוצץ (על ידי עיצוב אדריכלי), כך טענות כאלה היו תמיד baloney; כפי שמעיד העובדה כי מעולם לא פורסם קוד ניצול.
למרות מאמצי הטובים ביותר, היו אפשריות הפניות מצביע NULL; עם אשר מפתח זוטר עשה ניקוי יסודי לפני שנים.
היה לי פריחה מוחית לפני עשרים שנה סביב קידוד charset עבור כותרות MIME, אשר תמיד 7-bit ASCII נקי כאשר בנוי היטב. הטעות של זה לוגיקת parser הייתה בעיית האבטחה המשמעותית היחידה בהיסטוריה של בסיס הקוד כולו. — וכמו NPE, כל התוקף יכול לעשות היה לקרוס את שרת האינטרנט. כמובן, בהגדרת prefork זה יורה את עצמך ברגל כמו האקר; אבל עם @joesuf4/mod_perl, מפעיל אותו בתוך HTTP/2 עם mpm_event עכשיו ניתן להשגה בקלות. לכן חיסול כל צורות קריסות השרת היה עבודה חיונית והכרחית. למפתח זוטר מגיע הרבה קרדיט על ההישג הסופי הזה בתא המטען של @apache/apreq. קודוס.
אבל ההפיכה דה גרייס הייתה שחרור 2022 של 2.17איפה מפתח הרוקי הכניסו בכוונה באג קטלני לבסיס הקוד, שבירה מבחן רגרסיה בן תשע עשרה.
פוסטמורטם
אם אתה תוהה איך משהו עם מבחן רגרסיה שבורה / יוצא דופן CVE מסתכם איפוס סיסמה כגוף קבוע, תצטרך לבדוק כיצד רלנג זה נעשה בפרוייקט השרת.
סיפור ארוך קצר, הם ציינו את המבחן הוא שלח אותה בכל מקרה, וקרא לה “מהדורת אבטחה”. תיקון פגיעות שכל שחרור קודם היה רגיש לה.

למה אכפת לי עכשיו? כי אני הפראייר משתמשים פונים אל תשובות כמומחה לנושא ידוע.
זה מבאס2אבל אני מצטערת לומר לכם שהימים שלי לבושים בכף סופרמן באפאצ’י הסתיימו לפני כעשור.
בכל מקרה, הכי טוב שאני יכול לעשות בשלב זה הוא להראות לך את עץ מקור הייצור שלי עבור libapreq2 — @joesuf4/apreq (ו-@joesuf4/mod_perl).
הערות שוליים
אחד לא סתם “התפטרות מ-ASF”. כדי לעשות הפסקה נקייה, יש להתפטר לא רק מחברות ASF, אלא מכל פרויקט / ועדה אחד הוא חבר. אחרת אחד בסופו של דבר טובע בספאם אימייל אפאצ’י גיהנום.
הבטא זכרים mothballed הפרויקט @apache/apreq, והם עוברים @apache/mod_perl, כי זכרים בטא אין שום דבר טוב יותר לעשות עם הזמן שלהם. יאן יאלביק “מפתח רוקי” מעל מי שעבד בפועל על apreq בעוד חבריו לקבוצה נכשל לו, לא הצביע לפרוש את הפרויקט. לא מפתיע, כי הוא פותר בעיות, לא זכר בטא.