אני אספר על התקפה בשם Sockstress/Slowloris/Slow Read שמאפשרת כרגע להפיל בערך כל אתר שלישי באינטרנט, כי אף אחד לא טורח להתעדכן. ועל דרכים למניעתה.
איך זה עובד?
העיקרון של ההתקפה מתבסס על ההגבלה של השרת למספר חיבורים(sockets) שהוא יכול להחזיק בו זמנית עם הלקוחות. ועל זה שהשרת לא יודע להבדיל בין חיבור "טוב"(כלומר באמת בן אדם שרוצה לפתוח דף), לסתם חיבור שתלוי לו באוויר.
העניין הוא לדעת ליצור חיבורים כאלה שהשרת לא יסגור, אלא שימשיכו להיות תלויים באוויר. לדוגמה, התוכנה Slowloris עושה שאילתות חלקיות, היא מתחילה חיבור עם השרת, ואז שולחת את החלקים של השאילתה באיטיות, אבל לא יותר מדי איטית כדי שהשרת לא יסגור את החיבור. מה שנשאר לעשות זה לפתוח 1000 חיבורים כאלה בו זמנית, והשרת יפסיק להגיב למשתמשים רגילים, ורק יחכה לסיום של החיבורים האלה.
קצת היסטוריה
הראשונים שהציגו את ההתקפה Sockstress היו Outpost24 בספטמבר 2008. ההתקפה נהייתה פופולרית יותר תחת השם Slowloris, בזכות מנהל הבלוג ha.ckers, שבשנת 2009 הוציא תוכנה תחת אותו שם שמיישמת התקפה באותו עיקרון. התוכנה שימשה בין היתר להתקפת אתרים של שלטון איראן, כחלק ממחאה שהייתה באותו זמן בגלל הבחירות.
היום
היום אנחנו ב-2013 ועדיין רוב השרתים פגיעים להתקפה הזאת. ב-2011 יצאה תוכנה חדשה, שבה אני משתמש (למטרות שלום בלבד :)), העונה לשם SlowHTTPTest. היא מיישמת התקפה בשם Slow Read, שזה קצת שונה ממה ש-Slowloris עושה. בשונה ממנו, SlowHTTPTest עושה שאילתה רגילה לגמרי, אבל ברגע שהשרת מתחיל להחזיר תשובה, התוכנה אומרת שאין לה מקום בזיכרון, ואז השרת מתחיל לחכות ללקוח. פעם בכמה זמן התוכנה מורידה עוד קצת ביטים, כדי להחזיק את החיבור חי.
התקנת SlowHTTPTest
SlowHTTPTest עובד רק בלינוקס, ובכלל אפשר ליצור את ההתקפה הזאת רק מלינוקס, כי ו'ינדוס מקביל את מספר החיבורים שאתם יכולים לפתוח לבערך 100-200, שזה בדרך כלל לא מספיק.
תורידו את הגרסה האחרונה, ותריצו את הפקודות הבאות:
cd slowhttptest-x.x
./configure --prefix=PREFIX
make
במקום PREFIX תרשמו את המקום המדויק על המחשב בו אתם רוצים להתקין את SlowHTTPTest.
אצלי באובונטו התוכנה ביקשה את g++ ואת libssl-dev. יכול להיות שכבר יש לכם, אם לא, אז באובונטו אתם יכולים להתקין את זה בצורה הזאת.
העיקר – איך מגנים על השרת מהתקפה הזאת
זה לא קשה בכלל. קודם כול צריך להגביל את כמות החיבורים שכל IP יכול לפתוח עם השרת שלכם, ודבר שני לצמצם את זמן החיבור המקסימלי.
אני אסביר איך עושים את זה באפאצ'י.
הגבלת כמות החיבורים של כל IP
מגבילים את כמות החיבורים בעזרת המודול mod_securit.
התקנה באובונטו מתבצעת עם פקודה אחת:
ב-Log של השרת שלכם (var/log/apache2/error.log) יהיה רשום משהו כזה:
כנסו ל-etc/apache2/mods-enabled/reqtimeout.conf.
אם אתם לא משתמשים ב-SSL אתם יכולים להקטין משמעותית את המספרים, אני הגדרתי בצורה הזאת:
RequestReadTimeout body=1,minrate=500