38
Control Hijacking Control Hijacking: Defenses

Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

ControlHijacking

ControlHijacking:Defenses

Page 2: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Recap:controlhijackingattacksStacksmashing:overwritereturnaddressorfunctionpointer

Heapspraying:reliablyexploitaheapoverflow

Useafterfree:attackerwritestofreedcontrolstructure,whichthengetsusedbyvictimprogram

Integeroverflows

Formatstringvulnerabilities

Page 3: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Themistake:mixingdataandcontrol• Anancientdesignflaw:

– enablesanyonetoinjectcontrolsignals

• 1971:AT&Tlearnsnevertomixcontrolanddata

Page 4: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

ControlhijackingattacksTheproblem:mixingdatawithcontrolflowinmemory

localvariables SFP ret

addr arguments

stackframedataoverwritesreturnaddress

LaterwewillseethatmixingdataandcodeisalsothereasonforXSS:acommonwebvulnerability

Page 5: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Preventinghijackingattacks1. Fixbugs:

– Auditsoftware• Automatedtools:Coverity,Prefast/Prefix.

– Rewritesoftwareinatypesafelanguange (Java,ML)• Difficultforexisting(legacy)code…

2. Platformdefenses:preventattackcodeexecution

3. Addruntimecode todetectoverflowsexploits– Haltprocesswhenoverflowexploitdetected– StackGuard,CFI,LibSafe,…

Transform:

CompleteBreach

Denialofservice

Page 6: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

ControlHijacking

PlatformDefenses

Page 7: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Markingmemoryasnon-execute(DEP)

Preventattackcodeexecutionbymarkingstackandheapasnon-executable

• NX-bit on AMD Athlon 64, XD-bit on Intel P4 Prescott– NXbitineveryPageTableEntry(PTE)

• Deployment:– Linux(viaPaX project);OpenBSD– Windows:sinceXPSP2(DEP)

• VisualStudio:/NXCompat[:NO]

• Limitations:– Someappsneedexecutableheap(e.g.JITs).– Canbeeasilybypassed usingReturnOrientedProgramming(ROP)

Page 8: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Examples:DEPcontrolsinWindows

DEPterminatingaprogram

Page 9: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Attack:ReturnOrientedProgramming(ROP)

Controlhijackingwithoutinjectingcode:

argsret-addr

sfp

local buf

stack

exec()printf()

“/bin/sh”

libc.so

Page 10: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

ROP:inmoredetailTorun/bin/sh wemustdirectstdin andstdout tothesocket:

dup2(s,0) //mapstdin tosocketdup2(s,1) //mapstdout tosocketexecve("/bin/sh", 0, 0);

Gadgets invictimcode: dup2(s,1)ret

dup2(s,0)ret

execve("/bin/sh") ret

Stack(setbyattacker): overflow-str 0x4084000x4085000x408300

Stackpointermovesuponpop

ret-addr

Page 11: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

ROP:inevenmoredetaildup2(s,0) implementedasasequenceofgadgetsinvictimcode:

Stack(byattacker):

poprdiret

overflow-str 0x408100s0x40820000x408300330x408400

poprsiret

popraxret

syscallret

0x408100 0x408200 0x408300 0x408400

ret-addr (rdi⟵ s) (rsi⟵ 0) (rax⟵ 33)syscall #33

5fc3

5ec3

Page 12: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Whattodo?? Randomization• ASLR:(AddressSpaceLayoutRandomization)

– Mapsharedlibrariestorandlocationinprocessmemory⇒ Attackercannotjumpdirectlytoexecfunction

– Deployment:(/DynamicBase)• Windows 7: 8bitsofrandomnessforDLLs

– alignedto64Kpageina16MBregion⇒ 256choices• Windows8: 24bitsofrandomnesson64-bitprocessors

• Otherrandomizationmethods:– Sys-callrandomization:randomizesys-callid’s– InstructionSetRandomization(ISR)

Page 13: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

ASLRExampleBooting twice loads libraries into different locations:

Note:everythinginprocessmemorymustberandomizedstack, heap, sharedlibs, baseimage

• Win8ForceASLR:ensuresallloadedmodulesuseASLR

Page 14: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Averydifferentidea:kBouncer

Observation:abnormalexecutionsequence• ret returnstoanaddressthatdoesnotfollowacall

Idea:beforeasyscall,checkthateverypriorretisnotabnormal• How:useIntel’sLastBranchRecording(LBR)

poprdiret

poprsiret

popraxret

syscallret

kernel

kBouncer

Page 15: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Averydifferentidea:kBouncer

Inte’s LastBranchRecording(LBR):• store16lastexecutedbranchesinasetofon-chipregisters(MSR)• readusingrdmsr instructionfromprivilegedmode

kBouncer:beforeenteringkernel,verifythatlast16retsarenormal• Requiresnoapp.codechanges,andminimaloverhead• Limitations:attackercanensure16callspriortosyscall arevalid

poprdiret

poprsiret

popraxret

syscallret

kernel

kBouncer

Page 16: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

ControlHijackingDefenses

Hardeningtheexecutable

Page 17: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Runtimechecking:StackGuard• Manyrun-timecheckingtechniques…

– weonlydiscussmethodsrelevanttooverflowprotection

• Solution1:StackGuard– Runtimetestsforstackintegrity.– Embed“canaries”instackframesandverifytheirintegritypriortofunctionreturn.

strretsfplocaltopof

stackcanarystrretlocal canaryFrame1Frame2

sfp

Page 18: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

CanaryTypes• Randomcanary:

– Randomstringchosenatprogramstartup.– Insertcanarystringintoeverystackframe.– Verifycanarybeforereturningfromfunction.

• Exitprogramifcanarychanged.TurnspotentialexploitintoDoS.– Tocorrupt,attackermustlearncurrentrandomstring.

• Terminatorcanary: Canary={0,newline,linefeed,EOF}

– Stringfunctionswillnotcopybeyondterminator.– Attackercannotusestringfunctionstocorruptstack.

Page 19: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

StackGuard(Cont.)• StackGuard implementedasaGCCpatch

– Programmustberecompiled

• Minimalperformanceeffects:8%forApache

• Note:Canariesdonotprovidefullprotection– Somestacksmashingattacksleavecanariesunchanged

• Heapprotection:PointGuard– Protectsfunctionpointersandsetjmp buffersbyencryptingthem:

e.g.XORwithrandomcookie– Lesseffective,morenoticeableperformanceeffects

Page 20: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

StackGuard enhancements:ProPolice• ProPolice (IBM) - gcc 3.4.1. (-fstack-protector)

– Rearrangestacklayouttopreventptr overflow.

argsretaddrSFP

CANARYlocalstringbuffers

localnon-buffervariablesStackGrowth pointers,butnoarrays

StringGrowth

copyofpointerargs

Protectspointerargs andlocalpointersfromabufferoverflow

Page 21: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

MSVisualStudio/GS[since2003]Compiler/GSoption:

– CombinationofProPolice andRandomcanary.– Ifcookiemismatch,defaultbehavioristocall_exit(3)

Functionprolog:subesp,8//allocate8bytesforcookiemov eax,DWORDPTR___security_cookiexor eax,esp //xor cookiewithcurrentespmov DWORDPTR[esp+8],eax //saveinstack

Functionepilog:mov ecx,DWORDPTR[esp+8]xor ecx,espcall@__security_check_cookie@4addesp,8

Enhanced/GSinVisualStudio2010:– /GSprotectionaddedtoallfunctions,unlesscanbeprovenunnecessary

Page 22: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

/GSstackframeargs

retaddrSFP

CANARYlocalstringbuffers

localnon-buffervariablesStackGrowth pointers,butnoarrays

StringGrowth

copyofpointerargs

exceptionhandlers

Canaryprotectsret-addr andexceptionhandlerframe

Page 23: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Evading/GSwithexceptionhandlers• Whenexceptionisthrown,dispatcherwalksupexceptionlist

untilhandlerisfound(elseusedefaulthandler)

highmemnext handlernext handlernext handler

0xffffffff

buf

SEHframeSEHframe

Afteroverflow:handlerpointstoattacker’scodeexceptiontriggered⇒ controlhijack

ptr toattackcode

Mainpoint:exceptionistriggeredbeforecanaryischecked

next

Page 24: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Defenses:SAFESEHandSEHOP• /SAFESEH:linkerflag

– Linkerproducesabinarywithatableofsafeexceptionhandlers– Systemwillnotjumptoexceptionhandlernotonlist

• /SEHOP:platformdefense(sincewinvistaSP1)– Observation:SEHattackstypicallycorruptthe“next”entryinSEHlist.– SEHOP:addadummyrecordattopofSEHlist– Whenexceptionoccurs,dispatcherwalksuplistandverifiesdummy

recordisthere.Ifnot,terminatesprocess.

Page 25: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Summary:Canariesarenotfullproof• Canariesareanimportantdefensetool,butdonotpreventall

controlhijackingattacks:

– Heap-basedattacksstillpossible

– Integeroverflowattacksstillpossible

– /GSbyitselfdoesnotpreventExceptionHandlingattacks(alsoneedSAFESEHandSEHOP)

Page 26: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Evenworse:canaryextractionA commondesignforcrashrecovery:• Whenprocesscrashes,restartautomatically(foravailability)• Oftencanaryisunchanged(reason:relaunchusingfork)

Danger:• canaryextraction

bytebybyteretaddrCANARYlocal

buffer⋯

retaddrCANARYlocal

buffer⋯

retaddrCANARYlocal

buffer⋯retaddrCANARYlocal

buffer⋯

A

B

C

CA

crash

crash

Nocrash

Nocrash

Page 27: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Similarly:extractASLRrandomnessA commondesignforcrashrecovery:• Whenprocesscrashes,restartautomatically(foravailability)• Oftencanaryisunchanged(reason:relaunchusingfork)

Danger:Extractret-addr tode-randomizestacklocationExtractstackfunctionpointerstode-randomizeheap

retaddrCANARYlocal

buffer⋯

retaddrCANARYlocal

buffer⋯

retaddrCANARYlocal

buffer⋯retaddrCANARYlocal

buffer⋯

A

B

C

CA

crash

crash

Nocrash

Nocrash

Page 28: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Whatifcan’trecompile:Libsafe• Solution2:Libsafe (AvayaLabs)

– Dynamicallyloadedlibrary(noneedtorecompileapp.)

– Interceptscallstostrcpy (dest,src)• Validatessufficientspaceincurrentstackframe:

|frame-pointer– dest|>strlen(src)

• Ifso,doesstrcpy. Otherwise,terminatesapplication

destret-addrsfptopof

stacksrc buf ret-addrsfp

Libsafe strcpy main

Page 29: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

HowrobustisLibsafe?

strcpy()canoverwriteapointerbetweenbuf andsfp.

destret-addrsfphigh

memorysrc buf ret-addrsfp

Libsafe strcpy main

lowmemory

Page 30: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Moremethods…Ø StackShield

§ Atfunctionprologue,copyreturnaddressRET andSFP to“safe”location(beginningofdatasegment)

§ Uponreturn,checkthatRET andSFP isequaltocopy.§ Implementedasassemblerfileprocessor(GCC)

Ø ControlFlowIntegrity (CFI)§ Acombinationofstaticanddynamicchecking

§ Staticallydetermineprogramcontrolflow§ Dynamicallyenforcecontrolflowintegrity

Page 31: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Controlflowintegrity(CFI)[ABEL’05,…]UltimateGoal: ensurecontrolflowsasspecifiedbycode’sflowgraph

LotsofacademicresearchonCFIsystems:• CCFIR(2013), kBouncer (2013),FECFI(2014),CSCFI(2015),…andmanyattacks…

void HandshakeHandler(Session *s, char *pkt) {...s->hdlr(s, pkt)

}Compiletime:buildlistofpossiblecalltargets

Runtime:beforecall,checkvalidityofs->hdlr

Page 32: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

ControlFlowGuard(CFG)(Windows10)

Poorman’sversionofCFI:• Protectsindirectcallsbycheckingagainstabitmaskofallvalid

functionentrypointsinexecutable

ensurestargetistheentrypointofafunction

Page 33: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

ControlFlowGuard(CFG)(Windows10)

Poorman’sversionofCFI:• Protectsindirectcallsbycheckingagainstabitmaskofallvalid

functionentrypointsinexecutable

ensurestargetistheentrypointofafunction

• Doesnotpreventattackerfromcausingajumptoavalidwrong function

• Hardtobuildaccuratecontrolflowgraphstatically

Page 34: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

AnexamplevoidHandshakeHandler(Session*s,char*pkt){

s->hdlr =&LoginHandler;...BufferoverflowinSessionstruct...

}

voidLoginHandler(Session*s,char*pkt){boolauth =CheckCredentials(pkt);s->dhandler =&DataHandler;

}

voidDataHandler(Session*s,char*pkt);

Attackercontrolshandler

StaticCFI:attackercancallDataHandler tobypassauthentication

Page 35: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

CryptographicControlFlowIntegrity(CCFI)Threatmodel: attackercanread/writeanywhere inmemory,

programshouldnotdeviatefromitscontrolflowgraph

CCFIapproach:Everytimeajumpaddressiswritten/copiedanywhereinmemory:compute64-bitAES-MACandappendtoaddress

Onheap: tag=AES(k,(jump-address,0ll source-address))onstack: tag=AES(k,(jump-address,1ll stack-frame))

Beforefollowingaddress,verifyMACandcrashifinvalid

Wheretostorekeyk?Inxmm registers(notmemory)

Page 36: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

BacktotheexamplevoidHandshakeHandler(Session*s,char*pkt){

s->hdlr =&LoginHandler;...BufferoverflowinSessionstruct...

}

voidLoginHandler(Session*s,char*pkt){boolauth =CheckCredentials(pkt);s->dhandler =&DataHandler;

}

voidDataHandler(Session*s,char*pkt);

Attackercontrolshandler

CCFI:AttackercannotcreateavalidMACforDataHandler address

Page 37: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

Referencesonheapspraying[1] HeapFeng Shui inJavascript,

byA.Sotirov,Blackhat Europe2007

[2] EngineeringHeapOverflowExploitswithJavaScriptM.Daniel,J.Honoroff,andC.Miller,WooT 2008

[3] Nozzle:ADefenseAgainstHeap-sprayingCode InjectionAttacks,byP.Ratanaworabhan,B.Livshits,andB.Zorn

[4] InterpreterExploitation:PointerinferenceandJiT spraying,byDionBlazakis

Page 38: Control Hijacking: Defenses - Stanford University€¦ · kBouncer: before entering kernel, verify that last 16 rets are normal • Requires no app. code changes, and minimal overhead

DanBoneh

THEEND