מסך נייד

ניצול קושחת אנדרואיד - קושחה לא חתומה ב-SoC CVE-2020-10831 של סמסונג

TL; DR  

נסביר כיצד ניצלנו את קושחת אנדרואיד באמצעות API לא מתועד של ליבה שנמצאה על ידי הנדסה לאחור של אפליקציית "הגדרות מפעל נסתרות" של סמסונג.
ממשק API זה מאפשר להבהב קושחה לא חתומה של קושחת מסך המגע של סמסונג.
ה-CVE משפיע על כל סדרות Samsung S7-S10 המשתמשות בערכת השבבים exynos.

גרסת קושחה של סמסונג

השראה  

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

סקירה כללית של SoC  

לטלפונים כיום יש הרבה יותר מסתם מעבד אחד המריץ את מערכת ההפעלה אנדרואיד, מה שהופך אותם למערכות מורכבות ביותר. 

ברוב טלפונים אנדרואיד יש 10-30 "מחשבים" שונים בתוכם, כל אחד עם מעבד, זיכרון ואחסון משלו. 

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

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

AP / מעבד יישומים - זהו המעבד הראשי שאתה מכיר ממפרט הטלפון שמתקשר ומנהל את כל שאר יחידות העיבוד ומריץ את מערכת ההפעלה אנדרואיד. 

BP / מעבד פס / רדיו / מודם - ה-BP אחראי להמרת כל הנתונים הסלולריים המתקבלים מגלי רדיו למידע שמיש בתוכנה על ידי יישום מחסנית LTE. 

GPU - יחידת עיבוד הגרפיקה אחראית לטיפול בכל המשימות הקשורות לגרפיקה

יש יותר יחידות עיבוד כמו wifi, קריפטו, מצלמה, אודיו וכו'... 

כל הרכיבים האלה ביחד נקראים "מערכת על שבב" - SoC

מציאת יעד פגיע 

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

מכאן ששימוש בהובלת מידע מהיצרן יכול להקל מאוד על המחקר. 

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

"קודם כל עבור להגדרות נסתרות על ידי כתיבת *#2663# באפליקציית הטלפון ולאחר מכן לחץ על עדכן FW".

מציאת כיצד לתקשר עם הקושחה

כאמור, השימוש בידע של היצרן יהיה הרבה יותר קל מאשר להבין הכל לבד. 

על ידי הפעלת strace על אפליקציית אנדרואיד, האחראית על עדכון הקושחה, ניתן לראות בקלות שלאחר לחיצה על כפתור העדכון האפליקציה כותבת לנתיב הבא

"/sys/class/sec/tsp/cmd"

נתיב זה הוא חלק ממנגנון sysfs של הקרנל. 

sysfs היא מערכת קבצים פסאודו המסופקת על ידי ליבת לינוקס שמייצאת מידע על מנהלי התקנים משויכים. 

כאן נוכל לראות כיצד לתקשר עם הליבה מקובץ cmd:

תקשורת cmd ליבה

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

ניצול קושחה של אנדרואיד

ככל הנראה, כאשר כותבים:

"echo -n "firmware_update:0" > /sys/class/sec/tsp/cmd"

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

כפי שמראה הערת הקוד של הליבה, מעבר 2 יגרום לליבה לעדכן את הקושחה מ-UMS (sdcard). 
עיון נוסף במקור הליבה יראה את הנתיב הנדרש:

ניצול קושחת אנדרואיד מקור ליבה

תהליך ניצול 

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

(באופן כללי עדיף לשנות רק מחרוזות קריאות אנושיות, הודעת יומן כזו, כדי לא לשבור את תהליך הפעלת התוכנית, לצערי בחרתי בדרך המטומטמת יותר)

הפקודה

הפקודה ניצול קושחת אנדרואיד

התוצאה הודפסה ביומן הקרנל (kmsg)

ניצול קושחה של אנדרואיד יומן ליבה

בחלק הזה של המחקר לא הייתי בטוח ב-100 אחוז שזה עובד, אבל אחרי שניסיתי ללחוץ על המכשיר האישי שלי וראיתי המון שגיאות IO ב-kmsg (במקום פשוט ללחוץ), הבנתי שהבזקתי בהצלחה קושחה של מסך מגע פגום. , וואלה! 

הערה מעניינת לגבי מטושטש 

כשמצאתי את ה-API של קובץ cmd המחשבה הראשונה שלי הייתה "בואו לערבב אותו ולמצוא כמה הצפות!"

ניצול קושחת אנדרואיד בקלט ארוך מדי

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

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

עבור לתוכן