【Android】跨端(JSBridge)安全小计

这篇具有很好参考价值的文章主要介绍了【Android】跨端(JSBridge)安全小计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

移动端漏洞有个比较大的攻击面是:Webview容器安全。

而Webview容器中一个比较重要的攻击面就是:跨端方法,通过Js可以直接调用客户端Native代码。

本文详细介绍android前端到客户端跨端通信的基础知识以及相关漏洞挖掘思路。

基础知识

当我们要了解跨端(这里指前端和客户端跨端)的时候,通常需要掌握一些基础知识,如下:

1、跨端

在移动端前端和客户端的跨端开发,通常是指使用一种技术或框架,同时在移动应用的前端和客户端开发中进行应用。这种跨端技术通常使用 Web 技术(如 HTML、CSS 和 JavaScript)来开发应用程序,然后通过 WebView 或类似的技术来集成到原生应用中。

在这种跨端开发中,前端开发者可以使用熟悉的 Web 技术来开发应用程序,而不需要学习和使用原生开发语言和工具。同时,客户端开发者可以使用原生开发语言和工具来集成前端开发的应用程序。

2、原理介绍

步骤一:

Native代码封装JSBridge对象:定义接口方法,代表这些Navtive方法可以被JS调用。

步骤二:

通过Webview容器提供的接口方法:evaluateJavascript,将步骤一封装的JSBridge方法注入到Webview容器中。

步骤三:

当步骤二的Webview容器加载时,进程中就包含了JSBridge对象(object),通过JavaScript就可以直接调用jsb对象中的接口方法,实现跨端方法调用。

3.、常见的移动端前端和客户端的跨端技术

1. React Native:React Native 可以使用 Web 技术来开发应用程序,并通过 JavaScript Bridge 技术来与原生应用进行交互,从而实现跨端开发。

2. Flutter:Flutter 可以使用 Web 技术来开发应用程序,并通过 Flutter Engine 技术来与原生应用进行交互,从而实现跨端开发。

3. WebView:WebView 是一种原生控件,可以在原生应用中嵌入 Web 应用程序。前端开发者可以使用 Web 技术来开发应用程序,然后通过 WebView 技术来集成到原生应用中。

4. Hybrid:Hybrid 是一种结合了原生和 Web 技术的跨端开发模式,可以使用 Web 技术来开发应用程序,并使用原生技术来实现底层功能。

3.1 React Native - ReactContextBaseJavaModule

攻击者视角,我更关心前端如何调用客户端。

在 React Native 中,Native Modules 用于将原生功能封装成 JavaScript 可以调用的函数或方法。

在原生代码中,创建一个 Native Module,通过该模块可以调用客户端代码。例如,在 Android 平台上可以创建一个 Java 类,实现 ReactContextBaseJavaModule 接口,并在该类中定义一个可以被 JavaScript 调用的函数。示例代码如下

public class MyNativeModule extends ReactContextBaseJavaModule {
    private Context mContext;

    public MyNativeModule(ReactApplicationContext reactContext) {
        super(reactContext);
        mContext = reactContext;
    }

    @Override
    public String getName() {
        return "MyNativeModule";
    }

    @ReactMethod
    public void showSessionID() {
        Toast.makeText(mContext, getCookie(), Toast.LENGTH_SHORT).show();
    }
}

3.2 React Native - ReactApplication

继承ReactApplication并重写getPackages函数就可以将我们3.1新建的module注册进来。

import com.example.MyNativeModule;

...

public class MainApplication extends Application implements ReactApplication {
    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
        @Override
        public boolean getUseDeveloperSupport() {
            return BuildConfig.DEBUG;
        }

        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.asList(
                new MainReactPackage(),
                new MyNativeModule()
            );
        }
    };
}

3.3 React Native - 前端调用

前端就能直接通过事件触发nativemodule的showSessionID方法了。

import React from 'react';
import { TouchableOpacity, Text, NativeModules } from 'react-native';

const MyButton = () => {
  const onPress = () => {
    NativeModules.MyNativeModule.showSessionID();
  };

  return (
    <TouchableOpacity onPress={onPress}>
      <Text>Click me</Text>
    </TouchableOpacity>
  );
};

export default MyButton;

所以如果存在远程动态加载一些前端代码,或者存储类或者其他安全问题能够控制前端代码,那我们就能进一步调用注册进来的客户端代码,例如上述的sessionid。

4.1 webview -     @JavascriptInterface

新建一个javascript接口

class MyNativeInterface {
    @JavascriptInterface
    public void showCookie() {
        Toast.makeText(mContext, getcookie(), Toast.LENGTH_SHORT).show();
    }
}

4.2 webview -     addJavascriptInterface

把接口注册进webview容器

import android.webkit.WebView;
import android.webkit.WebViewClient;

...

public class MainActivity extends AppCompatActivity {
    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWebView = findViewById(R.id.webView);
        mWebView.setWebViewClient(new MyWebViewClient());
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.addJavascriptInterface(new MyNativeInterface(), "MyNativeInterface");
    }
}

4.3 webview - 前端调用

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>WebView Example</title>
</head>
<body>
  <button onclick="window.MyNativeInterface.showcookie()">Click me</button>
</body>
</html>

webview的攻击比较丝滑,因为只要打开一个webview容器就可以有机会攻击注册进来的跨端接口。扫一扫、Deeplink、IM、搜索等等。

5. Hybrid

Hybrid 应用程序比普通的 WebView 应用程序更加复杂,需要在客户端代码中实现一些原生功能,例如调用系统 API、访问本地数据库等,一种开发模式,它结合了 Web 技术和原生技术,用于开发跨平台应用程序。但是实现原理就是webview。所以参考4.1~4.3即可。

6. Flutter

实现原理和React Native类似,继承MethodCallHandler定义channel并写入跨端方法->setMethodCallHandler注册channel到Flutter->前端调用跨端方法。

public class MyChannel implements MethodCallHandler {
    private static final String CHANNEL_NAME = "com.example.my_channel";

    private Context mContext;

    private MyChannel(Context context) {
        mContext = context;
    }

    public static void registerWith(Registrar registrar) {
        final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL_NAME);
        channel.setMethodCallHandler(new MyChannel(registrar.context()));
    }

    @Override
    public void onMethodCall(MethodCall call, MethodChannel.Result result) {
        if (call.method.equals("showToast")) {
            String message = call.argument("message");
            Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
            result.success(true);
        } else {
            result.notImplemented();
        }
    }
}


--------

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugin.common.MethodChannel;

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL_NAME = "com.example.my_channel";

    @Override
    public void configureFlutterEngine(FlutterEngine flutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL_NAME)
                .setMethodCallHandler(new MyChannel(this));
    }
}


-----------
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  static const platform = const MethodChannel('com.example.my_channel');

  void _showToast() async {
    try {
      await platform.invokeMethod('showToast', {'message': 'Hello, world!'});
    } on PlatformException catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Demo'),
        ),
        body: Center(
          child: RaisedButton(
            child: Text('Click me'),
            onPressed: _showToast,
          ),
        ),
      ),
    );
  }
}

如何挖掘?实战演练

步骤(一):

逆向APK -> 得到Android源代码 -> 全局搜索@JavascriptInterface -> 搜索webview容器的JSBridge对象,以及实现的接口方法。

步骤(二):

找到具体外部可控的业务场景触发注入了JSB的Webview容器:常见的场景有

扫一扫、IM、Deeplink、文章、签名等。

步骤(三):

研读步骤一得到的JSBridge对象,以及实现的接口方法,依据参数以及参数类型和条件判断,在前端通过JavaScript进行调用。

如下模拟调用举例:

<script>window.xxxx.yyyy(aaa,bbb);

【Android】跨端(JSBridge)安全小计,Android_JAVA层_安全,android,跨端,jsbridge,webview,漏洞,逆向

后话

不同的应用厂商在跨端上面可能都会选择不同的解决方案,或者自己开发一些跨端框架,这时候可能需要逆向看代码逻辑才能往下走。另外跨端的调用往往也不是一帆风顺,开发者会增加各种限制,例如权限限制,访问域名限制等等,这个也需要进一步的绕过思路,这个还要慢慢发散思路和学习。 文章来源地址https://www.toymoban.com/news/detail-836665.html

到了这里,关于【Android】跨端(JSBridge)安全小计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android安全】https安全:HostnameVerifier

    HostnameVerifier接口用于验证 当前已建立的连接的hostname(参数一)和连接的SSLSession(参数二)的证书是否匹配。 其目的是防止中间人攻击。 HostnameVerifier接口定义如下: 仅一个方法,参数paramString为当前connection的hostname;参数paramSSLSession是当前connection的SSLSession,可以从中获取

    2024年02月15日
    浏览(35)
  • Android安全启动学习(五):Android Verified Boot 2.0

    AVB2.0被用于启动引导,此用法添加一个“vbmeta.img”镜像。 public key被编译到bootloader中 用于 校验vbmeta数据 ,vbmeta.img包含应 由此public key验证的签名。 vbmeta.img包含用于验证的public key,但只有bootloader验证过vbmeta.img才会可信,就好比认证一样,包含可信public key和签名。 因此,

    2023年04月23日
    浏览(25)
  • 保护您的Android应用程序:Android应用程序安全一览

    我们都知道Android是为所有人设计的——开放、面向开发者、面向用户,这种开放性为今天和明天的移动技术提供了很多便利。然而,开放性也带来了需要妥善处理的安全风险。 安全是我们所有人都关注的重要问题。无论是我们的个人数据、电子邮件、电话号码、凭证、服务

    2024年02月03日
    浏览(52)
  • android安全启动验证链

    前言android 系统安全内容总结 启动验证链核心技术就是签名验签,这里复习下,流程如上图: android基础算法使用的是RSA 红色部分是编译时对需要验签的镜像与文件进行签名操作;需要用到私钥,这个私钥一般放在编译代码或者签名服务器。 黄色部分是开机启动时对启动镜像

    2024年02月05日
    浏览(40)
  • Android系统安全权限

    ndroid将安全设计贯穿系统架构的各个层面,覆盖系统内核、虚拟机、应用程序框架层以及应用层各个环节,力求在开放的同时,也最大程度地保护用户的数据、应用程序和设备的安全。Android安全模型主要提供以下几种安全机制: 从技术架构角度来看,Android安全模型基于Lin

    2024年03月22日
    浏览(34)
  • Android系统安全

            Android是一种基于Linux的、自由的、开源的操作系统。它主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟开发。Android系统架构可以分为4层结构,由上至下分别是应用程序层、应用程序框架层、系统运行库层以及内核层。         Andr

    2024年04月17日
    浏览(19)
  • Android系统安全概述

           Android 采用了业界领先的安全功能,并与开发者和设备实现人员密切合作,以确保 Android 平台和生态系统的安全。要打造一个由基于 Android 平台以及围绕 Android 平台开发且由云服务提供支持的应用和设备组成的强大生态系统,稳定可靠的安全模型至关重要。为此,在整

    2024年04月09日
    浏览(33)
  • Android通信安全之HTTPS

    目录 Android通信安全之HTTPS Https 起因 问题描述 自定义X509TrustManager 自定义HostnameVerifier 修复方案 解决方案一 解决方案2       本文章向大家介绍Android通信安全之HTTPS,主要内容包括Https、起因、问题描述、自定义HostnameVerifier、修复方案、解决方案2、基本概念、基础应用、原理

    2024年02月05日
    浏览(24)
  • Android系统安全权限相关内容

    Android手机把权限从低到高分成三大类: 1、第三方应用权限(App可以在用户授权下访问某些具体的操作) 2、Android手机用户普通权限(手机使用者可以操作Android系统的日常应用) 3、Android手机的Root权限(超级用户权限,可以控制Android系统的运转) 1. 更新操作系统和应用程序

    2024年03月23日
    浏览(29)
  • Android手机底部安全区域问题

    这个问题主要体在全面屏手机上,统称为安全区域 直接上图(不知道怎么调正,😓) 这个问题刚开始困扰了我好久, 但是去看抖音发现它底部也是有安全区域的,才知道在Android上是无法完全消除的 (第二种的方法是可以消除掉的,但是会影响用户体验) 而抖音也该也是采用

    2024年02月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包