沙箱Java代码

在上一篇文章中,我们研究了如何保护移动Java代码 。 这样做的一种选择是在笼子或沙箱中运行代码。

这篇文章探讨了如何为Java应用程序设置这样的沙箱。

安全经理

Java中支持沙箱的安全性设施是java.lang.SecurityManager

默认情况下,Java在没有SecurityManager情况下运行,因此您应在应用程序中添加代码以启用以下代码:

System.setSecurityManager(new SecurityManager());

您可以使用标准的SecurityManager或后代。

SecurityManager有许多checkXXX()方法,这些方法都转发给checkPermission(permission, context) 。 此方法要求AccessController进行实际工作(请参见下文)。

[ checkXXX()方法是Java 1.1的遗物 。]

如果允许请求的访问,则checkPermission()安静地返回。 如果被拒绝,则抛出java.lang.SecurityException

实现沙箱的代码应在执行敏感操作之前调用checkXXX方法:

SecurityManager securityManager = System.getSecurityManager();
if (securityManager != null) {Permission permission = ...;securityManager.checkPermission(permission);
}

JRE包含许多地方的代码。

权限

权限表示对系统资源的访问。

为了允许这种访问,必须向尝试访问的代码显式授予相应的许可(请参见下文)。

权限源自java.security.Permission 。 它们有一个名称和一个可选的操作列表(以逗号分隔的字符串值形式)。

Java附带了许多预定义的权限,例如FilePermission 。 您还可以添加自己的权限 。

以下是read文件/home/remon/thesis.pdf的权限:

Permission readPermission = new java.io.FilePermission('/home/remon/thesis.pdf', 'read');

您可以通过授予代码权限AllPermission来执行任何事情。 这与不使用SecurityManager运行它具有相同的效果。

政策规定

使用策略 授予权限。 策略负责确定代码是否有权执行安全敏感的操作。

AccessController查阅Policy以查看是否授予了Permission

在任何给定时间只能使用一个Policy对象。 应用程序代码可以将Policy子类化以提供自定义实现 。

Policy的默认实现使用配置文件加载授权。 有一个系统范围的策略文件和一个(可选)用户策略文件 。

您可以使用PolicyTool程序创建其他策略配置文件。 每个配置文件都必须使用UTF-8编码。

默认情况下,根本不授予代码任何权限。 每个grant语句都会添加一些权限。 授予的权限无法撤消。

以下策略片断授予代码,从起源/home/remon/code/目录read权限的文件/home/remon/thesis.pdf

grant codeBase 'file:/home/remon/code/-' {permission java.io.FilePermission '/home/remon/thesis.pdf','read';
};

请注意, codeBase的部分是URL ,因此,即使在Windows系统上,也应始终使用正斜杠。

带尾随/ codeBase匹配指定目录中的所有类文件(不是JAR文件)。 带有尾随/* codeBase匹配该目录中包含的所有文件(类和JAR文件)。 带有尾随/- codeBase匹配目录中的所有文件(类和JAR文件),并递归匹配该目录中包含的子目录中的所有文件。

对于Windows系统上文件权限中的路径,您需要使用双反斜杠( \\ ),因为\是转义字符:

grant codeBase 'file:/C:/Users/remon/code/-' {permission java.io.FilePermission'C:\\Users\\remon\\thesis.pdf', 'read';
};

为了获得更大的灵活性,您可以编写带有可变部分的赠款。 我们已经看到了codeBase通配符。 您也可以替换系统属性 :

grant codeBase 'file:/${user.home}/code/-' {permission java.io.FilePermission'${user.home}${/}thesis.pdf', 'read';
};

注意
${/}替换为系统的路径分隔符。 无需在 codeBase ,因为这是一个URL。

签名码

当然,我们应该确保我们使用的代码是签名的 ,以便我们知道它实际上是我们认为来自的人。

我们可以使用signedBy子句在策略中测试签名:

keystore 'my.keystore';
grant signedBy 'signer.alias', codeBase ... {...
};

这一政策片段使用的密钥库别名为my.keystore来查找公钥证书与别名signer.alias

然后,它验证执行代码已由与找到的证书中的公钥相对应的私钥签名。

只能有一个keystore条目。

codeBasesignedBy子句的组合指定了ProtectionDomain 。 同一ProtectionDomain中的所有类都具有相同的权限。

特权代码

每当尝试进行资源访问时,堆栈上的所有代码必须具有该资源访问的权限,除非堆栈上的某些代码已标记为privileged

将代码标记为特权可使一段受信任的代码临时允许访问比直接调用它的代码更多的资源。 换句话说,安全系统将所有呼叫者视为来自发出特权呼叫的类的ProtectionDomain的所有呼叫者,但仅在特权呼叫的持续时间内。

您可以通过在AccessController.doPrivileged()调用中运行代码来使代码具有特权:

AccessController.doPrivileged(new PrivilegedAction() {public Object run() {// ...privileged code goes here...return null; }
});

组装沙箱

现在我们有了组装沙箱所需的所有零件:

  1. 安装SecurityManager
  2. 签名应用程序罐
  3. 授予我们签名的所有代码AllPermission
  4. 在移动代码可能调用的地方添加权限检查
  5. 权限检查doPrivileged()块后运行代码

我在GitHub上创建了一个简单的示例。

参考: 安全软件开发博客中来自我们JCG合作伙伴 Remon Sinnema的Java代码沙盒 。

翻译自: https://www.javacodegeeks.com/2012/11/sandboxing-java-code.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微型计算机2017年9月上,2017年9月计算机一级考试WPS Office冲刺题

2017年9月计算机一级考试WPS Office冲刺题2017年下半年计算机一级考试将在9月份进行,为了方便考生备考计算机一级考试。下面是小编为大家带来的计算机一级考试WPS Office冲刺题,欢迎阅读。冲刺题一:1、PowerPoint 演示文稿和模板的扩展名是【…

七. 多线程编程5.创建多线程

到目前为止,我们仅用到两个线程:主线程和一个子线程。然而,你的程序可以创建所需的更多线程。例如,下面的程序创建了三个子线程:// Create multiple threads.class NewThread implements Runnable { String name; /…

11尺寸长宽 iphone_弱电工程LED显示屏尺寸规格及计算方法

前言:led屏幕在生活中,随处可见,显示屏、广播屏等等,但是led尺寸怎么计算的,你知道吗?今天我们一起了解一下led屏幕尺寸的计算方法。正文:一、点间距的计算1、各单元板常见型号及尺寸LED屏普遍是…

marquee标签的使用

<!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>演示marquee</title><style type"text/css">*{padding: 0px;margin: 0px;}marquee{border: 1px solid purple;}img{width: 360px;height: auto;}&…

32位数据源中没有mysql_[SpringBoot实战]快速配置多数据源(整合MyBatis)

前言由于业务需求&#xff0c;需要同时在SpringBoot中配置两套数据源&#xff08;连接两个数据库&#xff09;&#xff0c;要求能做到service层在调用各数据库表的mapper时能够自动切换数据源&#xff0c;也就是mapper自动访问正确的数据库。本文内容&#xff1a;在SpringbootM…

考研计算机冷门学校,考研5个冷门的985院校 别随大流,这些几所也是很不错的...

导语&#xff1a;想必大家考研的目的有很多&#xff0c;最主要的就是想去更好的学校提升自己&#xff0c;大部分会肯定是会更倾向于985这类的院校&#xff0c;每年其实除了那些被“挤破头”的985院校&#xff0c;其实还有不少“低调”的985院校是非常值得报考的&#xff0c;下面…

名为 cursor_jinserted 的游标不存在_质量工程师必须了解的测量常识,你不知道怎么行...

01测量器具的分类测量器具是一种具有固定形态、用以复现或提供一个或多个已知量值的器具。按用途的不同量具可分为以下几类&#xff1a;1. 单值量具只能体现一个单一量值的量具。可用来校对和调整其它测量器具或作为标准量与被测量直接进行比较&#xff0c;如量块、角度量块等。…

window.onload事件

!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>window.onload</title><!--window.onload注意点&#xff1a;01.在整个页面中只能存在一次&#xff0c;否则后面会覆盖前面02.页面中所有的内容加载…

bzoj4869

http://www.lydsy.com/JudgeOnline/problem.php?id4869 终于A了。。。参考了下dalao的代码。。。 拓展欧几里得定理&#xff0c;改了几次就不变了&#xff0c;但是用的时候要在快速幂里判是不是要用。 #include<bits/stdc.h> using namespace std; typedef long long ll…

一张图一个表——CSS选择器总结

CSS选择器总结&#xff1a; (这些表是一张图片^_^) 看底部 完整思维导图图片和表格的下载地址&#xff1a;https://download.csdn.net/download/denlnyyr/10597820 &#xff08;我不想选择要积分币下载的&#xff0c;但那里最低必须选择1个积分……&#xff09; 参考文献&…

JavaOne 2012覆盖率

年度Java盛会JavaOne会议于9月30日至10月4日在旧金山举行。 进行了许多有趣的演示&#xff0c;再次证明了健康的Java生态系统。 Java Code Geeks未能参加会议&#xff0c;但是我们的JCG合作伙伴Dustin Marx出席了会议&#xff0c;并且慷慨地提供了有关该事件的完整报道&#x…

native层 安卓_安卓逆向——拼xx协议java层分析

制丨阿星整理丨阿星老铁们大家好&#xff0c;今天小编给大家带来很实用的技巧叫拼xx协议java层分析&#xff0c;有啥不足的地方望大家指点指点&#xff01;首先抓包 反编译这个时间段我们方法剖析一下找到onclick 看他的走向找到方法的地方都是在进行写入 所以我们直接分析结果…

对口高考计算机vf试题,计算机对口升学模拟答案.doc

2013年计算机专业对口高考模拟试题二一、选择题1&#xff0e;计算机硬件系统由( )组成A.CPU和内存 B.控制器和运算器 C.主机和外设 D.CPU、内存和外存2.下列叙述中&#xff0c;正确的说法是( )。A.键盘、鼠标、光笔、数字化仪和扫描仪都是输入设备B.打印机、显示器、数字化仪都…

Java集合框架图

转载于:https://www.cnblogs.com/areyouready/p/6835279.html

JavaScript学习第一天(一)

JavaScript介绍 JavaScript一种直译式脚本语言&#xff0c;是一种动态类型、弱类型、基于原型的语言&#xff0c;内置支持类型。它的解释器被称为JavaScript引擎&#xff0c;为浏览器的一部分&#xff0c;广泛用于客户端的脚本语言&#xff0c;最早是在HTML&#xff08;标准通用…

折半查找的思想及源码_常用排序与查找算法

1 选择排序选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是&#xff1a;第一次从待排序的数据元素中选出最小(或最大)的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻找到最小(大)元素&#xff0c;然后放到已排序的序…

滚动视差?CSS 不在话下

何为滚动视差 视差滚动&#xff08;Parallax Scrolling&#xff09;是指让多层背景以不同的速度移动&#xff0c;形成立体的运动效果&#xff0c;带来非常出色的视觉体验。 作为网页设计的热点趋势&#xff0c;越来越多的网站应用了这项技术。 通常而言&#xff0c;滚动视差在…

计算机图形学试题a卷,计算机图形学复习题及答案

一、选择题1.计算机绘图设备一般使用( )颜色模型。A. RGBB. CMYC. HSVD. HLS2.在透视投影中&#xff0c;主灭点的最多个数是( )A1B2C3D43.多边形填充时&#xff0c;下述论述错误的是( )A 多边形被两条扫描线分割成许多梯形&#xff0c;梯形的底边在扫描线上&#xff0c;腰在多边…

番石榴的弦类

在“ 检查Java中的空&#xff0c;空或仅空白字符串”一文中 &#xff0c;我演示了Java生态系统&#xff08;标准Java&#xff0c; Guava &#xff0c; Apache Commons Lang和Groovy &#xff09;中用于检查字符串是否为空&#xff0c;空或空白的常见方法。仅类似于C&#xff03…

用python做数据分析流程图_使用Pyecharts进行高级数据可视化

欢迎使用Markdown编辑器经管之家&#xff1a;Do the best economic and management education&#xff01;你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语…