دسته OWASP: MASVS-STORAGE: ذخیره سازی
نمای کلی
این سند چندین موضوع مربوط به گنجاندن پرونده را پوشش می دهد که تخفیف های مشابهی دارند. این مسائل مربوط به آسیبپذیریهای ناشی از دسترسی به فایلهای داخل WebViews است و از WebSettings
خطرناکی که اجازه دسترسی به فایل یا فعال کردن جاوا اسکریپت را میدهد تا روش WebKit که درخواست انتخاب فایل را ایجاد میکند، را شامل میشود. اگر به دنبال راهنمایی برای رفع مشکلات موجود در WebView ناشی از استفاده از طرح file://
، دسترسی نامحدود به فایلهای محلی، و اسکریپتهای بین سایتی هستید، این سند باید مفید باشد.
به طور دقیق تر، این سند موضوعات زیر را پوشش می دهد:
-
WebSettings
یک کلاس حاوی متدهایی است که وضعیت های تنظیمات WebViews را مدیریت می کند. این روش ها می توانند WebViews را برای حملات مختلف باز کنند که بعداً توضیح داده خواهد شد. در این سند به روشهایی که به نحوه دسترسی به فایلها مربوط میشوند و تنظیماتی که اجازه میدهد جاوا اسکریپت اجرا شود نگاه میکنیم: - روشهای
setAllowFileAccess
،setAllowFileAccessFromFileURLs
، وsetAllowUniversalAccessFromFileURLs
میتوانند برای اعطای دسترسی به فایلهای محلی، با استفاده از URL طرح فایل (file://
) استفاده شوند. با این حال، آنها می توانند توسط اسکریپت های مخرب برای دسترسی به فایل های محلی دلخواه که برنامه به آنها دسترسی دارد، مانند پوشه/data/
خودشان مورد سوء استفاده قرار گیرند. به همین دلیل، این روشها بهعنوان ناامن پرچمگذاری شدهاند و در API 30 به نفع جایگزینهای ایمنتر، مانندWebViewAssetLoader
منسوخ شدهاند. - از متد
setJavascriptEnabled
می توان برای فعال کردن اجرای جاوا اسکریپت در WebViews استفاده کرد. این باعث می شود که برنامه ها در برابر XSS مبتنی بر فایل آسیب پذیر باشند. به خصوص هنگامی که به گونه ای پیکربندی شده باشد که بارگذاری فایل های محلی یا محتوای وب نامعتبر که ممکن است حاوی کد اجرایی باشد، پیکربندی شده باشد تا امکان دسترسی به فایل هایی را که می توان توسط منابع خارجی ایجاد یا تغییر داد، یا به WebViews اجازه اجرای جاوا اسکریپت را بدهد، کاربران و داده های آنها در معرض خطر قرار می گیرند. . -
WebChromeClient.onShowFileChooser
یک روش متعلق به بستهandroid.webkit
است که ابزارهای مرور وب را فراهم می کند. از این روش می توان برای اجازه دادن به کاربران برای انتخاب فایل های داخل WebView استفاده کرد. با این حال، این ویژگی می تواند مورد سوء استفاده قرار گیرد زیرا WebViews محدودیت هایی را برای انتخاب فایل اعمال نمی کند.
تاثیر
تأثیر گنجاندن فایل می تواند به تنظیمات WebSetting در WebView بستگی داشته باشد. مجوزهای بیش از حد گسترده فایل می تواند به مهاجمان اجازه دسترسی به فایل های محلی و سرقت داده های حساس، PII (اطلاعات شناسایی شخصی) یا داده های برنامه های خصوصی را بدهد. فعال کردن اجرای جاوا اسکریپت می تواند به مهاجمان اجازه دهد جاوا اسکریپت را در WebView یا روی دستگاه کاربر اجرا کنند. فایلهایی که با استفاده از روش onShowFileChooser
انتخاب میشوند، میتوانند امنیت کاربر را به خطر بیندازند، زیرا هیچ راهی برای روش یا WebView وجود ندارد تا مطمئن شود منبع فایل قابل اعتماد است.
ریسک: دسترسی خطرناک به فایل ها از طریق file://
فعال کردن setAllowFileAccess
، setAllowFileAccessFromFileURLs
، و setAllowUniversalAccessFromFileURLs
میتواند به اهداف مخرب و درخواستهای WebView با زمینه file://
اجازه دسترسی به فایلهای محلی دلخواه، از جمله کوکیهای WebView و دادههای خصوصی برنامه را بدهد. علاوه بر این، استفاده از روش onShowFileChooser
می تواند به کاربران اجازه دهد تا فایل ها را از منابع نامعتبر انتخاب و دانلود کنند.
بسته به پیکربندی برنامه، همه این روشها میتوانند منجر به حذف PII، اعتبارنامه ورود یا سایر دادههای حساس شوند.
کاهش
اعتبار سنجی آدرس فایل ها
اگر برنامه شما نیاز به دسترسی به فایلها از طریق نشانیهای اینترنتی file://
دارد، مهم است که فقط نشانیهای اینترنتی خاصی را فهرست کنید که قانونی هستند و از اشتباهات رایج اجتناب کنید.
از WebViewAssetLoader استفاده کنید
به جای روش های ذکر شده از WebViewAssetLoader
استفاده کنید. این روش از طرح http(s)//:
به جای طرح file://
برای دسترسی به دارایی های سیستم فایل محلی استفاده می کند و در برابر حمله توصیف شده آسیب پذیر نیست.
کاتلین
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()
، setAllowFileAccessFromFileURLs()
و setAllowUniversalAccessFromFileURLs()
به طور پیش فرض در سطح API 29 و پایین تر روی TRUE
و در سطح API 30 و بالاتر FALSE
تنظیم شده است.
اگر نیاز به پیکربندی سایر WebSettings
وجود دارد، بهتر است این روشها را بهصراحت غیرفعال کنید، بهویژه برای برنامههایی که سطوح API کمتر یا مساوی 29 را هدف قرار میدهند.
ریسک: XSS مبتنی بر فایل
تنظیم متد setJavacriptEnabled
بر روی TRUE
به جاوا اسکریپت اجازه می دهد تا در یک WebView اجرا شود و در ترکیب با دسترسی به فایل که همانطور که قبلا ذکر شد فعال شده است، XSS مبتنی بر فایل از طریق اجرای کد در فایل های دلخواه یا وب سایت های مخرب باز شده در WebView امکان پذیر است.
کاهش
از بارگذاری فایل های محلی توسط WebViews جلوگیری کنید
مانند خطر قبلی، اگر setAllowFileAccess()
, setAllowFileAccessFromFileURLs()
و setAllowUniversalAccessFromFileURLs()
روی FALSE
تنظیم شده باشند، می توان از XSS مبتنی بر فایل اجتناب کرد.
از اجرای جاوا اسکریپت توسط WebViews جلوگیری کنید
روش setJavascriptEnabled
را روی FALSE
قرار دهید تا جاوا اسکریپت نتواند در WebViews اجرا شود.
اطمینان حاصل کنید که WebViews محتوای غیرقابل اعتماد را بارگیری نمی کند
گاهی اوقات فعال کردن این تنظیمات در WebViews ضروری است. در این مورد، مهم است که اطمینان حاصل شود که فقط محتوای قابل اعتماد بارگیری می شود. محدود کردن اجرای جاوا اسکریپت فقط به مواردی که شما کنترل می کنید و غیرمجاز کردن جاوا اسکریپت دلخواه یکی از راه های خوب برای اطمینان از قابل اعتماد بودن محتوا است. در غیر این صورت، جلوگیری از بارگیری ترافیک متن شفاف تضمین می کند که WebView هایی با تنظیمات خطرناک حداقل قادر به بارگیری URL های HTTP نیستند. این را می توان از طریق مانیفست انجام داد، android:usesCleartextTraffic
را روی False
قرار داد، یا با تنظیم یک Network Security Config
که ترافیک HTTP را مجاز نمیداند.
منابع
- صفحه مرجع API setAllowUniversalAccessFromFileURLs
- صفحه مرجع API setAllowFileAccessFromFileURLs
- صفحه مرجع WebViewAssetLoader API
- مستندات CodeQL
- وبلاگ دارای امنیت بیش از حد
- صفحه مرجع onShowFileChooser