一种确保Java程序安全的简单方式

SecurityManager介绍

Java序列化漏洞利用中突出的一点是,一旦一个服务器端的Java应用程序被破解,那么下一步就是获取主机上的shell访问权限,这就是我们所熟知的远程代码执行(RCE)。

然而有趣的是,其实从Java 1.1开始,Java中就存在一种方式来限制代码执行,并能够防止远程代码执行,这就是SecurityManager。在启用SecurityManager之后,Java代码会在一个非常安全的沙盒中执行,而这能够防止远程代码执行。

 

这会以$JAVA_HOME/jre/lib/security/java.policy中的默认安全策略运行,在JDK 1.8中为如下内容:

 

以下面的代码举例:

策略文件

在启用安全管理器并使用一个额外的策略文件时,可以明确地启用或禁用执行特权:

你可以以下面的方式运行:

如果只注释掉FilePermission那一行,那么将会抛出一个异常。

到目前为止一切都比较顺利。但是,那只是对客户端一侧的applet启用了这个功能,此时在服务器端仍然是禁用状态。

这是为什么呢?其实,因为(可以查看上述代码)默认的SecurityManager将系统锁在了无用点上。为了使系统处于有用状态,它必须拥有一个自定义的java.security.policy文件。

问题分析

这种策略的实现中有几个问题。因为策略文件本身是过时了的,安全权限并未以任何一种逻辑顺序进行排序,且一些权限拥有通配符的选择功能而其他的则没有。你可以以白名单的形式只允许特定的行为,而不是直接拒绝。最坏的情况是,列表越长,那么程序将运行得越慢。这里有一个教程和权限列表,但是在实践中并不是特别有用,并且这份文档指南上一次的更新时间早在2002年。

当你有了不可信任的代码时,可以编写定制的SecurityManager,而这就是Scalatron所做的工作。

然而,如果我们要防止远程代码执行,那么我们需要一个通用目的的SecurityManager,其中它几乎允许所有事情,但是能够阻止在主机上运行的代码。这可能不是一个完美的防守,但是它将是深度防御策略中很重要的一部分。

事实上,已经有个人做了这一点。

pro-grade介绍

Josef Cacek 将pro-grade集成在一起,向Java文件中添加了一个“deny”选项和一个“allow”选项。Devoxx中有一个演讲以幻灯片和视频形式讲解了pro-grade。

现在,使用pro-grade进行前面的示例,下面的策略将会锁定所有执行权限:

 

注意,这不是一个完整的解决方案。为了阻止代码工作,我猜想你还需要禁用其他几个权限,不过我还不清楚哪些权限是与此相关的。但是,这只是一个开始,为了廉价地确保服务器端的Java程序安全,还有很长的路要走。

使用Pro-grade很简单创建一个适当的策略。有一个策略生成器可以显示一个应用程序所需要的所有权限,且一个教程展示了创建它所需要的所有步骤,然后有一个权限调试器能够捕捉偏离的权限。

应用到你的项目中

你可以在prograde-example这里得到整个项目,并且可以从这里将pro-grade集成到你的项目中。此外,大多数人将需要Maven:

pro-grade真正有趣的地方是,它是一个透明的解决方案。虽然使用白名单策略是一种不错的方式,但是使用这种技术你可以将pro-grade添加到一个现有的、已经编译的项目目中,并且可以禁用脚本执行。

只需一些小小的修改,pro-grade就可以用来通知入侵(尤其是setSecurityManager和其他很少接触的地方),似乎在默默地矫正操作时也能够正常工作。你需要做的所有工作就是以一个SLF4J实现来实现PermissionDeniedListener。

原文发布时间为:2015-12-30

本文作者:FreeBuf

时间: 2024-10-26 15:26:14

一种确保Java程序安全的简单方式的相关文章

使用JAXB来实现Java程序配置的简单方法

程序的自定义设置是一个重要的功能,大多数程序都会提供自定义配置的方法,提供用户根据个人喜好.运行环境来配置软件的使用方式.程序的配置方式存在多样性,一般会采用windows格式的ini配置文件或者注册表方式,java格式的properties属性文件,随着xml文件在程序开放中的普及,也有越来越多的配置开始使用xml的文件方式,例如java EE中的部署描述文件. 我们知道,在java中存在很多xml的处理方式,xml组织的dom.sax方法,apache以及sun官方都提供的众多的实现,也有很

如何保护Java程序 防止Java反编译

Java是一种跨平台的.解释型语言.Java 源代码编译中间"字节码"存储于class文件中.Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如变量名.方法名等.因此,Java中间代码的反编译就变得非常容易.目前市场上有许多免费的.商用的反编译软件,都能够生成高质量的反编译后的源代码.所以,对开发人员来说,如何保护Java程序就变成了一个非常重要的挑战.本文首先讨论了保护Java程序的基本方法,然后对代码混淆问题进行深入研究,最后结合一个实际的应用程序,分

【转】动态字节码技术跟踪Java程序

 Whats is Java Agent?   .. java.lang.instrument.Instrumentation   之前有写 基于AOP的日志调试 讨论一种跟踪Java程序的方法, 但不是很完美.后来发现了 Btrace , 由于它借助动态字节码注入技术 , 实现优雅且功能强大. 只不过, 用起来总是磕磕绊绊的, 时常为了跟踪某个问题, 却花了大把的时间调试Btrace的脚本. 为此, 我尝试将几种跟踪模式固化成脚本模板, 待用的时候去调整一下正则表达式之类的. 跟踪过程往往是假

教你怎样在java程序中引入neo4j数据库

随着关系型数据库在某些方面的力不从心,了解当下流行的各种数据库模式的特点和性能,无疑会给我们提供更多的选择和方向. neo4j是一种图形数据库,在遍历和关联查询方面具有突出的优势.废话少说,深入了解neo4j之前,先让我们尝试一下怎样在程序中使用neo4j. neo4j采用java语言开发,如果我们要在java程序中以内嵌方式使用neo4j,只需导入neo4j的对应包即可. 首先,我们来创建一个maven项目并修改pom.xml添加对neo4j的依赖. <?xml version="1.0

求大神,给一份 登陆之后返回之前页的java程序,急求

问题描述 求大神,给一份 登陆之后返回之前页的java程序,急求 简单的一个小程序就可以,功能就是在当前页点击登录,跳转到登陆页面,登录完成之后,就又跳回到本页,谢谢了!!!!! 解决方案 这里有个简单的用struts2框架的登录工程,你看看可以不.http://download.csdn.net/detail/wojiushiwo945you/8673999 祝好! 解决方案二: 将当前页的网址以参数的形式传入登录界面,登录成功后,再根据参数打开登录前的页面. 看看现成的网站,好多是这样做的:

《Java程序员面试秘笈》—— 面试题1 简单描述Java开发包的种类

面试题1 简单描述Java开发包的种类 考点:考察求职者对于Java体系的认识,属于Java程序员的必备知识. 出现频率: [面试题解析]随着Java语言的成长和壮大,Java的开发包根据用途的不同已经分为Java EE.Java SE和Java ME 3个开发包,求职者需要列出名称,并具体描述每个开发包的用途. 参考答案: Java SDK的版本分类如下所述. Java ME:(Java Platform Micro Edition)一种以广泛的消费性产品为目的的高度优化的Java运行环境,包

用Java程序判断是否是闰年的简单实例_java

我们知道,(1)如果是整百的年份,能被400整除的,是闰年:(2)如果不是整百的年份,能被4整除的,也是闰年.每400年,有97个闰年.鉴于此,程序可以作以下设计: 第一步,判断年份是否被400整除,能的话,就是闰年.比如1600.2000.2400年是闰年. 第二步,在第一步不成立的基础上,判断年份能否被100整除,如果是,则不是闰年.比如1900.2100.2200年不是闰年. 第三步,在第二步不成立的基础上,判断年份能否被4整除,如果是,则是闰年.比如1996.2004.2008年是闰年.

初学java,自己用java写了一个简单的注册登录程序,没报错但有问题,希望能帮忙指点。

问题描述 初学java,自己用java写了一个简单的注册登录程序,没报错但有问题,希望能帮忙指点. import java.util.Scanner; class Yanzheng{ private String n; private String p; public void setNa(String na){ this.n = na; } public void setPa(String pa){ this.p = pa; } public String getNa(){ return n;

将Java程序变成可执行文件的简单方法

运行Java程序(SWING或SWT的桌面程序)可以直接执行.class文件或将所有的.class文件及相关的其他文件压缩成.jar文件,然后使用javaw -jar my.jar来运行程序(其中my.jar是一个jar文件名,可以是任何指定的jar文件).但在windows下,用户习惯直接运行一个exe来执行程序.在网上有很多程序可以将my.jar或.class文件直接转换成exe文件.但很多都是将jar或.class文件放到exe里成,这样不太方便.有些工具,如javalauncher可以使