وب‌نماها – گنجاندن فایل ناامن

دسته OWASP: MASVS-STORAGE: Storage

نمای کلی

این سند چندین مشکل مربوط به گنجاندن فایل را پوشش می‌دهد که اقدامات کاهشی مشابهی دارند. این مشکلات بر آسیب‌پذیری‌های ناشی از دسترسی به فایل‌ها در «وب‌نماها» تمرکز دارند و از WebSettings خطرناکی که اجازه دسترسی به فایل را می‌دهد یا جاوااسکریپت را فعال می‌کند تا روش WebKit که درخواست انتخاب فایل ایجاد می‌کند را شامل می‌شوند. اگر به‌دنبال راهنمایی درباره اصلاح مشکلات درون «وب‌نما» هستید که به‌دلیل استفاده از طرح file://، دسترسی نامحدود به فایل‌های محلی، و دستورگان‌نویسی بین‌سایتی به‌وجود آمده‌اند، این سند می‌تواند برایتان مفید باشد.

به‌طور دقیق‌تر، این سند موضوعات زیر را پوشش می‌دهد:

  • ‫WebSettings کلاسی است که شامل روش‌هایی برای مدیریت وضعیت‌های تنظیمات برای WebViews است. این روش‌ها می‌توانند WebView را درمعرض حملات مختلفی قرار دهند که در ادامه توضیح داده می‌شود. در این سند، روش‌های مربوط به نحوه دسترسی به فایل‌ها و تنظیماتی را که به جاوا اسکریپت اجازه اجرا می‌دهد بررسی خواهیم کرد:
  • از روش‌های setAllowFileAccess، setAllowFileAccessFromFileURLs، و setAllowUniversalAccessFromFileURLs می‌توان برای اعطای دسترسی به فایل‌های محلی بااستفاده از نشانی وب طرح فایل (file://) استفاده کرد. بااین‌حال، اسکریپت‌های مخرب می‌توانند از آن‌ها برای دسترسی به فایل‌های محلی دلخواه که برنامه به آن‌ها دسترسی دارد (مثل پوشه /data/ خودشان) سوءاستفاده کنند. به همین دلیل، این روش‌ها به‌عنوان ناامن پرچم‌گذاری شده‌اند و در API 30 به‌نفع جایگزین‌های ایمن‌تر، مانند WebViewAssetLoader، منسوخ شده‌اند.
  • از روش setJavascriptEnabled می‌توان برای فعال کردن اجرای جاوا اسکریپت در «وب‌نماها» استفاده کرد. این امر باعث می‌شود برنامه‌ها دربرابر XSS مبتنی بر فایل آسیب‌پذیر شوند. به‌ویژه وقتی پیکربندی به‌گونه‌ای باشد که بار کردن فایل‌های محلی یا محتوای وب غیرقابل‌اعتماد که ممکن است حاوی کد اجرایی باشد مجاز باشد، پیکربندی به‌گونه‌ای باشد که دسترسی به فایل‌هایی که منابع خارجی می‌توانند ایجاد یا تغییر دهند مجاز باشد، یا به «وب‌نماها» اجازه داده شود جاوااسکریپت اجرا کنند، کاربران و داده‌هایشان درمعرض خطر قرار می‌گیرند.
  • WebChromeClient.onShowFileChooser روشی است که به بسته android.webkit تعلق دارد و ابزارهای مرور وب را ارائه می‌دهد. از این روش می‌توان برای اجازه دادن به کاربران برای انتخاب فایل‌ها در WebView استفاده کرد. اما از این ویژگی می‌توان سوءاستفاده کرد زیرا WebView محدودیتی برای انتخاب فایل اعمال نمی‌کند.

تأثیر

تأثیر گنجاندن فایل می‌تواند به این بستگی داشته باشد که کدام WebSettings در WebView پیکربندی شده است. اجازه‌های فایل بسیار گسترده می‌تواند به مهاجمان اجازه دهد به فایل‌های محلی دسترسی پیدا کنند و داده‌های حساس، «اطلاعات شناساننده شخصی» (PII)، یا داده‌های خصوصی برنامه را سرقت کنند. فعال کردن اجرای جاوا اسکریپت می‌تواند به مهاجمان اجازه دهد جاوا اسکریپت را در وب‌نما یا در دستگاه کاربر اجرا کنند. فایل‌های انتخاب‌شده بااستفاده از روش onShowFileChooser می‌تواند امنیت کاربر را به‌خطر بیندازد زیرا هیچ راهی برای این روش یا WebView وجود ندارد تا مطمئن شود منبع فایل قابل‌اعتماد است.

خطر: دسترسی پرخطر به فایل‌ها ازطریق file://‎

فعال کردن setAllowFileAccess، setAllowFileAccessFromFileURLs، و setAllowUniversalAccessFromFileURLs می‌تواند به اهداف مخرب و درخواست‌های WebView با بافت file:// اجازه دهد به فایل‌های محلی دلخواه، ازجمله کوکی‌های WebView و داده‌های خصوصی برنامه، دسترسی پیدا کنند. علاوه‌براین، استفاده از روش onShowFileChooser می‌تواند به کاربران اجازه دهد فایل‌ها را از منابع غیرقابل‌اعتماد انتخاب و بارگیری کنند.

همه این روش‌ها می‌توانند منجر به استخراج اطلاعات شناساننده شخصی، اعتبارنامه ورود به سیستم، یا دیگر داده‌های حساس شوند، که این امر به پیکربندی برنامه بستگی دارد.

کاهش

اعتبارسنجی نشانی‌های وب فایل

اگر برنامه‌تان نیاز دارد ازطریق نشانی‌های وب file:// به فایل‌ها دسترسی داشته باشد، مهم است که فقط نشانی‌های وب خاصی را که می‌دانید قانونی هستند در فهرست مجاز قرار دهید و از اشتباهات رایج اجتناب کنید.

استفاده از WebViewAssetLoader

به‌جای روش‌های ذکرشده، از WebViewAssetLoader استفاده کنید. این روش به‌جای طرح file:// از طرح http(s)//: برای دسترسی به دارایی‌های سیستم فایل محلی استفاده می‌کند و دربرابر حمله شرح‌داده‌شده آسیب‌پذیر نیست.

کاتلین

val assetLoader: WebViewAssetLoader = Builder()
  .addPathHandler("/assets/", AssetsPathHandler(this))
  .build()

webView.setWebViewClient(object : WebViewClientCompat() {
  @RequiresApi(21)
  override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest): WebResourceResponse {
    return assetLoader.shouldInterceptRequest(request.url)
  }

  @Suppress("deprecation") // for API < 21
  override fun shouldInterceptRequest(view: WebView?, url: String?): WebResourceResponse {
    return assetLoader.shouldInterceptRequest(Uri.parse(url))
  }
})

val webViewSettings: WebSettings = webView.getSettings()
// Setting this off for security. Off by default for SDK versions >= 16.
webViewSettings.allowFileAccessFromFileURLs = false
// Off by default, deprecated for SDK versions >= 30.
webViewSettings.allowUniversalAccessFromFileURLs = false
// Keeping these off is less critical but still a good idea, especially if your app is not
// using file:// or content:// URLs.
webViewSettings.allowFileAccess = false
webViewSettings.allowContentAccess = false

// Assets are hosted under http(s)://appassets.androidplatform.net/assets/... .
// If the application's assets are in the "main/assets" folder this will read the file
// from "main/assets/www/index.html" and load it as if it were hosted on:
// https://appassets.androidplatform.net/assets/www/index.html
webView.loadUrl("https://appassets.androidplatform.net/assets/www/index.html")

جاوا

final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
         .addPathHandler("/assets/", new AssetsPathHandler(this))
         .build();

webView.setWebViewClient(new WebViewClientCompat() {
    @Override
    @RequiresApi(21)
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        return assetLoader.shouldInterceptRequest(request.getUrl());
    }

    @Override
    @SuppressWarnings("deprecation") // for API < 21
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        return assetLoader.shouldInterceptRequest(Uri.parse(url));
    }
});

WebSettings webViewSettings = webView.getSettings();
// Setting this off for security. Off by default for SDK versions >= 16.
webViewSettings.setAllowFileAccessFromFileURLs(false);
// Off by default, deprecated for SDK versions >= 30.
webViewSettings.setAllowUniversalAccessFromFileURLs(false);
// Keeping these off is less critical but still a good idea, especially if your app is not
// using file:// or content:// URLs.
webViewSettings.setAllowFileAccess(false);
webViewSettings.setAllowContentAccess(false);

// Assets are hosted under http(s)://appassets.androidplatform.net/assets/... .
// If the application's assets are in the "main/assets" folder this will read the file
// from "main/assets/www/index.html" and load it as if it were hosted on:
// https://appassets.androidplatform.net/assets/www/index.html
webview.loadUrl("https://appassets.androidplatform.net/assets/www/index.html");

غیرفعال کردن روش‌های خطرناک WebSettings

مقدار روش setAllowFileAccess() به‌طور پیش‌فرض روی TRUE در سطح میانای برنامه‌سازی کاربردی ۲۹ و پایین‌تر، و FALSE در سطح میانای برنامه‌سازی کاربردی ۳۰ و بالاتر تنظیم شده است. روش‌های setAllowFileAccessFromFileURLs() و setAllowUniversalAccessFromFileURLs() به‌طور پیش‌فرض روی FALSE در سطح میانای برنامه‌سازی کاربردی ۱۶ و بالاتر تنظیم شده‌اند. (این پیش‌فرض‌ها در سطح API‏ ۱۶ تغییر کردند تا با محدود کردن دسترسی هم‌مبدأ برای فایل‌های محلی، امنیت سخت‌گیرانه‌تری اعمال شود و از برنامه‌ها دربرابر تزریق اسکریپت ازطریق وب‌گاه (XSS) و دسترسی غیرمجاز به فایل محافظت شود.)

اگر نیاز به پیکربندی WebSettings دیگری وجود دارد، بهتر است این روش‌ها را به‌صراحت غیرفعال کنید، به‌ویژه برای برنامه‌هایی که سطح میانای برنامه‌سازی کاربردی کمتر یا مساوی ۲۹ را هدف قرار می‌دهند.


خطر: XSS مبتنی بر فایل

تنظیم کردن روش setJavacriptEnabled روی TRUE به جاوااسکریپت اجازه می‌دهد در «وب‌نما» اجرا شود و در ترکیب با دسترسی به فایل که همان‌طور که قبلاً توضیح داده شد فعال شده است، «تزریق اسکریپت ازطریق وب‌گاه» مبتنی بر فایل ازطریق اجرای کد در فایل‌های دلخواه یا وب‌سایت‌های مخرب بازشده در «وب‌نما» امکان‌پذیر می‌شود.

کاهش

جلوگیری کردن از بار کردن فایل‌های محلی توسط «وب‌نماها»

همانند خطر قبلی، اگر setAllowFileAccess()، setAllowFileAccessFromFileURLs()، و setAllowUniversalAccessFromFileURLs() روی FALSE تنظیم شده باشند، می‌توان از XSS مبتنی بر فایل اجتناب کرد.

جلوگیری از اجرای جاوااسکریپت توسط «وب‌نماها»

روش setJavascriptEnabled را روی FALSE تنظیم کنید تا جاوا اسکریپت نتواند در «وب‌نماها» اجرا شود.

مطمئن شوید «وب‌نماها» محتوای نامطمئن بار نکنند

گاهی اوقات فعال کردن این تنظیمات در «وب‌نماها» ضروری است. در این مورد، مهم است که مطمئن شوید فقط محتوای قابل‌اعتماد بار می‌شود. محدود کردن اجرای جاوا اسکریپت به فقط آنچه تحت کنترل شما است و مجاز نکردن جاوا اسکریپت دلخواه، روش خوبی برای اطمینان از قابل‌اعتماد بودن محتوا است. درغیراین‌صورت، جلوگیری از بار شدن ترافیک با متن آشکار تضمین می‌کند که «وب‌نماهای» حاوی تنظیمات خطرناک حداقل نتوانند نشانی‌های وب HTTP را بار کنند. این کار را می‌توان یا ازطریق مانیفست، با تنظیم android:usesCleartextTraffic روی False، یا با تنظیم Network Security Config که ترافیک HTTP را غیرمجاز می‌کند انجام داد.


منابع