סקריפטים חוצי-אפליקציות

קטגוריה של OWASP: MASVS-CODE: איכות הקוד

סקירה כללית

‫WebView הוא רכיב דפדפן מוטמע באפליקציות ל-Android, שמקל על הצגת תוכן מהאינטרנט בתוך אפליקציה. הוא מעבד HTML, ‏ CSS ו-JavaScript בממשק המשתמש של האפליקציה.

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

אם אפליקציה מקבלת JavaScript זדוני ל-WebView בלי לבצע אימות או ניקוי מספיקים, האפליקציה חשופה לפרצת אבטחה חוצת אפליקציות (Cross-App Scripting).

השפעה

אפשר לנצל פרצות אבטחה חוצות אפליקציות (Cross-App Scripting) כשתוכן JavaScript שנשלט על ידי תוקף מועבר ל-WebView של האפליקציה הפגיעה בלי לעבור אימות או ניקוי. כתוצאה מכך, קוד ה-JavaScript שסופק על ידי התוקף מופעל בהקשר של WebView של אפליקציית הקורבן. קוד JavaScript זדוני יכול להשתמש באותן הרשאות כמו של האפליקציה שהותקפה, מה שעלול להוביל לגניבה של נתוני משתמש רגישים ולפריצה לחשבון.

אמצעי צמצום סיכונים

השבתה של JavaScript

אם האפליקציה שלכם לא דורשת JavaScript, השבתה שלו תבטיח שהוא לא יהפוך לאיום:

Kotlin

// Get the WebView Object
val webView = findViewById<WebView>(R.id.webView)
val webSettings = webView.settings

// Disable JavaScript
webSettings.javaScriptEnabled = false

Java

// Get the WebView Object
WebView webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();

// Disable JavaScript for the WebView
webSettings.setJavaScriptEnabled(false);

אם האפליקציה שלכם דורשת JavaScript, צריך לוודא שאתם הבעלים של כל JavaScript שמועבר ל-WebView או שיש לכם שליטה בו. מומלץ להימנע ממתן הרשאה ל-WebView להריץ JavaScript שרירותי. ההנחיות מפורטות בקטע הבא.

מוודאים שרק התוכן הצפוי נטען ב-WebView

כשמשתמשים בשיטות כמו shouldOverrideUrlLoading(), ‏ loadUrl() או evaluateJavascript(),, חשוב לוודא שכל כתובות ה-URL שמועברות אליהן נבדקות. כמו שצוין קודם, כל JavaScript שמועבר ל-WebView צריך להגיע רק מדומיינים צפויים, ולכן חשוב לוודא מה נטען.

כדאי לעיין במסמכי אימות הקלט של OWASP וברשימת הבדיקה הזו בנושא אבטחת Android ל-WebViews כדי לקבל עצות טובות ודוגמאות.

הגדרת הגדרות גישה מאובטחת לקבצים ב-WebView

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

  • השבתת הגישה לקבצים. כברירת מחדל, הערך של setAllowFileAccess מוגדר כ-True ברמת API 29 ומטה, כך שמתאפשרת גישה לקבצים מקומיים. ברמת API‏ 30 ומעלה, ברירת המחדל היא False. כדי לוודא שאין הרשאת גישה לקובץ, צריך להגדיר במפורש את setAllowFileAccess ל-False
  • השבתת הגישה לתוכן. הגדרת ברירת המחדל של setAllowContentAccess היא True. גישה לכתובת URL של תוכן מאפשרת ל-WebView לטעון תוכן מספק תוכן שמותקן במערכת. אם האפליקציה לא דורשת גישה לתוכן, צריך להגדיר את setAllowContentAccess כ-False כדי למנוע שימוש לרעה במקרה של מתקפת סקריפטים בין אפליקציות.

  • kotlin kotlin webView.settings.javaScriptEnabled = false webView.settings.domStorageEnabled = true webView.settings.allowFileAccess = false webView.settings.allowContentAccess = false

  • java java webView.getSettings().setJavaScriptEnabled(false); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setAllowFileAccess(false); webView.getSettings().setAllowContentAccess(false);

הפעל גלישה בטוחה

מפעילים את הגלישה הבטוחה ב-AndroidManifest.xml כדי לסרוק כתובות URL שמועברות אל WebView לאיתור פישינג או דומיינים זדוניים.:

<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
   android:value="true" />

משאבים