沙箱安全机制与Native

沙箱安全机制与Native

一、沙箱安全机制

Java安全模型的核心就是Java沙箱(sandbox) ,
  什么是沙箱? 沙箱是一个限制程序运行的环境。沙箱机制就是将Java代码限定在虚拟机(JVM)特定的运行范围中,并且严格限制代码对本地系统资源访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏。
  沙箱主要限制系统资源访问,那系统资源包括什么? CPU、内存、文件系统、网络。不同级别的沙箱对这些资源访问的限制也可以不一样。
  所有的Java程序运行都可以指定沙箱,可以定制安全策略。

  • Java安全模型核心
  • 沙箱:限制程序的运行时环境
  • 域Domain概念
  • 将java代码限定在虚拟机特定的运行范围内,严格限制代码对本地系统资源的访问,这样措施保证对代码的有效隔离,防止对本地系统的破坏

组成沙箱的基本组件

  • 字节码校验器(bytecode verifier)
    :确保Java类文件遵循Java语言规范。这样可以帮助Java程序实现内存保护。但并不是所有的类文件都会经过字节码校验,比如核心类。
  • 类裝载器(class loader) :其中类装载器在3个方面对Java沙箱起作用

  • 它防止恶意代码去干涉善意的代码;

  • 它守护了被信任的类库边界;
  • 它将代码归入保护域,确定了代码可以进行哪些操作。

虚拟机为不同的类加载器载入的类提供不同的命名空间,命名空间由一系列唯一的名称组成, 每一个被装载的类将有一个名字,这个命名空间是由Java虚拟机为每一个类装载器维护的,它们互相之间甚至不可见。
  类装载器采用的机制是双亲委派模式。
  1.从最内层JVM自带类加载器开始加载,外层恶意同名类得不到加载从而无法使用;
  2.由于严格通过包来区分了访问域,外层恶意的类通过内置代码也无法获得权限访问到内层类,破 坏代码就自然无法生效。

  • 存取控制器(access controller):存取控制器可以控制核心API对操作系统的存取权限,而这个控制的策略设定,可以由用户指定。

  • 安全管理器(security manager) : 是核心API和操作系统之间的主要接口。实现权限控制,比存取控制器优先级高。

  • 安全软件包(security package) :
    java.security下的类和扩展包下的类,允许用户为自己的应用增加新的安全特性,包括:

  • 安全提供者

  • 消息摘要

  • 数字签名

  • 加密

  • 鉴别

二、Native

  • 调用底层c,c++语言库
  • native -> jni -> 本地方法接口 -> 本地方法库
  • 本地方法栈
  • 一般用的不多,硬件开发用的多
  • native :凡是带了native关键字的,说明java的作用范围达不到了,回去调用底层c语言的库!
  • 会进入本地方法栈
  • 调用本地方法本地接口 JNI (Java Native Interface)
  • JNI作用:开拓Java的使用,融合不同的编程语言为Java所用!最初: C、C++
  • Java诞生的时候C、C++横行,想要立足,必须要有调用C、C++的程序
  • 它在内存区域中专门开辟了一块标记区域: Native Method Stack,登记native方法
  • 在最终执行的时候,加载本地方法库中的方法通过JNI
  • 例如:Java程序驱动打印机,管理系统,掌握即可,在企业级应用比较少
  • private native void start0();
  • //调用其他接口:Socket. . WebService~. .http~

在这里插入图片描述
Thread类的start方法如下:

public synchronized void start() {
    
    
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
    
    
            start0();
            started = true;
        } finally {
    
    
            try {
    
    
                if (!started) {
    
    
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
    
    
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }

    private native void start0();

Thread类中竟然有一个只有声明没有实现的方法,并使用native关键字。用native表示,也此方法是系统级(底层操作系统或第三方C语言)的,而不是语言级的,java并不能对其进行操作。native方法装载在native method stack中。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43803285/article/details/115282317
今日推荐