ניתוח תוכנה דינמי

ניתוח תוכנה דינמי, ניתוח קוד דינמי או בקצרה ניתוח דינמי, הוא ניתוח של תוכנת מחשב (code\program analysis) הכולל הרצת התוכנה המדוברת (בניגוד לניתוח תוכנה סטטי, שאינו עושה זאת). ניתוח דינמי כולל טכניקות מוכרות מהנדסת תוכנה כגון בדיקת יחידה, ניפוי שגיאות ומדידה של כיסוי קוד, אך כולל גם טכניקות פחות מוכרות כמו חיתוך תוכניות (program slicing) והסקת מסקנות אינווריאנטית. ניתוח דינמי מיושם באופן נרחב בדיקות אבטחת תוכנה בצורה של זיהוי שגיאות זיכרון בזמן ריצה, טשטוש (fuzzing), ביצוע סימבולי דינמי (dumanic symbolic execution) ומעקב אחר "כתמים" (taint tracking). כדי שניתוח דינמי יהיה אפקטיבי, תוכנית היעד חייבת להתבצע עם מספיק כניסות בדיקה כדי לתת מענה לטווחי הקלט והפלטים האפשריים. אמצעי בדיקת תוכנה, כגון כיסוי קוד, וכלים כגון בדיקת מוטציות, משמשים כדי לנסות לזהות מקרים שבהם הבדיקה אינה מספקת. לצורך ניתוח דינמי, יש להקפיד למזער את ההשפעה שיש למכשור על הביצוע (כולל מאפיינים זמניים) של תוכנית היעד. בדיקות יחידה, בדיקות אינטגרציה, בדיקות מערכת ובדיקות קבלה הם צורות של בדיקות דינמיות. חישוב כיסוי הקוד לפי חבילת בדיקה או עומס עבודה הוא טכניקת ניתוח דינמית סטנדרטית. הוא מזהה מקרים שבהם קוד לא הופעל במהלך בדיקות - מבחין בין קוד ש"מכוסה" לקוד שאינו מכוסה. צורת ניתוח זו מזהה שליליות (קוד שאינו נבדק), אך אינה מזהה חיוביות (היא אינה יכולה לזהות אם הקוד נבדק כראוי - אפילו עבור קוד עם "100% כיסוי"). קוד יכול להיות מורץ על ידי מערכת בדיקה אוטומטית, וכתוצאה יהיה "כיסוי קוד", גם אם ה"בדיקות" לא באמת בודקות דבר גבי מה שהקוד עושה. דוגמאות: Gcov היא תוכנית הכיסוי של קוד המקור של GNU . VB Watch מחדיר קוד ניתוח דינמי לתוכניות Visual Basic כדי לפקח על כיסוי קוד, מחסנית, מעקב אחר ביצוע, אובייקטים ומשתנים מופעלים. בדיקה דינמית כוללת ביצוע תוכנית על קבוצה של מקרי בדיקה (test cases). דוגמאות: AddressSanitizer : זיהוי שגיאות זיכרון עבור Linux, macOS, Windows ועוד. חלק מ־LLVM . BoundsChecker : זיהוי שגיאות זיכרון עבור יישומים מבוססי Windows. חלק מ- Micro Focus DevPartner . Dmalloc : ספריה לבדיקת הקצאת זיכרון ודליפות. יש לבצע קומפילציה מחדש של התוכנה, וכל הקבצים חייבים לכלול את קובץ הכותרת C המיוחד dmalloc.h. Intel Inspector : מאתר שגיאות זיכרון דינמי עבור יישומי C, C++ ו-Fortran הפועלים על Windows ו- Linux . PurifyPlus : בעיקר איתור בזיכרון מושחת וזיהוי דליפות זיכרון. Valgrind : מריץ תוכניות על מעבד וירטואלי ויכול לזהות שגיאות זיכרון (למשל, שימוש שגוי ב־malloc ו־free ) ותנאי מרוץ תהליכים בתוכנות ריבוי תהליכונים. Fuzzing היא טכניקת בדיקה הכוללת ביצוע תוכנית על מגוון רחב של קלט; לעיתים קרובות, קלטים אלו נוצרות באופן אקראי (לפחות בחלקן). Gray-box fuzzers משתמשים בכיסוי קוד כדי להנחות את יצירת הקלט. ביצוע סימבולי דינמי (הידוע גם כ- DSE או ביצוע קונקולי) כולל ביצוע תוכנית בדיקה על קלט קונקרטי, איסוף אילוצי הנתיב הקשורים לביצוע, ושימוש בפותר אילוצים (בדרך כלל, פותר SMT ) כדי ליצור תשומות חדשות שיגרום התוכנית לקחת נתיב זרימת בקרה אחר, ובכך להגדיל את כיסוי הקוד של חבילת הבדיקה. DSE יכול להתייחס לסוג של טשטוש ("קופסה לבנה"). ניתוח זרימת נתונים דינמי עוקב אחר זרימת המידע מ"מקורות" ל"שקעים". צורות של ניתוח זרימת נתונים דינמי כוללות ניתוח כתמים דינמי ואפילו ביצוע סימבולי דינמי. Daikon הוא יישום של זיהוי דינמי של אינוריאנטים. Daikon מריץ תוכנית, צופה בערכים שהתוכנית מחשבת, ולאחר מכן מדווח על מאפיינים שהיו נכונים ביחס לביצועים שנצפו, ולכן כנראה נכונים בכל הביצועים. ניתן להשתמש בניתוח דינמי כדי לזהות בעיות אבטחת מחשבים או רשת. IBM Rational AppScan היא חבילה של פתרונות אבטחת יישומים המיועדים לשלבים שונים של מחזור חיי הפיתוח. החבילה כוללת שני מוצרי ניתוח דינמיים עיקריים: IBM Rational AppScan Standard Edition, ו-IBM Rational AppScan Enterprise Edition. בנוסף, החבילה כוללת את IBM Rational AppScan Source Edition - כלי ניתוח סטטי. Parasoft Jtest משתמשת בזיהוי שגיאות בזמן ריצה כדי לחשוף פגמים כגון תנאי מרוץ, exceptions, דליפות משאבים וזיכרון ופגיעויות להתקפות אבטחה. Intel Inspector מבצע שרשור בזמן ריצה וניתוח שגיאות זיכרון ב-Windows. Parasoft Insure++ הוא כלי לניתוח זיכרון וזיהוי שגיאות בזמן ריצה. רכיב ה-Inuse שלו מספק תצוגה גרפית של הקצאות זיכרון לאורך זמן, עם נראות ספציפית של השימוש הכולל בערימה, הקצאות בלוקים, דליפות אפשריות יוצאות דופן וכו'. ה-Thread Sanitizer (של גוגל) הוא כלי לזיהוי מרוץ נתונים. הוא מכשיר את LLVM IR כדי ללכוד גישה מהירה לזיכרון. עבור תת-קבוצה נתונה של התנהגות של תוכנית, חיתוך התוכנית מורכב מ"הקטנת" התוכנית לצורה המינימלית שעדיין מייצרת את ההתנהגות שנבחרה. התוכנית המוקטנת נקראת "פרוסה" והיא ייצוג נאמן של התוכנית המקורית בתחום של תת-קבוצת ההתנהגות שצוינה. בדרך כלל, מציאת פרוסה היא בעיה בלתי פתירה, אך על ידי ציון תת-קבוצת התנהגות היעד על ידי הערכים של קבוצת משתנים, ניתן לקבל פרוסות משוערות באמצעות אלגוריתם זרימת נתונים. פרוסות אלה משמשות בדרך כלל מפתחים במהלך איתור באגים כדי לאתר את מקור השגיאות. רוב כלי ניתוח הביצועים משתמשים בטכניקות ניתוח תוכניות דינמיות. Khatiwada, Saket; Tushev, Miroslav; Mahmoud, Anas (2018-01-01). "Just enough semantics: An information theoretic approach for IR-based software bug localization". Information and Software Technology (באנגלית). 93: 45–57. doi:10.1016/j.infsof.2017.08.012. Myers, G. J. (1979). The Art of Software Testing. John Wiley and Sons. Chen, Ting; Zhang, Xiao-song; Guo, Shi-ze; Li, Hong-yuan; Wu, Yue (2013-09-01). "State of the art: Dynamic symbolic execution for automated test generation". Future Generation Computer Systems. Including Special sections: Cyber-enabled Distributed Computing for Ubiquitous Cloud and Network Services & Cloud Computing and Scientific Applications — Big Data, Scalable Analytics, and Beyond (באנגלית). 29 (7): 1758–1773. doi:10.1016/j.future.2012.02.006. ISSN 0167-739X. Chen, Ju; Han, Wookhyun; Yin, Mingjun; Zeng, Haochen; Song, Chengyu; Lee, Byoungyoung; Yin, Heng; Shin, Insik (2022). {SYMSAN}: Time and Space Efficient Concolic Execution via Dynamic Data-flow Analysis (באנגלית). pp. 2531–2548. ISBN 978-1-939133-31-1. Chang, Walter; Streiff, Brandon; Lin, Calvin (2008-10-27). "Efficient and extensible security enforcement using dynamic data flow analysis". Proceedings of the 15th ACM conference on Computer and communications security. CCS '08. New York, NY, USA: Association for Computing Machinery. pp. 39–50. doi:10.1145/1455770.1455778. ISBN 978-1-59593-810-7.