תכנות בטוח חלק ראשון

אתמול שוחרר חלק ראשון של מאמר שכתבתי אודות נושא עצום, חשוב ובד"כ לא נלמד בשם "תכנות בטוח" באתר  Digital Whisper.

החלק הראשון של המאמר זכה להרבה ביקורת בסגנון של "למה לא הכנסת את נושא X", או "למה לא כתבת איך מבצעים התקפה Y". עוד ביקורת שלדעתי הכי פחות עניינית קיבלתי מכמה אנשים בעלי תארים דווקא (חשוב לציין את זה לדעתי): "כתבת שיש דבר כזה SQL Injection אבל לא כתבת מה זה עושה", למרות שזה היה תחת כותרת של "הזרקת קוד", ואם זה לא מספיק, אז צויין שבהזרקת קוד, מורץ קוד במקום שהוא ישמש בתור מידע… קיבלתי עוד כמה ביקורות כאלו של "לא ברור מה בעיה Z עושה" מאותם בעלי תארים.

מדהים אותי שכל התשובות לכל ההתקפות שחוויתי קיבלו מענה כבר בחלק הראשון של המאמר:

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

‫…

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

איפה יכולות הבנת הקריאה של אנשים לחלק הראשון של הטענות ?

אז הנה החלק השני של הטענות:

כאשר המשתמש מזין קלט לתוכנה היא צריכה לעבוד עם הקלט ולהשתמש בו לצרכיה ומטרותיה. הבעיה‬ ‫היא שכאשר משתמשים במידע בצורה המדויקת בה הוא התקבל, ללא יצירת מסננים או טיפול במידע‬ ‫בעייתי, המשתמש יכול להזין קוד כלשהו (בין אם זה‪ SQL‬או כל קוד אחר), להריץ אותו דרך התכנה‬ ‫ולעשות כל העולה ברוחו באמצעות הקוד שהוא הזריק. 2 דוגמאות מאוד נפוצות בעולם ה- ‪  web‬הן‬ ‫הזרקת ‪ SQL‬ והזרקת ‪ HTML/Javascript‬ (המוכר בשם ‪  Cross Site Scripting‬או ‪  XSS‬בקיצור), אך ישנם עוד‬ ‫סוגים רבים ונוספים של הזרקות קוד שונות.‬

כמו שאפשר לראות, גם כאן יש מענה שלם אליהם.

כך שאולי מישהו יוכל להסביר לי פעם אחת ולתמיד את הבעיה בבקשה ?

5 מחשבות על “תכנות בטוח חלק ראשון

  1. Boris Shtrasman

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

    למעשה אני לא מופתע לשאלות למה לא דובר על נושא X (טוב נו אני אחד מהם), מהסיבה הפשוטה שאם יש דברים שאני כבר יודע אני מצפה לקרוא דברים _חדשים_ בנוסף על מה שאני יודע. כמו כן אני מצפה לקבל כמה שיותר מידע שכבר מכיל את הטכניקות הקיימות. אם חושבים על זה אפשר להשקיע מספר גליונות רק עבור זה:
    הבעיה הגדולה שלדעתי חסרה במאמר זה היא חוסר התיכון הלוגי של הקוד –
    קוד בטוח לא מדבר רק על sql injection , buffer overflow ,ובעיות של שפה (שאלה הם שגיאות של מתחילים) אלא גם על נושא גבוה יותר שחבל שלא הורחב כמו אימות הקוד למטרה , אימות האלגוריתמים שעושים את העבודה כמו שצריך והכי חשוב שהתכן הוא נכון (באג בדיזיין זה ז$# בדיבאג … ). עד כמה שאני יודע הפדיחות הרציניות יותר שקשה יותר לעלות עליהן הן דווקא בגלל תיכון שגוי וחוסר העבודה בגישת האפסנאי.

    אני מבין שמטרת המאמר איננה איך לכתוב קוד נכון (שיטות וכן הלאה) אבל זה עדיין היה חסר לי. אולי במאמר הבא אקבל תשובות .. מי ידע.

  2. ik_5 מאת

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

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

    המאמר לא נועד לכסות כלום. הוא נועד לתת לך כיוון איך להסתכל על דברים. יש לך אין סוף בעיות. יש לך אין סוף אלגוריתמים. כלומר זה שיש אלגוריתם ידוע לעשות משהו ספציפי, לא אומר שהוא היחיד. ויכול להיות שאתה תמצא בעצמך עוד דרך לעשות את אותו התוצר בשימוש של אלגוריתם אחר שאתה לבד המצאת. הרי אני לא יכול לכתוב מאמר על משהו כזה נכון ?

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

  3. ארתיום

    לא קראתי את כל המאמר, עברתי עליו ברפרוף.

    1. תקן קוד C המופיע בעמוד 6, הוא לא תקין… (לא מבחינת אבטחה אלא C).
    2. מיטוסים: "‫סיסמאות מעורבלות בצורה חד כיוונית" ‬ – תיאור הבעיה לא נכון. סיסמאות שהם נחספו אפילו כ־hash מהוות מטרה להתקפות brute-force. לכן קלות לפיצוח.
    3. ביזור לא בדיוק יעזור להגנה נגד התקפת DDoS כי אפילו אם יש לך הרבה משאבים קל לחסום אותם.

    עוד הערה קטנה… נושא format-strings הוא כל־כך אהוב ע"י מי שמדבר על אבטחת מידע מצד אחד ומצד שני, אם אתה לא עושה שגיאות דביליות (בדוגמה שהצגת) אז אין שום סכנה בעבודה עם printf. הייתי ממליץ לך לדבר על integer-overflow במקום… זה הרבה פחות שקוף אבל כואב לא פחות.

    אגב… עדיף שלא תציג דוגמאות ב־pascal עם buffer-overflow כי ב־pascal דווקא יש בדיקה (ליתר דיוק אפשר להפעיל) בדיקת גבולות מערכים. אני הייתי משתמש בדוגמאות קצת שונות או לפחות לא הייתי בוחר ב־pascal לצורך זה.

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s