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

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

סקירה כללית

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

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

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

השפעה

ניתן לנצל נקודות חולשה של סקריפטים חוצי-אפליקציות כשהם נשלטים על ידי תוקף תוכן 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 הזה רשימת משימות לאבטחה עבור רכיבי WebView לקבלת עצות ודוגמאות טובות.

הגדרת הגדרות גישה מאובטחות לקבצים ב-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" />

משאבים