מתקפת מקור טרויאני, מה זה?

18/11/21

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

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

מסוקרנים, כפי שקורה לעתים קרובות בעולם הסייבר, החלטנו להעמיק ...

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

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

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

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

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

עם התפתחות מערכות המחשב השתנו הצרכים והיה צורך להרחיב את תקן ASCII כדי לאפשר קידוד של תווים המגיעים משפות שונות או הכרחיים עבור סביבות ספציפיות.

התקן המכונה UNICODE עבר אפוא בהדרגה. תקן זה מאפשר קידוד של 144.697 בין תווים וסמלים שונים. בין אלה הם מה שנקרא אלפבית משמאל לימין (משמאל לימין, כגון איטלקית, רוסית, אנגלית...) ה מימין לשמאל (מימין לשמאל, כמו ערבית, עברית...). במקרה של Unicode, שהוא אחד מתקני הקידוד הנפוצים ביותר כיום, אלגוריתם שנקרא אלגוריתם דו כיווני (BiDi). 

אלגוריתם BiDi נועד לנהל באופן אוטומטי את הצגת הטקסט באמצעות מה שנקרא תווי בקרה (תווי ביטול) המאפשרים לך לציין באופן מפורש כיצד יש להתייחס לחלק מסוים של טקסט (לדוגמה ביטול מימין לשמאל, RLO, מציין להתייחס לטקסט עליו הוא חל כאל מימין לשמאל). תווי בקרה הם תווים בלתי נראים על המסך המאפשרים לך לשלוט בתצוגה של חלקי טקסט. להלן כמה מהשימושים ביותר.

בנוסף, ניתן "לקן" את תווי הבקרה, ובכך לאפשר לסדר מחדש את הצגת הטקסט בצורה מאוד מורכבת.

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

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

Boucher ואנדרסון גם הוכיחו שסוג זה של התקפה אפשרי עם שפות התכנות הנפוצות ביותר, כולל C, C ++, C #, JavaScript, Java, Rust, Go ו-Python. 

הדוגמה למטה, בקוד Python, מראה שהקוד המקודד (ולכן מבוצע במכונה) בצד שמאל שונה מקוד המקור (בצד ימין) המוצג.

בהתבסס על האחרון ניתן היה לצפות למצוא ערך השווה ל-50 בבנק ['אליס'] בסוף הביצוע, בעוד שבפועל הערך הנוכחי עדיין יהיה שווה ל-100.

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

דוידה אריו, ג'ורג'יו ג'יאצינטו ואלסנדרו רוגולו

מידע נוסף:

מקור טרויאני: פגיעויות בלתי נראות

באג 'מקור טרויאני' דרך חדשה לתקוף קידודי תוכניות (techxplore.com)

התקפת מקור טרויאני מסוכנת עבור מהדרים של שפות תוכנה (gridinsoft.com)

התקפות מקור טרויאני

GitHub - nickboucher / trojan-source: Trojan מקור: Invisible Vulnerabilities

אלגוריתם הטקסט הדו-כיווני של Unicode - מדריכים למפתחים | MDN (mozilla.org)

https://doi.org/10.1145/358198.358210

https://www.cl.cam.ac.uk/~rja14/book.html