Just a little smile ^ ^

yoyo_zeng

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  112 随笔 :: 3 文章 :: 0 评论 :: 10万 阅读

沙箱

java提供了一个用户可配置的沙箱,在沙箱中可以放置不可靠的程序,沙箱对不可靠程序的活动进行了限制

 

组成沙箱的基本组件

-类装载器结构

不同类装载器装入的类提供不同的命名空间,命名空间的每一个命名都被关联到方法区中的一个类型数据

类装载器连接在一个 双亲-孩子 的关系链中,正在类装载器装载类之前会委派双亲装载类型

在允许两个类型之间对包内可见的成员进行访问前,虚拟机不但要确定这两个类型属于同一个包,还必须确定它们属于同一个运行包,它们必须是由同一个类装载器装载的

启动类装载器装载核心JAVA API的class文件,这些class是可信的

 

-class文件检验器

保证装载的class文件内容有正确的内部结构,确定跳转指令的合法性

第一步在类装载时进行少苗,检查class的内部结构,保证可以被正确编译

第二步类型数据的语义检查,检查器查看每个组成部分,确认是否是所属类型的实例,结构是否正确

第三步字节码验证,确保采用任何路径在字节码流中都得到一个确定的操作码,确保操作数栈总是包含正确的数值以及正确地类型

第四步符号引用的验证,虚拟机将追踪那些引用,从被验证的class文件到被引用的文件,以确保这个引用是正确的,在编译时期会做验证,但是如果a引用b,当b改变时,只会对b从新编译,当使用新版本的b和老版本的a,则会不兼容,所以第四趟扫描是必须的

 

-内置于java虚拟机的安全特性

 

-安全管理器及java API

代码签名和认证

签名

A用A的私钥加密,B用A的公钥解密

加密

A用B的公钥加密,B用B的私钥解密

 

策略

具体安全管理器用策略文件,一个ASCII文件定义自己的定制策略,给不同的类授予权限

将 friend.jar代码在有策略文件policyfile.txt被装载后,放到一个保护域,,ProtectionDomain封装了一个到 CodeSource对象的引用以及一个到java.security.Permissions对象的引用,当类装载器将类导入方法区时,类装载器将把一 个ProtectionDomain对象的引用和class字节传递给defineClass(), defineClass方法将Friend和Friend$1所在的方法区的数据类型和被传递的ProtectDomain对象相关联

 

当JAVA API进行任何不安全的操作时,都会像安全管理器提出许可,JAVA API调用安全管理器的check方法,确定操作是否合法,java启动应用程序时,还没有安全管理器,应用程序通过将java.lang.SecurityManager或是子类的实例传递给setSecurityManager()来安装安全管理器

安全管理器的check方法被调用时,将请求传递给AccessController类,AccessController将调用checkPermission, 此方法决定了调用栈中的每一个帧是否有权执行潜在不安全的操作,每一个栈帧代表了由当前线程调用的某个方法,checkPermission将调用和这个线程的调用栈中的每一个栈帧相关联的ProtectionDomain对象的implies(), 传递Permisssion对象作为参数,ProtectionDomain的implies()中调用PermisssionCollection的implies(), PermisssionCollection的implies()中调用它包含的Permisssio对象的implies(),一旦某个Permission对象返回了true,向上传递,这个栈帧所代表的代码就有了执行这个潜在不安全操作的权限、

Policy.getPolicy()得到当前有效的Policy对象,再调用Policy对象的getPermisssion()方法,传入CodeSource,得到CodeSource的相应Permission对象的PermissionCollection,来判断应该给导入的代码授予什么权限。

 

栈检查

当存在潜在不安全操作是,调用安全管理器checkPermission方法,当AccessionController执行栈检查时,由栈顶10开始,确定相应的保护域是否包含了权限,一旦检查到无权限,抛出AccessControllerException

BPPTSTARP被赋予java.lang.AllPermission的权限

AccessController重载了四个名为doPrivileged的静态方法,如果和调用doPrivilged的方法相关联的保护域拥有执行被请求操作的权限时,AccessController将立即返回

 

 

 

 

posted on   yoyo_zeng  阅读(254)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
点击右上角即可分享
微信分享提示