ארכיון יומי: 24 נובמבר, 2010

הזרקת קוד

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

הרבה פעמים מערכות אשר לא נחשבות לקריטיות (כלומר ה"ציבור" לא נחשף אליהן), הן הפתח לפגיעה יותר חמורה מאשר מערכות קריטיות (חשוף בעולם האינטרנט). נגיד אם יש לי גישה ל switch מנוהל באמצעות HTTP, ואני מוצא שם XSS או SQL Injection, עד כמה מסובך להשיג את סיסמת המנהל למערכת ? ומכאן עד כמה מסובך לנחש את שאר הסיסמאות למערכות השונות ? עד כמה מסובך לקבל אח"כ "אינטרנט בחינם" או עוד הרבה דברים אחרים, כולל נזק אמיתי לארגון במטרה לעשות לו נזק ?

יותר מזה, הרבה מתכנתים אף פעם לא לומדים להבין את המשמעות של הזרקת קוד, ולא חושבים בכלל לכיוון. כבר שמעתי ממתכנת .NET שמצאתי לו SQL Injection "אבל אתה לא באמת יכול לשנות לי כלום כי יש לי Javascript שמאפשר רק לתווים מסויימים לעבור", ולקח לי 2 דקות להראות לו איך אני עוקף את ה"הגנה" הזו…

העניין הוא שהזרקת קוד זה לא רק Cross Site Scripting (כלומר XSS) או SQL Injection, אלא אני ממש רואה מקומות שמשתמשים ב eval לקוד שמגיע מהמשתמש, או ניתוח קבצי JSON למשל ב Javascript/Python במקום לנתח את הטקסט וליצור מזה מבנה אמיתי בשפה, פשוט עושים קיצורי דרך מסוכנים. תארו לכם שאני יכול להיכנס לשרת שלכם ולעשות כל העולה על רוחי אם אתם מריצים eval (או evil כמו שאני קורא לזה) ולהכניס קוד שפותח לי "שרת" לגישה ישירה ל bash ללא הזדהות וללא שהות, ולפעמים אפילו לקבל הרשאות root עליו.

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

אני מקווה שזה יעזור יותר לאנשים מאשר המאמרים שלי על תכנות בטוח.