《移动代码安全》ppt课件_第1页
《移动代码安全》ppt课件_第2页
《移动代码安全》ppt课件_第3页
《移动代码安全》ppt课件_第4页
《移动代码安全》ppt课件_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第1313章章 移动代码安全移动代码安全 第第13章章 挪动代码平安挪动代码平安 13.1 引言引言 13.2 挪动代码平安技术挪动代码平安技术 13.3 Java平安平安 第第1313章章 移动代码安全移动代码安全 13.1 引引 言言 挪动代码又称挪动代理、可下载代码、可执行内容、远程代码等等,它是指在本地执行的远程代码。传统系统中,执行的代码都是驻留在执行代码的主机上,而对于挪动代码,执行的代码那么是来自远程主机。 Carzaniga等人1将挪动代码进展了分类并与传统的基于客户机效力器技术的分布式系统作了比较:第第1313章章 移动代码安全移动代码安全 1 客户机效力器模型:客户机和效

2、力器位于不同的主机上,由客户机向效力器发送恳求;处置恳求所需的资源和代码都位于效力器端。 2 即时呼应代码Code-on-Demand:客户机拥有完成某项操作的资源,但没有如何完成这项操作的代码,客户机经过向远程效力器发送恳求,由效力器将代码发送给客户机。这种类型的挪动代码包括:Java运用程序、ActiveX控件、MIMI Tcl扩展和Postscript等。第第1313章章 移动代码安全移动代码安全 3 远程计算:客户机拥有描画某项效力的代码,而执行代码所需的资源位于远程效力器上。客户机把代码发送到效力器上,由效力器执行代码并把结果回送到客户机。 4 挪动代理:客户机进程在执行期间为了完成

3、某项效力需求访问一些资源,而这些资源位于远程效力器上,于是客户机把客户机进程移植到效力器端并由效力器完效果劳。客户机进程会不断停留在效力器上直到下一个客户机进程移植过来。第第1313章章 移动代码安全移动代码安全 Java运用程序Applet和代理Agent是挪动代码中的两种主要方式。Java运用程序是用户把代码从远程主机下载到本地执行。这种技术在Web阅读器中嵌入了Java虚拟机。这样,Web发布者就可以向用户提供动画、游戏等动态内容,而不仅仅提供静态的HTML页面或依赖于带宽的CGI交互式内容。而代理那么相反,用户是把代码发送到网络上以完成用户所需的某项义务。最早的挪动代理系统之一是Tel

4、escript。第第1313章章 移动代码安全移动代码安全 从上面的讨论可以看出,挪动代码是由一方生成,但在另一方控制的环境中运转的代码。这就会带来平安问题。如对于Java运用程序,用户在执行它来实现某些操作的同时要承当恶意代码破坏系统的风险,而代理那么要维护其代码免受恶意主机的利用。第第1313章章 移动代码安全移动代码安全 13.2 挪动代码平安技术挪动代码平安技术 挪动代码会导致平安问题的本质在于在运转代码时需求访问系统资源,而代码却是来自于另一台,甚至是不可信的主机。即代码提供者和代码运转者之间能够是互不信任的。挪动代码易遭到以下几种类型的攻击2: 1 走漏用户或主机的信息; 2 回绝

5、效力:使合法用户无法获得资源;第第1313章章 移动代码安全移动代码安全 3 破坏或修正数据; 4 恶作剧攻击:如在用户屏幕上显示图片或在用户主机上播放音乐等。第第1313章章 移动代码安全移动代码安全 挪动代码平安需求思索以下几个方面:1 访问控制:规定谁可以运用代码;2 用户认证:识别合法用户;3 数据完好性:保证代码在传输过程中未被修正正;4 不可抵赖:发送者和接纳方不能否认运用过代码;5 数据性:维护敏感数据;6 审计:跟踪挪动代码的运用。第第1313章章 移动代码安全移动代码安全 在前面提到,挪动代码平安可以从两个方面思索:一是恶意代码对本地系统的破坏;二是远程恶意主机对代理的非法运

6、用。接下来,我们将从恶意代码和恶意主机两个方面来讨论挪动代码的平安技术3。第第1313章章 移动代码安全移动代码安全 13.2.1 恶意代码 对于Java运用程序类的挪动代码,普通的操作是用户下载可执行格式的二进制Applet然后运转。这就很容易带来平安问题:用户必需允许不可信的代码在本机运转,而这些代码能够会随机写内存,从而导致系统解体;代码甚至可以读、修正以致删除用户个人文件。 在运转Applet之前进展认证可以处理这个问题。经过认证,用户就可以确定它所运转的代码来自于特定的可信源。但是这种方法带来了两个问题:第第1313章章 移动代码安全移动代码安全 1 严重限制了用户可以运转的Appl

7、et必需来自可信源,而不可信效力器也可提供有用的、好的代码; 2 更重要的是来自可信源的代码能够存在bug,从而对用户系统带来恶劣的影响。 对这个问题的理想处理方法就是阻止不平安的行为。接下来讨论三种处理恶意代码问题的技术:平安解释器、缺点隔离和代码验证。第第1313章章 移动代码安全移动代码安全 1平安解释器 直接运转二进制代码是很危险的,处理这个问题的常用方法是不运用编译好的可执行代码,而采用解释挪动代码的方法。在这种情况下,解释器能很好地控制Applet并能检查每一条指令和每一个形状以决议能否执行Applet。这样,系统的平安性就在于实现解释器的平安战略的正确性上。平安解释器包括Safe

8、-Tcl、Safe-Tcl扩展、Java等等。第第1313章章 移动代码安全移动代码安全 2缺点隔离 采用平安的解释器系统能很好地处理恶意代码的问题。但是,相对编译的机器码而言,解释器存在严重的性能缺陷:执行Java Applet比执行普通的二进制代码要慢得多。为此可以转而采用一种称为“沙盒sandbox的方法来获得平安。第第1313章章 移动代码安全移动代码安全 在沙盒方式中,下载的不可信代码的操作将严厉局限于沙盒中。沙盒是由运转代码的主机特别为挪动代码分配的地址空间,如Web阅读器特别为Java Applet分配的区域。这时,挪动代码可以在沙盒中运转,但不会超出沙盒的界限。例如,Apple

9、t不能读取或修正存储在用户系统上的文件。在某种情况下,即使用户偶尔引入了一个敌意的Applet,这个Applet也不能破坏用户的系统。因此这种沙盒方式为挪动代码提供了一个受限的运转环境,在此环境中可以运转从开放网络中获得的不被完全信任的代码如Applet等。第第1313章章 移动代码安全移动代码安全 实现沙盒有两种方法: 1 插入对地址进展条件检查的操作,假设地址非法那么产生异常; 2 简单覆盖对应沙盒地址的高比特位。 第一种方法更适宜调试,而第二种方法系统开销小一些。 采用沙盒方式的主要缺陷是可下载的代码不再是与平台无关的,而与操作平台无关本来是Java系统的主要设计目的之一。第第1313章

10、章 移动代码安全移动代码安全 3代码验证 第三种技术是一种称为证明携带码PCCProof-Carrying Code的技术4。采用这种技术时,挪动代码主机为Applet确定平安战略,然后以Edinburgh逻辑构造Logical Framework:用来发布平安战略和对证明进展编码对平安战略编码并发布这个战略。Java Applet作者的义务不仅是把Applet编译成机器代码,还要产生一个平安证明Safety Proof,用来证明这个代码符合平安战略中指定的平安规那么Safety Rules。 第第1313章章 移动代码安全移动代码安全 当用户下载代码后,它只需验证代码中的证明,看能否合法并满

11、足平安规那么就行。假设是那么加载代码并运转它。 这种方法能否有效的关键在于哪些程序特性可以用LF表示和证明。PCC已胜利运用于最小和最大CPU周期限制、内存的平安运用、网络带宽耗费以及类型平安中。此外,为C言语的平安子集开发了PCC编译器,它可以自动生成平安证明。第第1313章章 移动代码安全移动代码安全 PCC是一种很有前景的方法,但是,它也存在一些缺陷:PCC与平台有关;LF编码的平安战略和平安证明必需和操作系统以及机器硬件亲密联络。更多信息可以参考网站: /pcc.html。第第1313章章 移动代码安全移动代码安全 13.2.2 恶意主机 在讨论了

12、恶意代码问题之后,我们开场讨论恶意主机问题。在挪动代理编程中,用户所关怀的是其代理能否被正确执行。如一个购物代理能够会携带电子现金,一个主机就能够会欺骗代理使它为某些商品支付高价钱,甚至窃取代理内的金钱。这都是用户所要面对的平安问题。 主机为了执行代理,需求访问代理代码和形状,那么如何保证敏感数据的性,或者说如何保证代理算法被忠实地执行呢?Chess13等人以为维护挪动代理的限制有:第第1313章章 移动代码安全移动代码安全 1 要对代理代码或形状的恣意部分严密,就必需采取加密; 2 我们无法阻止回绝效力攻击,由于攻击者不需求专门可信硬件的协助就可以恣意修正代理代码或终止代理。 由此可见,要处

13、理恶意主机问题就要从以下两个方面着手: 1 可以检验篡改; 2 能阻止信息走漏。第第1313章章 移动代码安全移动代码安全 1检测篡改 我们无法采用技术途径来使代理不受破坏,但是假设能明确地识别出恶意主机,那么法律的、社会的要挟就能够阻止恶意主机的操作员破坏代理。识别恶意主机还能够使代理的一切者因代理的损失而获得某种程度的补偿。 下面将引见检测恶意主机的技术,这些技术都是基于公开密钥根底设备的,它们允许用户、主机和代理之间相互认证。这些技术主要是要证明一个主机确实是恶意主机,因此,采用数字签名非常重要。第第1313章章 移动代码安全移动代码安全 1 执行跟踪。可以经过产生代理程序执行迹的方法来

14、检测篡改。首先,将代理代码的指令分成两类:只依赖于代理内部形状的指令以及其结果依赖于和计算环境交互的指令。对于前一类指令,效力器只需在代理的任一变量的值发生变化时,才在执行迹中记录其新值;对于后一类指令,不但要记录这些新值,还需求对这些值进展数字签名。第第1313章章 移动代码安全移动代码安全 一旦执行终了,效力器就计算整个执行迹的密码散列值并将它前往给代理的一切者。这时,假设代理一切者疑心在执行代理时有违规操作,它就可以要求出示执行迹,那么主机执行代理时就必需生成执行迹执行迹的散列值可被验证,然后检验执行迹就可确定: 主机能否错误地执行了只依赖于内部形状的指令; 主机执行代理过程中,在与计算

15、环境交互时能否欺骗了代理。第第1313章章 移动代码安全移动代码安全 这种方法在实践的操作中存在两个问题: a 这种方法在主机违规操作时不会向代理一切者发出警报,而只需在一切者疑心时提供一种可验证的识别方法; b 在需求生成执行迹时,效力器需求保管一切的执行迹,这就给效力器带来了非常高的负担。 第第1313章章 移动代码安全移动代码安全 2 认证部分结果。Yee4提出了两种检测恶意主机篡改代理的方法。第一种方法是采用部分结果认证码PRAC,发送代理的同时发送一组密钥k1、k2、kn。在第i个效力器,代理运用密钥ki对其执行结果进展签名并由此产生PARC;在转移到下一个效力器之前,代理把ki从形

16、状中删除。这样,一个恶意主机就不能伪造来自前一个效力器的部分结果,最糟糕的情况也仅仅是把这些部分结果从代理中移除。第第1313章章 移动代码安全移动代码安全 PRACs允许代理一切者同时拥有k1、k2、kn自动地对前往代理中包含的每一部分结果进展密码验证。这些音讯可以保证非常好的前向完好性:设挪动代理访问一系列的效力器S=s1、s2、sn,而第一个恶意效力器为sc,那么对于ic,效力器si的部分结果不是伪造的。 当效力器仅仅经过与正在运转的代理进展欺诈性的交互实现篡改时,上述方案就无法自动检测到。此外,只需在代理一切者疑心主机时才会产生PRAC一切的PRAC都是密码有效的,但有些能够在语义上无

17、效。第第1313章章 移动代码安全移动代码安全 Yee提出了一种投机的方法来检测语义上的篡改。对于程序x,设y为x的执行迹。主机执行完代理后把y发送给代理一切者,由一切者验证y。由于执行迹能够会很大,因此传输它的带宽开销会非常大。从而,主机把y编码成全息样片y。样片y具有如下特性:代理一切者只需求检查y某些位就能确信其正确与否。这样,效力器就可以采用哈希树的方案将样片散列成一个小的根值,然后把根值前往给代理一切者,由一切者判别y能否正确。这种方法的主要缺陷是效力器的负荷问题。构造全息样片y是一个全NP问题不存在多项式时间算法解的一类问题,全NP问题那么是最为困难的一类,在执行迹y大到很难传输到

18、代理一切者时,构造y是不能实现的。第第1313章章 移动代码安全移动代码安全 2严密 在有些情况下,事后检测是不适当的或是不能处理问题的。如有时候采用法律行动的代价比篡改带来的经济损失更大;有些时候,代理发送数字签名,但由于某些缘由其私钥已被走漏。为此,Sander和Tschudin13提出了一种实际上的方案以允许代理对恶意主机保管一些。 方案的本质是这样的:代理程序计算某个函数f,主机为代理计算fx但不需求知道f的任何本质性的内容。协议描画如下:第第1313章章 移动代码安全移动代码安全 1 代理一切者加密f; 2 一切者创建程序PEf来实现Ef,并把它放在代理中; 3 代理到达远程主机,在

19、远程主机上计算PEfx,并把值前往给一切者; 4 一切者解密PEfx并获得fx。 其中,E为某个加密函数。协议的根本思想是把根本算法转化成杂乱算法,使其结果只对代理一切者有意义。第第1313章章 移动代码安全移动代码安全 3总结 相比恶意代码而言,恶意主机问题更难以处置,目前还没有实践的、在计算上可行的方法用来检测篡改,而一些可以用来证明发生了篡改的技术也会大大添加效力器的负荷。此外,在一个不友好的环境中运转代理时,有没有能够为代理提供某种类型的性还是一个未知数。这些问题的存在或答应以解释挪动代理为什么得不到广泛运用。第第1313章章 移动代码安全移动代码安全 13.3 Java 安安 全全

20、13.3.1 Java综述 Java言语是Sun Microsystems公司开发的。在Sun Microsystems公司提供的技术报告5中称:“Java是一种简单的、面向对象的、适宜网络编程的、解释的、强壮的、平安的、与构造无关的、可移植的、高性能的、多线程的动态言语。第第1313章章 移动代码安全移动代码安全 简单:Java是一种易于运用的编程言语,其简单性表达在以下几个方面: 1 它和C+类似C+程序员可以很快掌握Java编程技术; 2 它摒弃了C+中许多很少用、很难了解和容易混淆的特性,如操作符重载等; 第第1313章章 移动代码安全移动代码安全 3 Java实现了自动渣滓搜集,从而

21、简化了Java编程。在C和C+中,一个复杂的操作是内存管理:内存分配和内存释放。经过自动渣滓搜集周期性的释放没有被援用的内存不但可以使编程简单化,还可大大地减少程序中的bug; 4 Java程序很小,易于经过网络下载。第第1313章章 移动代码安全移动代码安全 面向对象:和C+一样,Java是一种面向对象的编程言语。 适宜网络编程:Java拥有广泛的、能随便处置TCP/IP协议的运转库,因此相比C和C+而言,Java更容易创建网络衔接。Java运用程序经过URL翻开和访问网络上的对象与编程人员访问本地文件系一致样简单。 强壮性:Java能检查程序在编译和运转时的错误。类型检查可以检查出许多开发

22、早期出现的错误;Java没有采用C+中的指针算法而实现了真数组,从而防止了覆盖内存和破坏数据的能够。第第1313章章 移动代码安全移动代码安全 平安:设计Java是为了用于分布式网络环境,因此平安在这里就显得非常重要。本节的后续内容将详细引见Java的平安实现以及其潜在的平安要挟。 与构造无关:Java程序是在网络上传播和运用的,而网络上的不同主机的CPU、操作系统构造等等都不尽一样,为了使Java运用程序能在网络上的任何一台主机上运转,编译器必需产生一个与构造无关的文件格式只需处置器上有Java虚拟机系统,此文件格式的代码就可以在此处置器上运转。Java的做法是让编译器生成与特定计算机体系构

23、造无关的字节码指令,这些字节码指令在任何机器上都很容易解释,并能很容易地翻译本钱机机器代码。第第1313章章 移动代码安全移动代码安全 可移植:与体系构造无关的特性使得Java运用程序可以在配备了Java解释器和运转环境的任何计算机系统上运转,这为Java运用程序便于移植打下了良好根底。但仅仅如此还不够,不同操作系统根本数据类型的设计实现是不同的,如在Windows 3.1中整数int为16位,在Windows 95中为32位,而在DEC Alpha中却为64位。这不利于代码的移植。为此,Java定义了独立于平台的根本数据类型及其运算,从而使得Java数据在任何硬件平台上都是一致的。其次,Ja

24、va编译器本身是用Java言语编写的,而运算系统是用ANSI C言语写的。总之,在Java言语规范中没有任何与详细实现相关的内容。第第1313章章 移动代码安全移动代码安全 解释:Java是一种解释性言语,其解释器可以将Java字节码翻译本钱地机器指令并运转,而不需求存储字节码。 高性能:由于解释字节码的性能普通都是比较高的,从而Java可以在运转时直接将字节码翻译成机器指令。Sun Microsystems的SPARCStation 10在翻译代码时,可以在每秒钟内调用300 000个方法,这和直接生成机器目的代码C/C+的性能不相上下。第第1313章章 移动代码安全移动代码安全 多线程:J

25、ava提供了一个内建的机制来提供对多个并发子义务的支持。 动态:在C+程序设计过程中,每当在类中添加一个实例变量或一种成员函数后,援用该类的一切子类都必需重新编译,否那么将导致程序解体,而Java是一种动态言语,它不是把一切的类静态地编译成机器码,而是由程序动态地装入运转过程中所需求的类。第第1313章章 移动代码安全移动代码安全 13.3.2 Java底层平安性实现 1. 底层平安 Java解释器经过以下几种方式实现底层平安: 1 经过发布源代码获得平安 假设需求,Java解释器和编译器均可获得完好的源代码。对Java源代码可以执行平安审计。第第1313章章 移动代码安全移动代码安全 2 经

26、过明确定义获得平安 Java言语的定义非常严厉: 保证一切的根本类型运用指定的长度; 一切的操作必需按指定的顺序执行。 明确的定义可以保证两个正确的Java编译器执行同一个程序不会得到两个不同的结果。第第1313章章 移动代码安全移动代码安全 3 经过摒弃指针获得平安 Java摒弃了C言语中的指针算法,因此编程人员无法伪造指针来访问内存。对类文件中一切方法和实例变量的援用都是经过符号名来实现的,这就可以防止在C言语中利用指针非法访问内存而提升权限一类的攻击,如缓冲区溢出等。 第第1313章章 移动代码安全移动代码安全 4 经过渣滓搜集获得平安 在C/C+中,编程人员经常面对的问题是内存分配和释

27、放。当释放内存不当,如没有释放不再运用的内存或两次释放同一内存区会导致平安问题。Java经过自动渣滓搜集周期性地释放没有被援用的内存来防止这些问题。第第1313章章 移动代码安全移动代码安全 5 经过在编译时的严厉检查获得平安 Java编译器在编译时要进展详尽的、严厉的检查以尽能够地检测编程中的错误。Java言语是强类型的: 在运转期,假设不进展明确的检查不能把对象分配给某个子类; 要检查一切对方法和变量的援用以确保对象具有适宜的类型。 整数不能转换为对象,对象也不能转换为整数。 编译器还要确保程序没有访问未初始化的本地变量。第第1313章章 移动代码安全移动代码安全 2. 类文件验证 虽然编

28、译器可对类型进展详尽的检查,但攻击者依然能够经过运用专门的编译器实现攻击。如HotJava阅读器是下载曾经编译好的类文件,它无法确定下载的字节码是由可信的Java编译器编译的还是由某个有恶意企图的编译器编译的。 第第1313章章 移动代码安全移动代码安全 在编译时实现对类型的检查还存在版本不一致的问题。如用户编译好了一个类,假设 PurchaseStockOptions是TradingClass的一个子类。但是在类编译完后,TradingClass的定义能够会发生变化:某个方法不用了或方法的参数改动了;变量类型变了。而且,方法或变量也能够从公有变成私有。 为此,一切外来的类文件都需求经过一个验

29、证器,由验证器确保类文件具有正确的格式。第第1313章章 移动代码安全移动代码安全 字节码验证器同样可以加强解释器的性能。利用字节码验证,解释器就不用对每一条解释的指令进展检查,而会以为这些检查都曾经在此之前完成了。如解释器能一定代码遵守以下限制: 代码中不存在缓冲区溢出; 一切的存放器访问和存储都是合法的; 一切字节码的参数都是正确的; 不存在非法的数据转换。第第1313章章 移动代码安全移动代码安全 验证器独立于Java编译器,它运用户可以放心的从防火墙之外下载Java代码。 下面详细引见验证器的验证过程,其中提到的类文件格式的详细细节可参考参考资料5: 1 验证的第一步发生在将类读入解释

30、器时。这一步要确保类文件具有类文件的格式:开场的几个字节必需包含正确的魔幻数;一切可验证的属性都具有正确的长度;类文件的末尾不能被截断,也不能添加额外的字节;常数存储库不能包含不可识别的信息。 第第1313章章 移动代码安全移动代码安全 2 第二步更进一步验证类文件的格式: 确保final类没有被承继,final方法没有被覆盖; 每个类必需有一个超类; 确保常数存储库满足一定的限制,如其中的类援用必需包含一个指向存储库中的一个unicode字符串援用的域。 常数存储库中一切的域援用和方法援用都必需有合法的名字、合法的类和合法的类型签名。第第1313章章 移动代码安全移动代码安全 3 这一步是类

31、验证中最复杂的一步,在这一步中需求验证每一个方法的字节码。这一步要保证: 堆栈的大小和它包含的对象类型坚持不变; 除非包含了一个适当类型的值,否那么不能访问存放器; 以适当的参数调用方法; 以适当类型的值修正域; 一切的操作码在堆栈和存放器中具有适当类型的参数。在“字节码验证中我们将进一步描画这一步的细节。第第1313章章 移动代码安全移动代码安全 4 在第三步中,除非有必要,否那么不会装载类文件。如一个方法调用另一个前往foobarType类型对象的方法时,假设立刻把同一类型的域分配给前往的对象,验证器就不会验证foobarType类型能否存在;假设把anotherType类型的域分配给前往

32、的对象,那么必需装载foobarType和anotherType的定义以确保foobarType是anotherType的一个子类。 援用类的指令第一次执行时,验证器需:第第1313章章 移动代码安全移动代码安全 假设还没有装载这个类那么装载; 验证当前正在执行的类能否被允许援用给定的类。 指令第一次调用方法或访问、修正域时,验证器需: 确保方法或域存在于给定的类中; 检查方法或域能否具有要求的签名; 检查当前正在执行的方法能否有权访问给定的方法或域。 第第1313章章 移动代码安全移动代码安全 这一步中,验证器不需求检查堆栈中对象的类型,由于在第三步中曾经执行了这项检查。 在执行完验证后,字

33、节码流中的指令就会被另一种方式的指令所替代。如操作码new被new_quick替代。这个交换的指令表示曾经执行了对这个指令的验证,不需求再次验证了。第第1313章章 移动代码安全移动代码安全 3字节码验证 类文件验证的第三步是字节码验证,这是类文件验证过程中最复杂的一步。首先,把组成虚指令的字节分成一系列的指令,每一个指令开场位置的偏移量保管在一个位表中。然后,验证器再次扫描这些字节并解析指令。这一步中把每个指令转换成一个构造。检查每个指令的参数假设有的话以确保它们是合理的: 一切的流程控制指令必需到达一个指令的开场,不允许有到达指令内部的分支。类似的,不允许出现到达代码开场前或代码终了后的分

34、支。第第1313章章 移动代码安全移动代码安全 一切的存放器援用必需是援用合法的存放器。除方法指明的所能用的存放器外,代码不能访问和修正任何其它的存放器。 一切对常数存储库的援用必需是援用适当类型的条目。如操作码ldc1只能用于整数、浮点数或string类型,而操作码getfield必需援用一个域。 代码不能在某个指令中间终了。 对每一个异常处置程序,其起始点和终了点都必需指向一个指令的开场。异常处置器的偏移必需是合法的指令;起始点必需在终了点之前。第第1313章章 移动代码安全移动代码安全 对每一条指令,在执行之前,验证器要跟踪堆栈和存放器的内容。对于堆栈,需求知道堆栈的长度和堆栈中元素的类

35、型;对于存放器,需求知道存放器内容的类型或存放器内的值是合法的。在确定堆栈中值的类型时,字节码验证器不需求区分不同的整数类型如byte、short和char。 接下来初始化数据流分析器。对于第一条指令,编号较小的存放器包含方法类型签名所指示的类型;堆栈为空;一切其它的存放器包含非法值;对于其它指令,指示该指令没有被访问,还没有其堆栈或存放器的信息。第第1313章章 移动代码安全移动代码安全 最后,运转数据流分析器。对每一条指令都有一个“changed位来表示这个指令能否需求查看。最初只需第一条指令设置了“changed位。数据流分析器执行如下循环: 1 找到一个设置了“changed位的虚拟机

36、器指令,假设没有找到,那么表示该方法已被验证。清“changed位。 2 仿真指令对堆栈和存放器的影响: 假设指令要运用来自堆栈的值,需确保堆栈中有足够的元素,并且堆栈顶端元素具有适当的类型,否那么,验证失败。第第1313章章 移动代码安全移动代码安全 假设指令运用了存放器,需确保指定的存放器包含了适当类型的值,否那么,验证失败。 假设指令要把值压入堆栈,往堆栈顶端参与指示的类型,需确保堆栈有足够的空间存放新元素。 假设指令需求修正存放器,需阐明存放器当前包含了新的类型。第第1313章章 移动代码安全移动代码安全 3 确定跟随在当前指令后面的虚拟机器指令。后续指令能够是: 假设当前指令不是无条

37、件goto、return或throw,那么为下一条指令;假设可以分开最后一条指令,那么这一步失败。 有条件或无条件转移的目的。 当前指令一切的异常处置程序。第第1313章章 移动代码安全移动代码安全 4 在当前指令的末尾,把堆栈和存放器的形状合并到下一条指令中。在异常处置的情况下,需求更改堆栈使得堆栈包含一个单一的对象,其异常类型由异常处置器信息指明。 假设下一条指令是第一次访问,那么在执行下一条指令之前指明:由第2步和第3步计算得到的堆栈和存放器的值是堆栈和存放器的形状;设置下一条指令的“changed位。 假设指令以前访问过,那么把第2步和第3步计算得到的堆栈和存放器的值合并到已有的值中;

38、假设有改动那么设置“changed位。第第1313章章 移动代码安全移动代码安全 5 回到第1步。 字节流分析器对某些指令和数据类型,如长整数、构建函数、异常处置程序、Try/Finally等的详细验证过程可参考参考资料6。第第1313章章 移动代码安全移动代码安全 13.3.3 Java的沙盒模型 传统的操作系统允许运用程序对机器有完全的访问,因此不能信任运转环境。为此,平安战略普通要求在运转一个程序之前,需求在某种程度上信任程序。如在运转从Web上下载的程序之前,平安战略要求对程序进展病毒检查以及检查源代码以发现恶意代码。这种方法存在两个问题:第第1313章章 移动代码安全移动代码安全 1

39、 建立对运用程序信任的检查在实践操作中非常复杂,且非常费时间。普通人们不会花时间去研读源代码以发现隐藏在其中的恶意行为。 2 要使病毒检查有效,需求及时地维护:病毒库要及时更新、扫描程序要安装在每一台计算机上等等。第第1313章章 移动代码安全移动代码安全 Java采用了一种新的方法:沙盒。Java把Applet的一切操作都严厉限制在一个称之为“沙盒一个由Web阅读器专门为这个Applet分配的地址空间的区域内。Applet在其沙盒内可以做任何事,但超出此边境就不能有任何操作。沙盒模型实现了在一个信任环境中运转不信任的代码的功能。这样,即使用户运转了一个恶意的Applet,也不会给用户带来什么

40、损失。沙盒由几个不同的系统操作组成,下面将逐一引见。第第1313章章 移动代码安全移动代码安全 1类装载程序ClassLoader Java运转时有两种不同的方式来装载一个新的类。其默许机制是从本地机器上的文件中装载一个类,这种机制不需求类装载程序ClassLoader。另一种方式是经过网络等装载一个类,这时需求一个相关的类装载程序ClassLoader,由ClassLoader担任将类的原始数据如网络上传输的字节转化成表示那个类的内部数据构造。第第1313章章 移动代码安全移动代码安全 类装载程序除了要完成从网络上获得一个Applet的可执行代码外,还施行了命名空间的体系构造。一个命名空间规

41、定了一个Applet能访问JVMJava虚拟机的其它哪些部分。经过为本地磁盘上的可信任代码维护一个单独的命名空间,类装载程序可以防止不可信的Applet获得对系统可信部分往往需求更多特权才干访问的访问权。 从网络上下载的Applet不能创建其本人的类装载程序,也不能调用系统类装载程序中的方法。第第1313章章 移动代码安全移动代码安全 2验证器 在运转一个新下载的Applet之前,类装载程序要调用验证器进展类文件验证。 3平安管理器 平安管理器加强沙盒的边境。在Applet试图执行能够导致本地机器解体或访问信息的操作时,JVM首先向平安管理器讯问此操作能否可以平安地执行。只需平安管理器准许了这

42、项操作,虚拟机才干执行,否那么,虚拟机将产生一个平安异常并向Java控制台写出错信息。第第1313章章 移动代码安全移动代码安全 下面列举了平安管理器制止不可信Applet执行的部分操作: 对本地文件的读写; 删除文件; 执行操作系统命令或本地代码; 载入一个直接调用本地方法的新的动态库; 与不是此Applet源主机的机器建立衔接; 建立一个新的进程。第第1313章章 移动代码安全移动代码安全 一个运用程序或Web阅读器只能有一个平安管理器,这可保证一切的访问检查都是由一个执行单一平安战略的平安管理器来完成的。平安管理器在启动时载入,它不能被扩展、重载或替代。显然,Applet不能创建其本身的

43、平安管理器。 4言语特性 在Java底层平安性实现一节中,我们可以看出,Java具有许多可以维护平安系统完好性,并防止某些常见攻击的特性。 第第1313章章 移动代码安全移动代码安全 13.3.4 扩展Java平安 Java沙盒模型可以维护终端用户机器和网络计算资源不受恶意Applet的破坏和进展信息窃取,从而用户可以运转来自网络上的不可信代码而不会有平安风险。但是沙盒模型没有涉及其它的一些平安和严密性问题: 认证可以协助确认一个Applet确实来自其声明的主机; 数字签名和认证过的Applet可以提升为可信Applet,从而可以在较少的平安限制前提下运转; 加密可以保证Applet客户端和I

44、nternet上效力器之间传输数据的性。 第第1313章章 移动代码安全移动代码安全 1签署JAR文件 一切的网络化系统都容易遭到潜在的中间人攻击。在这种攻击中,客户端与网络上的合法效力器进展衔接并恳求某种操作;而攻击者,即这里所说的中间人窃听到这些恳求后就等待效力器的呼应,然后截获呼应并向客户端发送一个伪造的应对;这时客户端就会根据这些伪造的信息进展某种操作,或者运转攻击者提供的程序而使攻击者获得对机器的访问权。如攻击者可察看一个基于Internet的银行站点;当客户端访问其提供付款效力的页面时,攻击者就可以截获银行的呼应,而把一个可以模拟银行效力并可窃取用户信誉卡副本和银行账号的恶意App

45、let作为呼应发送给客户。 第第1313章章 移动代码安全移动代码安全 经过对Applet运用“数字签名可以阻止这种攻击。首先,把一切Java代码和相关文件捆绑成一个Java档案JAR;然后根据JAR的内容利用数字签名算法产生一个用字符串表示的数字签名。经过验证其数字签名就可以确定这个JAR的来源,从而有效地防止了中间人攻击。 JAR文件从某种程度上还可协助处理另外一个问题。目前,许多Java Applet需求很长时间才干下载下来。这和当前的Internet协议有关。 第第1313章章 移动代码安全移动代码安全 目前的Internet协议每次只恳求和传送一个文件,每恳求一个文件需求一定的开销,

46、而一个页面和Java Applet普通都由许多小文件组成,从而能够使得恳求文件和等待呼应的时间比真正传输信息的时间还要长。采用JAR文件后,把Applet和Web页所需求的一切信息捆绑成一个文件,从而恳求整个页面就只需求一个恳求。对于大部分的页面,这可大大减少下载时间。第第1313章章 移动代码安全移动代码安全 2灵敏的战略 数字签名可以赋予Java Applet某种可信度,从而可以放宽对某些Applet的Java平安限制。如上面提到的家庭银行Applet,假设采用了数字签名,它就可以在用户硬盘上建立本人目录以存储账号、信誉卡号、口令、个人身份号码PIN和其它经常要用的信息,这时的终端用户不用

47、经常性地重输这些信息。第第1313章章 移动代码安全移动代码安全 数字签名过的Applet可以创建本人的环境。假设终端用户已提早指示Java系统某个特定的Web发布者是可信的,而且某个来自此Web发布者并签名了的Applet被验证经过,那么Java平安管理器就可允许这个Applet的操作超出其沙盒的范围,也就是说,把这个Applet看成一个普通的运用程序。第第1313章章 移动代码安全移动代码安全 平安管理器还可以根据对特定Web发布者的信任程度或对整个Internet的信任程度而执行不同的控制战略。如一个平安认识很强的用户能够将系统配置成签名了的Applet只能在沙盒范围内执行;未签名的Ap

48、plet根本就不允许执行。另外一个用户能够将系统配置成银行Applet只能访问硬盘上的某个特定目录,而一个网络游戏Applet可以访问另外一个目录,同时一切其它的Applet只能在沙盒的范围内执行。第第1313章章 移动代码安全移动代码安全 3审计 审计是另一个重要的平安要素。审计软件将维护系统上发生的每一件事的记录。当出现错误时无论是偶尔还是由于bug,或者是由于攻击呵斥的,系统管理员和平安人员就可以根据审计迹推测出所发生的事,从而可以协助他们确定如何防止错误的再次发生。虽然审计不能阻止事故和攻击,但在错误发生后,它是把事情弄清楚的重要工具。 目前版本的Java审计功能很有限,还没有管理员可

49、以依赖的审计才干,而且其记录的特征很不详细。第第1313章章 移动代码安全移动代码安全 4加密 虽然沙盒模型和对Applet的数字签名可以阻止恶意Applet的破坏和中间人攻击,但在Internet上,Applet和效力器之间的信息传输依然易遭到窃听。这是由于Internet本身就是一个不平安的传输煤质。攻击者在Internet的关键点可以获得经过该关键点的一切的信息。由此,攻击者可以侦听出入一个银行的一切流量,也可以只获取经过的信誉卡号和其它一些信息。为了防止这种攻击,我们需求对Applet和效力器之间的一切流量进展加密,从而使它不可读。第第1313章章 移动代码安全移动代码安全 13.3.

50、5 Java平安开发建议 虽然Sun声称Java是一种平安言语,而且Java也采用了一些平安构造以及内建了一些平安特性,但是Java仍无法防止平安问题,其运用程序中仍存在大量的平安破绽和隐患。为了运用Java开发平安的程序,可参考以下建议101112。第第1313章章 移动代码安全移动代码安全 1 限制对类、方法和变量的访问 把类、方法和变量声明为公有会给攻击者提供潜在的入口。为此:a 不要运用公共域或变量,把它们声明为私有的,并提供访问函数以限制对它们的访问;b 除非有很好的理由,否那么把方法都设为私有的假设确实没这样做,说清楚其理由。非私有的方法能够会接纳受污染的数据,因此必需维护这些方法

51、除非曾经用其它方式对它们进展了维护。第第1313章章 移动代码安全移动代码安全 2 防止运用静态域变量 静态域变量是附着在类而非类的实例上,而类可以被其它类所定位,其结果就是可以经过其它类找到静态域变量,这就很难保证它们的平安。 3 永远不要把可变对象前往给潜在的有恶意代码由于代码能够会改动它 留意,数组是可变的即使数组的内容不可变,所以不要前往一个含有敏感数据的内部数组的援用。第第1313章章 移动代码安全移动代码安全 4 永远不要直接保管用户给定的可变对象包括对象的数组 假设直接保管用户给定的可变对象,用户可以把对象交给平安代码,让平安代码“检查对象,并在平安代码试图运用数据时改动数据。应

52、该在内部存储数组前复制它们,而且要小心例如,警惕用户编写的复制例程。第第1313章章 移动代码安全移动代码安全 5 不要依赖于初始化 许多Java开发人员以为假设不运转构建器就无法为一个对象分配内存,这是不对的,现实上有许多方法可以为未初始化的对象分配内存。防止这个问题的一个简一方法就是书写本人的类,从而在对象进展某项操作前验证对象。其做法为 使一切的变量为私有。假设要允许外部代码访问一个对象内的变量,可以经过set和get方法来实现这就使外部代码不能访问未初始化的对象。第第1313章章 移动代码安全移动代码安全 为每一个对象添加一个新的私有布尔变量initialized。 在前往之前让每一个

53、构建器设置初始化的变量作为最后一个操作。 在进展进一步操作之前,让每一个nonconstructor方法验证initialized为真。第第1313章章 移动代码安全移动代码安全 假设本人书写的类具有静态的初始化程序,那么需求在类的层次做同样的操作。也就是说,对于任何一个具有静态初始化程序的类,需求: 使一切的静态变量私有。假设要允许外部代码访问类中的静态变量,可以经过静态set和get方法来实现这就使外部代码不能访问未初始化的静态变量。第第1313章章 移动代码安全移动代码安全 为类添加一个新的私有静态布尔变量classInitialized。 在前往之前让静态构建器设置初始化的变量作为最后

54、一步操作。 在进展进一步操作之前,让每一个静态方法和每一个构建器验证classInitialized为真。第第1313章章 移动代码安全移动代码安全 6 除非有很好的理由,否那么使每件事都final终结 假设某个类或方法不是final的,攻击者就可以用某种危险且无法预知的方法来扩展它。留意,作为平安性的交换,这会带来可扩展性的丧失。 7 不要在平安性上依赖包的范围 在同一个包内可以访问没有明确标志为public、private或protected的类、方法和变量。Java类不是封锁的,因此,攻击者可以向包中引入一个新类,并用此新类来访问用户以为维护了的信息。某些类,如java.lang,缺省是

55、封锁的,而且某些Java虚拟机JVM会让用户封锁其它包,但最好假设包不是封锁的。第第1313章章 移动代码安全移动代码安全 8 不要运用内部类 有些Java言语的书上称只需封装内部类的类才可以访问被封装的内部类,这是不正确的,由于Java字节码没有内部类的概念,在内部类转换为字节代码时,会被转换为这个包中恣意代码可以访问的类。更糟的是,被封装类的私有域会静悄然地变成非私有的,从而允许内部类访问!第第1313章章 移动代码安全移动代码安全 9 最小化特权和防止标志代码 运转没有标志的代码不需求任何专门的特权。没有专门特权的代码不会带来什么危害,为此应防止标志代码。但是有时代码需求获得和运用特权以

56、执行某种危险的操作,此时应使代码特权最小化,同时应更仔细地审阅特权代码。 第第1313章章 移动代码安全移动代码安全 10 假设一定要标志代码,应该把它们都放在一个档案文件里 此规那么的目的是防止攻击者运用混合匹配攻击。在混合匹配攻击中,攻击者构建新Applet或库,把某些标志类与有恶意的类衔接在一同,或把根本认识不到会被一同运用的标志类衔接在一同。经过把一组类标志在一同,就可以使这种攻击更高明。现有的代码标志系统在防止混合匹配攻击上做得还不够,所以这一规那么还不能完全防止此类攻击。但运用单个档案没什么害处。第第1313章章 移动代码安全移动代码安全 11 使类不可被复制 Java的类复制机制允许攻击者不运转构建函数就实例化

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论