uni-app安全评估报告-WebView存在潜在跨站脚本攻击风险、允许Webview访问本地任意脚本

发布于 1周前 作者 sinazl 来自 Uni-App

uni-app安全评估报告-WebView存在潜在跨站脚本攻击风险、允许Webview访问本地任意脚本

安卓安全测评反馈问题

检测目的

检测应用是否存在WebView潜在跨站脚本攻击风险

风险等级

检测依据

国家计算机网络应急技术处理协调中心旗下“国家信息安全漏洞共享平台”关联漏洞编号:CNVD-2017-36682; CNVD-2015-07628;CVE-2015-1302;CWE-79。

风险描述

WebView组件可以解析HTML和JavaScript等网页内容,这样可能会遇到一些常见的安全问题,比如跨站脚本攻击(Cross-Site-Scripting, JavaScript注入)。Android包含了大量的安全机制用来减少这种跨域的潜在问题,像通过限制WebView使用最少功能这样的措施。如果程序中的WebView不直接使用JavaScript,不要调用setJavaScriptEnabled。默认情况下,WebView不会执行跨站脚本JavaScript的执行。

检测步骤

  1. 反编译APK文件
  2. 扫描smali文件,查看应用是否调用了setJavaScriptEnabled方法,是则存在风险,否则安全。

检测结果

存在风险(发现4处)

结果描述

该应用存在WebView潜在跨站脚本攻击风险

检测详情

  1. 文件: com/sina/weibo/sdk/web/WebActivity 方法: protected onCreate(Landroid/os/Bundle;)V
  2. 文件: com/tencent/open/web/a 方法: private static b(Landroid/webkit/WebSettings;)V
  3. 文件: io/dcloud/sdk/activity/WebViewActivity 方法: private a(Landroid/webkit/WebView;)V
  4. 文件: io/dcloud/sdk/base/dcloud/d 方法: public constructor <init>(Landroid/content/Context;)V

解决方案

开发者自查: 将WebSettings.setJavaScriptEnabled设置为false。即:settings.setJavaScriptEnabled(false)


检测目的

检测应用是否允许Webview访问本地任意脚本

风险等级

检测依据

国家计算机网络应急技术处理协调中心旗下“国家信息安全漏洞共享平台”关联漏洞编号:CNVD-2017-36682; CNVD-2015-07628;CVE-2015-1302;CWE-79。

风险描述

Android使用Webview时可以使用setAllowFileAccess(boolean allow)方法禁用或允许webview加载本地文件,webview默认是允许加载本地文件的,如果没有对需要加载的脚本做校验,Webview将加载任意本地脚本,攻击者可使之加载恶意代码导致用户数据泄露等安全风险。值得注意的是setAllowFileAccess(boolean allow)方法只是禁用或允许webview对文件系统的访问,Assets和resources资源任然可以使用file:///android_asset和file:///android_res访问。

检测步骤

  1. 反编译APK文件
  2. 扫描smali文件,查找应用中调用了Webview的getSettings()的文件,在这些文件中查看是否调用了setAllowFileAccess(false)方法,是则安全,否则存在风险。

检测结果

存在风险(发现7处)

结果描述

该应用允许Webview访问本地任意脚本

检测详情

  1. 文件: com/tencent/connect/auth/a 方法: private d()V
  2. 文件: com/tencent/open/SocialApiIml 方法: public writeEncryToken(Landroid/content/Context;)V
  3. 文件: com/tencent/open/TDialog 方法: private b()V
  4. 文件: com/tencent/open/c/b 方法: protected onAttachedToWindow()V
  5. 文件: com/tencent/open/d 方法: private c()V
  6. 文件: io/dcloud/common/util/AppRuntime$1 方法: public run()V
  7. 文件: io/dcloud/h/a/d/b/i 方法: public static e(Landroid/content/Context;)Ljava/lang/String;

解决方案

开发者自查: 将WebSettings.setAllowFileAccess设置为false。即:WebSettings.setAllowFileAccess(false)

下载安全测评报告


12 回复

完整的报告和安装包都发一下。如果有调用堆栈的话,也带上。在哪个网站做的检测?网站地址也发一下。


检测是浙江安远检测做的

回复 1***@qq.com: 好的,我先看一下

回复 1***@qq.com: 这里面大部分都是sdk内部报的,加固之后应该就没问题了。加固可以使用uni安全加固

回复 DCloud_Android_zl: 哦,好的谢谢

回复 DCloud_Android_zl: 顺便问下哈,里面还有一个报密钥硬编码漏洞,这个文件的位置 com/zx/a/I8b7/p 看上去应该不是什么SDK报的,应该是项目里的对吧,这个能通过什么方式确定哪里报的吗?

回复 1***@qq.com: 这种不太好确定,目前比较好的方式是做加固,他这个检测平台也是推荐你做加固。

回复 DCloud_Android_zl: 对的是要做加固,我现在就是在担心一个问题加固后是否能保证它所列出来的所有高风险问题能不能都解决了

有没有兄弟在弄安全评估报告遇到这类问题的呀。急急急

哥,这个 “将WebSettings.setAllowFileAccess设置为false。即:WebSettings.setAllowFileAccess(false)。” uniapp怎么设置呢?

针对您提出的uni-app安全评估报告中提到的WebView存在潜在跨站脚本攻击(XSS)风险以及允许WebView访问本地任意脚本的问题,以下是一些具体的代码案例和防范措施,旨在提高应用的安全性。

1. 防止跨站脚本攻击(XSS)

问题概述: XSS攻击允许攻击者向应用程序注入恶意脚本,这些脚本能够在受害者的浏览器中执行。

防范措施

  • 输入验证与转义: 确保所有用户输入都经过严格的验证和转义,以防止恶意脚本的注入。

    function sanitizeInput(input) {
      const div = document.createElement('div');
      div.textContent = input; // 使用textContent设置内容,自动转义HTML
      return div.innerHTML;
    }
    
  • Content Security Policy (CSP): 通过HTTP头设置CSP,限制可以执行的资源来源。

    Content-Security-Policy: default-src 'self'; script-src 'self' https://trustedscripts.example.com
    

2. 限制WebView访问本地任意脚本

问题概述: 如果WebView允许访问本地任意脚本,攻击者可能利用这一漏洞执行未授权的代码。

防范措施

  • 白名单策略: 只允许加载白名单中的资源,使用file:// URL时应格外小心。

    function isAllowedUrl(url) {
      const allowedOrigins = ['https://trusted.example.com', 'file:///android_asset/safe_scripts/'];
      return allowedOrigins.some(origin => url.startsWith(origin));
    }
    
    // 在WebView加载URL前检查
    if (isAllowedUrl(urlToLoad)) {
      webview.loadUrl(urlToLoad);
    } else {
      console.error('Blocked URL:', urlToLoad);
    }
    
  • 使用WebView的内置安全机制: 对于Android,使用WebViewClientWebChromeClient来控制加载行为。

    webview.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (isAllowedUrl(url)) {
                return false; // 允许WebView加载
            } else {
                // 处理或阻止加载
                return true;
            }
        }
    });
    
  • iOS WKWebView配置: 使用WKNavigationDelegate来限制加载的URL。

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: [@escaping](/user/escaping) (WKNavigationActionPolicy) -> Void) {
        if isAllowedUrl(navigationAction.request.url?.absoluteString ?? "") {
            decisionHandler(.allow)
        } else {
            decisionHandler(.cancel)
        }
    }
    

通过以上措施,可以显著增强uni-app中WebView的安全性,降低XSS攻击风险和限制对本地脚本的未授权访问。请注意,这些代码示例需要根据您的具体项目环境进行调整和测试。

回到顶部