java安全相关知识
基本概念
JVM:java虚拟机,Java编译程序将生成Java虚拟机上可运行的目标代码,使得Java程序可以再不同平台不加修改的运行。JVM包含完善的硬件架构,主要分为五大模块—类装载器子系统、运行时数据全、执行引擎、本地方法接口和垃圾收集模块。其没有寄存器,指令集使用Java栈来存储中间数据。
JRE:Java运行环境,包含JVM标准实现与Java核心类库,安装后能正确运行Java应用程序
JDK:Java开发人员使用的SDK(软件开发工具包),主要用于移动设备、嵌入式设备的Java应用等开发,一般JDK会含有JRE以及常用的Java相关工具
JVM逃逸
- JDK 以及 JRE 几经变迁,目前的主流版本是由 Oracle 公司提供的。除了官方提供的之外,还有开源的 OpenJDK 项目,以及 Apple、IBM 等公司基于官方 JRE 开发的一些 JRE 程序。国内外的研究方向更偏向于 JVM 逃逸手段也就是 JRE 漏洞的利用技术,触发本地JRE 漏洞,发起了逃逸出本地 JVM 而针对操作系统的攻击,被称为JVM 逃逸。
Java 安全机制
- 以 Oracle JRE 为例,Java API 分为Java 层和原生层(native层),其中Java 层由 Java 语言本身编写,原生层主要由 C 语言编写,是一些与操作系统接合较为紧密的底层 API 封装,在 Windows 系统中编译为动态链接库(“*.dll”文件),作为 JRE 的重要组成部分而存在。而Java 层中存在着可以自定义安全规则的沙箱(Sandbox)。针对 Java 层 API 与原生层 API,JRE 安全机制分别包括 JRE 沙箱与 JVM 类型安全机制。
在 JRE 中的 JRE 沙箱(JRE Sandbox),是由众多安全组件组成的系统,负责限制类似 Applet 这样来自互联网的不可信 Java 程序在执行中的权限。
一个 class 文件,从被加载到 JVM 中开始直到卸载,其生命周期要经过七个阶段:加载、验证、准备、解析、初始化、使用、卸载。class 文件的加载和校验环节是比较重要的。一般来说,只要顺利通过了这两个环节,一个 class 直到它运行之前都不会有安全检查了。任何一个类一旦由Bootstrap Classloader 加载,那么它将拥有 Java API 级别的权限,完全被 Java 虚拟机所信任。那么 JRE 沙箱的安全管理系统将被彻底关闭。
SecurityManager 对象一般为 null,也就是说允许一切“不安全”操作。但在不信任的状态下,如在 Applet 中,这个 SecurityManager 对象被默认设置为 Java 原生类中的sun.applet.AppletSecurity 类的对象实例,将限制其在沙箱中操作。实现 JVM 逃逸的最终目标是将安全管理器设置为 null。
在 Java 6 与 Java 7 当中,权限检查的工作交给了 AccessController 类,每当触发权限检查时,AccessController 会对方法调用栈上的所有方法进行检查。而AccessController 类中提供了用于提升权限的doPrivileged()方法,作为调用栈检查的终止点,可以通过此函数实现权限提升代码块。
Java 反射机制(Reflection)是 Java 程序开发语言的重要特性,它为 Java 提供了在运行过程中动态获取及调用一个类及其方法和变量的功能,从编程的表现形式来讲,可以理解为通过间接的方式去调用一些 API。有一些相对“不安全”的 API,通过传统的直接调用的方式是调不了的,而通过反射机制就可以调用到它们。
checkPackageAccess 方法,其功能是检查当前类是否具有访问、调用某些包的权限。
禁止非结构化地访问内存是 JVM 中防止对内存恶意破坏的一种安全策略。
java安全相关知识的更多相关文章
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- java基础知识小总结【转】
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- Java基础知识系列——String
最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...
- 学习Spring必学的Java基础知识
[1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http: ...
- 学习android学习必备的java基础知识--四大内部类
学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...
- JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
- java基础知识梳理
java基础知识梳理 1 基本数据类型
- java基础知识回顾之---java String final类普通方法
辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /* * 按照面向对象的思想对字符串进行功能分类. * ...
- java基础理论知识的一些总结
在学习Java初期,由于我们是刚开始接触Java,我们不仅需要牢牢掌握Java的基础理论知识,来为我们后面对Java更深层次的学习打好基础,而且我们需要养成编程人的思想习惯.来我们一起来探索Java基 ...
随机推荐
- [Matplotlib] Data Representation
Jupyter Notebook Goto: https://plot.ly/python/#3d-charts[丰富的作图资源] Data Visualization¶ In [1]: from ...
- 转 perl DBI 总结
https://www.cnblogs.com/homezzm/archive/2011/07/22/2113618.html ##查看已经安装的包 #!/usr/bin/perluse strict ...
- 【翻译】Flink Table Api & SQL —— 概念与通用API
本文翻译自官网:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/common.html Flink Tabl ...
- c++11 为什么使用ref,和引用的区别
std::ref只是尝试模拟引用传递,并不能真正变成引用,在非模板情况下,std::ref根本没法实现引用传递,只有模板自动推导类型时,ref能用包装类型reference_wrapper来代替原本会 ...
- linux广播
linux广播 // 发送端 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #incl ...
- 在使用redis做缓存后,mybatis的延迟加载失效
原来使用的是EHcache,mybatis延迟加载没有问题,改成redis后,延迟加载获得数据时就会发生错误. 报:Cannot get Configuration as configuration ...
- [LeetCode] 304. Range Sum Query 2D - Immutable 二维区域和检索 - 不可变
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...
- k8s Pod 扩容和缩容
在生产环境下,在面临服务需要扩容的场景时,可以使用Deployment/RC的Scale机制来实现.Kubernetes支持对Pod的手动扩容和自动扩容. 手动扩容缩容 通过执行扩容命令,对某个dep ...
- 使用transform后z-index失效的解决方法
transform作用的元素增加translateZ,父级元素增加 transform-style: preserve-3d; <div class="father"> ...
- 使用Delphi开发linux应用
对于很多喜欢使用delphi做开发的人都希望delphi能够支持linux平台的开发,终于在delphi10.2版本中,delphi开始支持linux平台的开发了.在这里写一下Linux开发环境的配置 ...