java的沙箱模型

java的沙箱模型就是指java的安全模型,沙箱模型允许你下载一些不可靠站点的代码,但是沙箱模型会限制它们对系统的破坏。究竟java沙箱是怎么做到这一点的呢,我们来看看java沙箱的基本组件。
   类装载器结构 
   class
文件检验器 
   java
虚拟机的安全特性 
   
安全管理器和Java API
   这些组件列出的顺序其实也是java沙箱安全模型进行安全措施的步骤。(当然,这其中的类装载器和安全管理器是可以定制的)<o:p></o:p>

类加载器:<o:p></o:p>

      java程序运行的第一步就是通过类加载器加载class文件。

      有几点规则要事先说明:<o:p></o:p>

规则1.java虚拟机中,在同一个命名空间内的类可以直接进行交互,而不同命名空间的类甚至不能觉察到彼此的存在。<o:p></o:p>


规则2.1.2开始,除启动类装载器以外的每一个类装载器,都有一个双亲类装载器,在某个特定的类装载器试图以常用方式装载类以前,它都会默认的把这个任务委派给它的双亲-请求它的双亲去装载这个类,如果它的双亲没有能力转载,则只能试图自己去装载这个类。<o:p></o:p>

我们来举一个例子来描述类的加载过程。<o:p></o:p>

    <!--[if mso & !supportInlineShapes & supportFields]><span lang=EN-US style='mso-no-proof:yes'><span style='mso-element:field-begin; mso-field-lock:yes'></span> SHAPE <span style='mso-spacerun:yes'>&nbsp;</span>\* MERGEFORMAT <span style='mso-element:field-separator'></span></span><![endif]--><!--[if gte vml 1]><v:rect id="矩形_x0020_1" o:spid="_x0000_s1026" alt="说明: http://zhaonjtu.iteye.com/blog/80647" style='width:237.75pt; height:175.9pt;visibility:visible;mso-wrap-style:square;mso-left-percent:-10001; mso-top-percent:-10001;mso-position-horizontal:absolute; mso-position-horizontal-relative:char;mso-position-vertical:absolute; mso-position-vertical-relative:line;mso-left-percent:-10001;mso-top-percent:-10001; v-text-anchor:top' o:gfxdata="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 " filled="f" stroked="f"> <o:lock v:ext="edit" aspectratio="t" /> <w:wrap type="none" /> <w:anchorlock /> </v:rect><![endif]--><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><![endif]--><!--[if mso & !supportInlineShapes & supportFields]><span lang=EN-US style='mso-no-proof:yes'><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:237.75pt;height:175.9pt'> <v:imagedata croptop="-65520f" cropbottom="65520f" /> </v:shape><span style='mso-element:field-end'></span></span><![endif]--><o:p></o:p>

    假设网络类加载器发出一个转载Volcano类的请求,按照规则2 Volcano的加载会一直逐步委派到启动加载器,但是Volcano不是核心API,因此Volcano的加载的任务会再次让网络类加载器去加载,假设通过网络正确的下载了Volanno类,这样Volcano类会在以后的执行过程中会被使用。<o:p></o:p>

    我们再进一步假设Volcano类有一个方法被调用,方法引用了java.util.HashMap,由于是第一次引用,虚拟机会请求装载Volcano的类装载器去转载,同样通过规则会让启动类加载器去加载这个HashMap类。<o:p></o:p>

   从上述的过程我们可以得出:<o:p></o:p>

  1.假如我们自己编写了一个java.util.HashMap的类,它是不可能被加载的,即便是一个病毒去伪装成java.util.HashMap,还是没法用,原因很简单,类加载器总是去加载真正的核心API中的HashMap<o:p></o:p>

    你也许会想能不能在把HashMap加载后我再用假的去替换这个真的HashMap,呵呵,当然可以,前提是你要知道虚拟机的设计,这样才能知道存放HashMap存放的地址,这一点也是java结构化内存操作的安全性考虑。<o:p></o:p>

    我们继续Volcano类的调用,聪明的黑客或许会想到如何利用规则1伪装一个具有访问权限的类,比如java.lang.hacker,这个hacker按照规则1可是拥有访问java.lang包中的任何权限的啊,好可怕。<o:p></o:p>

      规则三:Java虚拟机只把特殊访问的权限授予由同一个类加载器装载的同一个包中的类,即他们属于同一个运行时包运行时包这个是在java 虚拟机第二版规范中第一次提出,它指由同一个类型加载器转载的,属于同一个包的,多个类型的集合。<o:p></o:p>

   很显然java.lang.hackerjava.lang中的其他类型属于同一个运行时包的,因此没有访问权限。<o:p></o:p>

     说到这里也许会想,我要是修改java核心库是不是就可以瞒天过海了,当然可以了。但是java安全还有其他的机制去防范,但是也注意这仅仅是机制,你死活要主动的破坏也不是不可能。<o:p></o:p>

     注:绝大部分内容来自《深入java虚拟机》,书上只讲这么多,我也只知道这么多,希望抛砖引玉。<o:p></o:p>

 

你可能感兴趣的:(java)