הפעם פרשת אבטחת המידע המג׳ורית של היום היא דליפת מידע של כלל אזרחי המדינה (שוב). הפעם מאפליקצית בחירות של ש״ס. הזדמנות מעולה לפוסט הזה אני אסביר טכנית מה קרה שם ואיך נמנעים מזה.
אז מה קרה?
בקצרה ממש בפודקאסט סייברסייבר שבו אני חבר מערכת אנחנו מפעילים תיבת הדלפות אנונימית. בתיבת ההדלפות התקבל מסר מגורם צד שלישי שזהותו לא ידועה עם כמה ג׳יגות של מידע – ספר הבוחרים המלא והמעודכן של מדינת ישראל עם פרטים נוספים והסבר קצר על הדרך. מאיפה המקור? נו, הפעם במערכת המידע של ש״ס, יחד עם ה-מ-ו-ן נתונים אחרים שהמדאיגים שבהם הם מספרי טלפון קווים וניידים וכן קשרים בין בני משפחה. כמובן שמדובר בספר הבוחרים המעודכן. אם הייתם בני פחות מ-18 כאשר מאגר הנתונים של אלקטור דלף (לפני שנתיים) אז עכשיו הפרטים שלכם גם הודלפו. אם הכתובות שלכם כבר השתנו מאז? אז עכשיו גם הם דלפו. יום חג לכל ספאמר, סקאמר ועבריין ועוד דוגמה מאוד מאוד מאוד מצערת לאיך שהמידע שלנו דולף לו לכל פינה. קיבלתם שיחה מ״חברת ביטוח״ שרוצה לעשות לכם בדיקה לתיק הביטוחי והם משתמשים בפרטים שלכם? זה בגלל מאגרים כאלו. שיחות ספאם בלתי נדלות מקבר רחל? זה המאגרים האלו. תקיפות שונות ומשונות? כנ״ל. והרשויות? הצחקתם את סבתא שלי.
אז מה קרה שם מבחינה טכנית?
אני לא מאמין למקורות אנונימיים שמספרים לי שדלף מידע, גם אם הם מספקים את המידע. במקרה הזה גם היה הסבר טכני פשוט עם מילה אחת: דיבאגבר. דיבאגבר, למי שלא מכיר, זו מערכת אולטרא יעילה ונחמדה ל-PHP שמאפשרת לנו לעשות דיבאגינג בקלות וביעילות. ב-Laravel, שזה הפריימוורק של PHP שש״ס השתמשו בו למערכת ניהול הבחירות שלהם, גם השתמשו בו. הדיבאגבר חושף URL בשם:
_debugbar/open
זה URL של ברירת המחדל. מי שייכנס ל-URL הזה יראה אובייקטים של דיבאג:
לכל אובייקט כזה יש ID. רואים בקשות ותנועות שונות של פעולות. מה שמעניין אותנו הוא ה-ID. מה שאנחנו צריכים לעשות זה להכניס אותו לתוך ה-URL הזה:
/_debugbar/open?op=get&id=THE_ID
ה-URL הקסום הזה מחזיר את הסשן של המשתמש שעשה את הפעולה (אם מדובר בפעולה שנעשתה על ידי משתמש).
הסשן הזה (נקרא shas_session!!!) הוא בעצם סשן של משתמש במערכת. מדביקים אותו בעוגיה עם כלי המפתחים:
וזהו. אנחנו בפנים – אם אין לנו הרבה מזל – אז כמשתמש ״רגיל״, שגם זה בעייתי. אבל עם קצת מזל, והדגש הוא ״קצת״, אז כניסה כמנהל ראשי יותר או מנהל מערכת ואז החגיגה מתחילה.
זו נחשבת פרצת אבטחה מאוד מאוד בסיסית לחשוף אותו בסביבת פרודקשן. הוא מופיע בלא מעט רשימות סורקים כמו לא מעט דיבאגרים אחרים. בדיוק כמו שיש גם סורקים שבודקים פלט שגיאות.
איך נמנעים מזה? תפסיקו להפעיל דיבאגר באתרי פרודקשן או לפחות תמנעו הדפסה של שגיאות כאלו לכל אחד שיש לו את הקישור! קישור ״סודי״ הוא לא סודי אם מדובר בקישור של ברירת מחדל.
איך עושים את זה? אם אתם יכולים לגשת לפרטי הדיבאגינג עם מוד אינקוגניטו מהטלפון שלכם? אז יש לכם בעיה. לכבות את מוד הדיבאג. בדיוק בשביל זה יש לנו סביבה לוקלית/פיתוח/סטייג׳ינג. אם ממש אין ברירה, בכל דיבאגר יש דרכים להפעיל אותו רק לכתובות IP מסוימות או למשתמשים מסוימים. בזמנו השתמשתי בקוד פשוט במיוחד:
if( in_array( Request::ip() , [allowed(IPs] ) ) {
config(['app.debug' => true]);
}
אבל יש דרכים אחרות ויותר טובות שאולי מגבילות את השימוש למשתמשים מחוברים. כאן יש הסבר למי שמשתמש ב-Laravel Debugbar.
אבל זה לא רק PHP. זה כל שפה/פריימוורק אחר שיש – פלט דיבאגינג או דיבאגר? רק למפתחים בסביבת פיתוח או לפחות עם הגבלה משמעותית של הפלט. כך למשל פורץ הצליח להשחית את אתר ערוץ 10 בזמנו כי השאירו פלט שגיאות חשוף. איך מונעים פלט שגיאות באתרים אחרים?
ב-PHP/וורדפרס כדאי להקפיד שב-wp-config.php יהיה:
define('WP_DEBUG', false);
אם אתם בכל זאת רוצים דיבאג, השתמשו ב:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
והלוג יודפס ל-wp-content/debug.log. זה לא אופטימלי אבל זה לפחות לא מראה על המסך מה קורה. מומלץ מאוד להגביל את הקובץ לקריאה מהרשת ולקרוא אותו בדרך אחרת שהיא לא דפדפן או לפחות לכבות את פלט השגיאות.
ב-Node.js\express ה-trace מכובה במצב שה-Node_ENV הוא בפרודקשן. אבל יש גם תיעוד ששווה לקרוא.
מהניסיון שלי – אם בגלל תקלה האתר שופך את כל מידע הדיבאגינג שלו – זה הופך להיות אתר בעייתי. אם האתר מכיל כלי דיבאגינג פתוחים – זה הופך להיות אתר בעייתי. אתר שבעיה בו מביאה לדף 500 נחמד? זה מה שצריך להיות.
אז לסיכום, רע מאוד שזה קרה וחבל, כי היה אפשר להמנע מזה. עשו לי טובה ואל תפעילו דיבאגר באתרים בסביבת פרודקשן ואל תאפשרו פלט שגיאות לכל אחד.
4 תגובות
הגיע הזמן שפאדיחות כאלה יהיו עבירה פלילית עם עונש מינימום. איך יקבעו מה הרף ? הרבה יותר בקלות מאשר הפרת אמונים, למשל פרקטיקה מקובלת במסמך של כמה משפטים כנל.
בוורדפרס ניתן למקם את debug.log בשם אחר, בפולדר אחר
וניתן למנוע גישה חיצונית אליו.
בlaravel צריך להוסיף בקובץ env
"`
DEBUGBAR_ENABLED=false
"`
ואם כבר מדברים אז כדי שאם יש שגיאות הם לא יוצגו בצד לקוח
"`
APP_DEBUG=false
"`
אתה מחזיר אותי ל2020 לדליפה של אלקטור… מי ידע שידרשו רק עוד שנתיים ל"עידכון" של המידע.
עצוב