您好,欢迎访问三七文档
Java安全编程(BadExamplesfoundinJDK)MarcSchönefeld,UniversityofBambergIllegalaccess.org关于演讲者MarcSchönefeld,Diplom-WirtschaftsinformatikerForScience:Externaldoctoralstudent@LehrstuhlfürpraktischeInformatikatUniversityofBamberg,Bavaria,Germany课题项目:REFACTORINGOFSECURITYANTIPATTERNSINDISTRIBUTEDJAVACOMPONENTSForLiving:DepartmentforOperationalSecurityManagementatcomputingsiteforlargefinancialgroupinGermanyJava,J2EE,CORBA[CSMR2002]设计和开发安全加固(代码审核)情形Java(我们这里讨论适用于J2SE,一些方面也适用于J2EE)被设计成一种具有与生俱来安全特性的编程语言[Gong,Oaks]JVM级:类型安全(TypeSafety),字节码完整性检测(Bytecodeintegritychecks)API级:SecurityManager,ClassLoader,CertPath,JAAS加密支持:JCA/JCE,JSSE所以,什么会是问题呢?一些2003/2004年的Java安全警告Java运行时环境(RuntimeEnvironment)可能允许非受信Applets提升权限JavaMediaFramework(JMF)中的一个漏洞,可能导致Java虚拟机(JVM)崩溃…JavaRuntimeEnvironment远程拒绝服务攻击漏洞(DoS)…尽管存在JAVA安全体系的先天防护,还是有许多潜在的攻击可能性…是什么原因导致的呢?FL2FL3幻灯片4FL2警告FlierLu,2005-8-16FL3不被信任FlierLu,2005-8-16问题一个平台(象Javaruntimeenvironment)只能提供对程序员意图的支持什么是程序员的意图?表现出不同的观点…功能[应用程序员]Java有一套很强大的预定义的API函数(sockets,files,…)质量和重用[中间件程序员]Java在不同的语义级别提供通讯和编组(marshalling)能力(Sockets,RMI,CORBA,Raw-Serialisation,XML-Serialisation,…)安全性[安全架构师]Java在沙箱(sandbox)外提供隔离、加密和安全Sockets等支持恶意的意图[敌人]通过找到弱点来破坏安全JavaVM和核心的lib库有(许多?)漏洞Classloaders和保护域为什么在JAVA代码中找安全漏洞?基于组件的软件开发第三方的中间件组件(web服务器,图像库,PDF生成,…)随处可见我们在受信任的地方(根类型加载器bootclassloader)重用它们但是我们真的能信任它们吗?疑问:我的第三方图像库中是否存在可能被攻击者利用的存在漏洞的对象实现?JDK是否把我隔离存放的机密XML数据,与其他存在恶意代码的applets加载到同一个JVM中?对象序列化(serialisation)真的安全么?J2EE多层应用类型J2EE多层攻击类型EvilTwinAttack数据注入攻击(SQL,遗留格式)拒绝服务攻击,恶意序列化数据Java安全模式Sun的安全编码指导方针(最后更新于2000年2月2日!):1.小心使用特权代码2.小心处理静态字段3.最小化作用域(scope)4.小心选择公共(public)方法和字段5.适当的包(package)保护性6.尽可能使用不可变(immutable)对象7.永远不要返回对包含敏感数据的内部数组的引用8.永远不要直接存储用户提供(user-supplied)的数组9.小心使用序列化(Serialization)10.小心使用本地方法(nativemethods)11.清除敏感信息安全反模式忽略那些安全模式的代码不经意间就会造成漏洞典型的Java安全编码反模式(Antipatterns):忽略语言特性(例如整数溢出(IntegerOverflow))不注意使用序列化,不注意使用特权代码将字段和方法定义到不适当的可见性作用域在非终态(non-final)静态字段中的隐蔽通道(CovertChannels)他们隐藏在你自己的代码和你使用的库中出于学术兴趣,我们审查了SunJDK1.4.x的部分代码,下面将介绍我们的发现:如何在JAVA代码中找安全隐患?测试程序是否需要已指定的许可权限,在逆向分析受保护域时很有用。jChains()策略评估工具字节码检测器(访问者模式):预定义(软件质量)自定义(安全审计)Findbugs(基于ApacheBCEL)字节码审计分析器耗时的分析工作,且需要经验JAD(!),JODE反编译器只在源代码完全可用情况下有用[大部分情况不是这样的]PMD,Checkstyle源代码检测工具字节码分析器以下讨论基于JVM字节码分析器Findbugs()针对java代码检测bug模式的静态检测器(detector)由马里兰大学开发(Puth和Hovemeyer)开源项目基于BCEL(ApacheBytecodeEngineeringLibrary)通过访问者模式分析:类的结构与继承控制和数据流GUI/命令行界面可扩展,允许编写自己的检测器Java安全反模式反模式(错误,缺陷)在受信代码中(例如rt.jar)导致漏洞出现可用性:AP1:整数溢出,未知类型(java.util.zip.*)AP2:序列化(Serialisation)的副作用(java.io.*)完整性:AP3:特权代码副作用(引诱打破沙箱的攻击)AP4:不恰当的作用域(违反访问控制)AP5:非终态静态变量(在applets之间的隐蔽通道)机密性:AP6:重用非安全组件(org.apache.*,在applets间嗅探私有的XML数据)目标:定义一个二进制审计工具集,用来在你自己的代码和你使用的库中检测反模式以修复安全漏洞。Java反模式1:整数溢出如blexim(Phrack#60)所述,整数溢出在C/C++中是个严重的问题,在Java中也同样如此:所有Java整数被限制在[-231,+231-1]的范围内在Java中,以下成立:-231=231+1沉默溢出(SilentOverflow)是问题所在:因为符号改变不会被报告给用户,也没有JVM标志被设置JDK1.4.1_01代码是基于这样一个错误的假设:java整数是极大的。这将导致在java.util.zip包产生一系列的安全问题Java反模式1:整数溢出下列调用当参数xyx,y≥0时,会导致崩溃tuple(newbyte[0],x,Integer.MAX_VALUE-y)è可通过愚弄参数检查,来使在受信JDK函数中的数据沉默溢出(silentoverflow),所以核心lib库和JVM都检测不到该溢出。è本地方法调用——updateBytes访问字节数组将导致一个非法内存访问错误.通常JVM会崩溃。D:\javaCRCCrashAnunexpectedexceptionhasbeendetectedinnativecodeoutsidetheVM.UnexpectedSignal:EXCEPTION_ACCESS_VIOLATIONoccurredatPC=0x6D3220A4Function=Java_java_util_zip_ZipEntry_initFields+0x288Library=c:\java\1.4.1\01\jre\bin\zip.dllCurrentJavathread:atjava.util.zip.CRC32.updateBytes(NativeMethod)atjava.util.zip.CRC32.update(CRC32.java:53)atCRCCrash.main(CRCCrash.java:3)Dynamiclibraries:0x00400000-0x00406000c:\java\1.4.1\01\jre\bin\java.exe[...linesomitted...]0x76BB0000-0x76BBB000C:\WINDOWS\System32\PSAPI.DLLLocalTime=MonMar1714:57:472003Java反模式1:整数溢出CRC32类允许计算缓冲区的校验和:假如有一个字节缓冲区(1,2,3,4),要计算它的校验和,你需要调用:CRC32c=newjava.util.zip.CRC32();c.update(newbyte[]{1,2,3},0,3);但是,在你做以下操作的时候:c.update(newbyte[0],4,Integer.MAX_VALUE-3);将导致JDK1.4.1_01和JDK1.3.1等版本的JVM崩溃Java反模式1:整数溢出,风险和范围风险:假如攻击者能在一个多用户共享JVM的环境中(例如Domino服务器或TomcatHTTP服务器)利用那些函数的话,那么就能造成拒绝服务攻击范围:更多受信函数被发现有漏洞:java.util.zip.Adler32().update();java.util.zip.Deflater().setDictionary();java.util.zip.CRC32().update();java.util.zip.Deflater().deflate();java.util.zip.CheckedOutputStream().write();java.util.zip.CheckedInputStream().read();java.text.Bidi.init;={4811913,4812181,4812006,4811927,4811917,4982415,4944300,4827312,4823885}Java反模式1:整数溢出,重构publicvoidupdate(byte[]b,intoff,intlen){if(b==null){thrownewNullPointerException();}if(off0||len0||offb.length-len){thrownewArrayIndexOutOfBoundsException();}crc=updateBytes(crc,b,off,len);}AfterJDK1.4.102publicvoidupdate(byte[]b,intoff,intlen){if(b==null){thrownewNullPointerException();}if(off0||len0||off+lenb.length){thrownewArrayIndexOutOfBoundsException();}crc=updateBytes(crc,b,off,len);}BeforeJDK1.4.101Java反模式1:整数溢出,重构(字节码)12:iload_213:iflt2816:iload_317:iflt2820:iload_221:aload_122:arraylength23:iload_324:isub25:if_icmple36After(1.4.1_02)12:iload_213:if
本文标题:java安全编程
链接地址:https://www.777doc.com/doc-4890133 .html