What is tamperproofing? Ensure that a program executes as intended, - - PowerPoint PPT Presentation

what is tamperproofing
SMART_READER_LITE
LIVE PREVIEW

What is tamperproofing? Ensure that a program executes as intended, - - PowerPoint PPT Presentation

What is tamperproofing? Ensure that a program executes as intended, even in the presence of an adversary who tries to disrupt, monitor, or change the execution. A tamperproofing algorithm 1 makes tampering difficult 1/78 What is


slide-1
SLIDE 1

What is tamperproofing?

Ensure that a program executes as intended, even in the presence of an adversary who tries to disrupt, monitor, or change the execution. A tamperproofing algorithm

1 makes tampering difficult

1/78

slide-2
SLIDE 2

What is tamperproofing?

Ensure that a program executes as intended, even in the presence of an adversary who tries to disrupt, monitor, or change the execution. A tamperproofing algorithm

1 makes tampering difficult 2

detects when tampering has occured

1/78

slide-3
SLIDE 3

What is tamperproofing?

Ensure that a program executes as intended, even in the presence of an adversary who tries to disrupt, monitor, or change the execution. A tamperproofing algorithm

1 makes tampering difficult 2

detects when tampering has occured

3

responds to the attack

1/78

slide-4
SLIDE 4

What are typical attacks and defenses?

An attacker typically modifies the program with the intent to force it to chose a different execution path than the programmer intended:

1 remove code from and/or insert new code into the

executable file prior to execution;

2/78

slide-5
SLIDE 5

What are typical attacks and defenses?

An attacker typically modifies the program with the intent to force it to chose a different execution path than the programmer intended:

1 remove code from and/or insert new code into the

executable file prior to execution;

2 remove code from and/or insert new code into the

running program;

2/78

slide-6
SLIDE 6

What are typical attacks and defenses?

An attacker typically modifies the program with the intent to force it to chose a different execution path than the programmer intended:

1 remove code from and/or insert new code into the

executable file prior to execution;

2 remove code from and/or insert new code into the

running program;

3 affect the runtime behavior of the program through external

agents such as emulators, debuggers, or a hostile operating system.

2/78

slide-7
SLIDE 7

Algorithms

1

introspection, i.e. tamperproofed programs which monitor their own code to detect modifications.

3/78

slide-8
SLIDE 8

Algorithms

1

introspection, i.e. tamperproofed programs which monitor their own code to detect modifications.

2 various kinds of response mechanisms.

3/78

slide-9
SLIDE 9

Algorithms

1

introspection, i.e. tamperproofed programs which monitor their own code to detect modifications.

2 various kinds of response mechanisms. 3

  • blivious hashing algorithms which examine the state of the

program for signs of tampering.

3/78

slide-10
SLIDE 10

Algorithms

1

introspection, i.e. tamperproofed programs which monitor their own code to detect modifications.

2 various kinds of response mechanisms. 3

  • blivious hashing algorithms which examine the state of the

program for signs of tampering.

4

remote software authentication — determine that a program running on a remote machine has not been tampered with (WoW problem).

3/78

slide-11
SLIDE 11

Outline

1

Definitions

2

Introspection Checker Network

3

The Skype obfuscated protocol

4

Attacking self-hashing algorithms

5

State inspection Overlapping instructions

6

Response Mechanisms

7

Discussion

Definitions 4/78

slide-12
SLIDE 12

CS Input args

  • Env. variables

Registers Static data Stack Heap CHECK(){ return (Inv1)&& (Inv2)&& (Inv3); } OS Dynamic libs P Dynamic linker FS Dynamic linker RESPOND CHECK RESPOND CHECK RESPOND CHECK RESPOND CHECK RESPOND CHECK PS Emulator HW OS NW Debugger Boot loader P’s code Dynamic Libs RESPOND(){ if (!CHECK()) report(); restore(); abort(); }

slide-13
SLIDE 13

How does the adversary attack P?

1

Modify files:

P’s executable file dynamic linker dynamic libraries

Definitions 6/78

slide-14
SLIDE 14

How does the adversary attack P?

1

Modify files:

P’s executable file dynamic linker dynamic libraries

2 Modify the operating system

Definitions 6/78

slide-15
SLIDE 15

How does the adversary attack P?

1

Modify files:

P’s executable file dynamic linker dynamic libraries

2 Modify the operating system 3 Run P under emulation

Definitions 6/78

slide-16
SLIDE 16

How does the adversary attack P?

1

Modify files:

P’s executable file dynamic linker dynamic libraries

2 Modify the operating system 3 Run P under emulation 4 Modify P while running under debugging

Definitions 6/78

slide-17
SLIDE 17

What do we want?

Ensure P is healthy and the environment isn’t hostile:

1 Unadulterated hardware and operating system

Definitions 7/78

slide-18
SLIDE 18

What do we want?

Ensure P is healthy and the environment isn’t hostile:

1 Unadulterated hardware and operating system 2 Unmodified P’s code

Definitions 7/78

slide-19
SLIDE 19

What do we want?

Ensure P is healthy and the environment isn’t hostile:

1 Unadulterated hardware and operating system 2 Unmodified P’s code 3 Not running under emulation

Definitions 7/78

slide-20
SLIDE 20

What do we want?

Ensure P is healthy and the environment isn’t hostile:

1 Unadulterated hardware and operating system 2 Unmodified P’s code 3 Not running under emulation 4 Not being modified by a debugger

Definitions 7/78

slide-21
SLIDE 21

What do we want?

Ensure P is healthy and the environment isn’t hostile:

1 Unadulterated hardware and operating system 2 Unmodified P’s code 3 Not running under emulation 4 Not being modified by a debugger 5 The right dynamic libraries have been loaded

Definitions 7/78

slide-22
SLIDE 22

Checking for tampering — code checking

Check that P’s code hashes to a known value:

✞ ☎

if (hash(P’s code ) != 0 xca7ca115 ) return false;

✝ ✆

Definitions 8/78

slide-23
SLIDE 23

Checking for tampering — result checking

Instead of checking that the code is correct, CHECK can test that the result of a computation is correct.

✞ ☎

quickSort (A, n ) ; for ( i =0; i <(n−1); i++) i f (A[ i ]>A[ i +1]) return f a l s e ;

✝ ✆

Definitions 9/78

slide-24
SLIDE 24

Checking for tampering — environment checking

“Am I being run under emulation?’

Definitions 10/78

slide-25
SLIDE 25

Checking for tampering — environment checking

“Am I being run under emulation?’ “Is there a debugger attached to my process?”

Definitions 10/78

slide-26
SLIDE 26

Checking for tampering — environment checking

“Am I being run under emulation?’ “Is there a debugger attached to my process?” “Is the operating system at the proper patch level?”

Definitions 10/78

slide-27
SLIDE 27

Environment checking — Checking for debugging

✞ ☎

#i n c l u d e < s t d i o . h> #i n c l u d e < sys / ptrace . h> int main ( ) { i f ( ptrace (PTRACE TRACEME)) p r i n t f ( ” I ’m being traced !\ n” ) ; }

✝ ✆

If you fail, you can assume you’ve been attached to a debugger:

✞ ☎

> gcc −g −o traced traced . c > traced > gdb traced ( gdb ) run I ’m being traced !

✝ ✆

Definitions 11/78

slide-28
SLIDE 28

Environment checking — Checking for debugging

✞ ☎

#include <stdio.h> #include <stdint .h> #include <signal .h> #include <unistd .h> #include <setjmp .h> jmp_buf env ; void handler (int signal ) { longjmp (env ,1); }

✝ ✆

Definitions 12/78

slide-29
SLIDE 29

✞ ☎

int main () { signal (SIGFPE , handler ); uint32_t start ,stop; int x = 0; if ( setjmp (env ) == 0) { asm volatile ( "cpuid\n" "rdtsc\n" : "=a" ( start) ); x = x/x; } else { asm volatile ( "cpuid\n" "rdtsc\n" : "=a" ( stop) ); uint32_t elapsed = stop

  • start;

if (elapsed >40000) printf ("Debugged !\n"); else printf ("Not debugged !\n"); } }

✝ ✆

slide-30
SLIDE 30

Environment checking — Checking for debugging

Here’s the output when first run normally and then under a debugger:

✞ ☎

> gcc -o cycles cycles .c > cycles elapsed 31528: Not debugged ! > gdb cycles (gdb ) handle SIGFPE noprint nostop (gdb ) run elapsed 79272: Debugged !

✝ ✆

Definitions 14/78

slide-31
SLIDE 31

How do we respond to tampering?

1

Terminate the program.

Definitions 15/78

slide-32
SLIDE 32

How do we respond to tampering?

1

Terminate the program.

2

Restore the program to its correct state, by patching the tampered code.

Definitions 15/78

slide-33
SLIDE 33

How do we respond to tampering?

1

Terminate the program.

2

Restore the program to its correct state, by patching the tampered code.

3 Deliberately return incorrect results, maybe deteriorate

slowly over time.

Definitions 15/78

slide-34
SLIDE 34

How do we respond to tampering?

1

Terminate the program.

2

Restore the program to its correct state, by patching the tampered code.

3 Deliberately return incorrect results, maybe deteriorate

slowly over time.

4

Degrade the performance of the program.

Definitions 15/78

slide-35
SLIDE 35

How do we respond to tampering?

1

Terminate the program.

2

Restore the program to its correct state, by patching the tampered code.

3 Deliberately return incorrect results, maybe deteriorate

slowly over time.

4

Degrade the performance of the program.

5

Report the attack for example by “phoning home”.

Definitions 15/78

slide-36
SLIDE 36

How do we respond to tampering?

1

Terminate the program.

2

Restore the program to its correct state, by patching the tampered code.

3 Deliberately return incorrect results, maybe deteriorate

slowly over time.

4

Degrade the performance of the program.

5

Report the attack for example by “phoning home”.

6

Punish the attacker by destroying the program or objects in its environment:

DisplayEater deletes your home directory. Destroy the computer by repeatedly flashing the bootloader flash memory.

Definitions 15/78

slide-37
SLIDE 37

Outline

1

Definitions

2

Introspection Checker Network

3

The Skype obfuscated protocol

4

Attacking self-hashing algorithms

5

State inspection Overlapping instructions

6

Response Mechanisms

7

Discussion

Introspection 16/78

slide-38
SLIDE 38

Checking by introspection

Augment the program with functions that compute a hash

  • ver a code region to compare to an expected value.

Introspection 17/78

slide-39
SLIDE 39

Checking by introspection

Augment the program with functions that compute a hash

  • ver a code region to compare to an expected value.

How can we be sure that the attacker won’t tamper with the hash computation itself?

Introspection 17/78

slide-40
SLIDE 40

Checking by introspection

Augment the program with functions that compute a hash

  • ver a code region to compare to an expected value.

How can we be sure that the attacker won’t tamper with the hash computation itself?

1 build up a network of checkers and responders, so that

checkers can check each other and responders can repair code that has been tampered with.

Introspection 17/78

slide-41
SLIDE 41

Checking by introspection

Augment the program with functions that compute a hash

  • ver a code region to compare to an expected value.

How can we be sure that the attacker won’t tamper with the hash computation itself?

1 build up a network of checkers and responders, so that

checkers can check each other and responders can repair code that has been tampered with.

2 hide the hash values so they won’t give away the location of

the checkers.

Introspection 17/78

slide-42
SLIDE 42

Checking by introspection

Augment the program with functions that compute a hash

  • ver a code region to compare to an expected value.

How can we be sure that the attacker won’t tamper with the hash computation itself?

1 build up a network of checkers and responders, so that

checkers can check each other and responders can repair code that has been tampered with.

2 hide the hash values so they won’t give away the location of

the checkers.

We’ll see a clever attack on all introspection algorithms!

Introspection 17/78

slide-43
SLIDE 43

Checking by introspection

Augment the program with functions that compute a hash

  • ver a code region to compare to an expected value.

How can we be sure that the attacker won’t tamper with the hash computation itself?

1 build up a network of checkers and responders, so that

checkers can check each other and responders can repair code that has been tampered with.

2 hide the hash values so they won’t give away the location of

the checkers.

We’ll see a clever attack on all introspection algorithms! . . . And, We’ll see a clever counter-attack!

Introspection 17/78

slide-44
SLIDE 44

Inserting Guards

✞ ☎

. . . . . . . . . s t a r t = start address ; end = end address ; h = 0; while ( s t a r t < end ) { h = h ⊕ ∗ s t a r t ; s t a r t ++; } i f ( h != expected value) abort ( ) ; goto ∗ h ; . . . . . . . . .

✝ ✆

Introspection 18/78

slide-45
SLIDE 45

Attack model — Find the guards

1 Search for patterns in the static code, for example two code

segment addresses followed by a test:

✞ ☎

s t a r t = 0 xbabebabe ; end = 0 xca75ca75 ; while ( s t a r t < end ) {

✝ ✆

2 Search for patterns in the execution, such as data reads into

the code.

Introspection 19/78

slide-46
SLIDE 46

Attack model — Disable the guards

1 Replace the if-statement by if (0)...:

✞ ☎

i f ( 0) abort ( ) ;

✝ ✆

2 Pre-compute the hash value and substitute it into the

response code:

✞ ☎

goto ∗expected value ;

✝ ✆

Introspection 20/78

slide-47
SLIDE 47

Tamperproofing Algorithm: Chang & Atallah

Invented by two Purdue University researchers, Mike Atallah and Hoi Chang: Patented and with assistance from Purdue a start-up, Arxan, was spun off.

Introspection 21/78

slide-48
SLIDE 48

Tamperproofing Algorithm: Chang & Atallah

Checkers compute a hash over a region and compare to the expected value.

Introspection 22/78

slide-49
SLIDE 49

Tamperproofing Algorithm: Chang & Atallah

Checkers compute a hash over a region and compare to the expected value. Checkers check the code and check each other as well!

Introspection 22/78

slide-50
SLIDE 50

Tamperproofing Algorithm: Chang & Atallah

Checkers compute a hash over a region and compare to the expected value. Checkers check the code and check each other as well! Build up a network of code regions: blocks of user code, checkers , and responders.

Introspection 22/78

slide-51
SLIDE 51

Tamperproofing Algorithm: Chang & Atallah

Checkers compute a hash over a region and compare to the expected value. Checkers check the code and check each other as well! Build up a network of code regions: blocks of user code, checkers , and responders. When a tampered function is found repair it!

Introspection 22/78

slide-52
SLIDE 52

Tamperproofing Algorithm: Chang & Atallah

Checkers compute a hash over a region and compare to the expected value. Checkers check the code and check each other as well! Build up a network of code regions: blocks of user code, checkers , and responders. When a tampered function is found repair it! Skype uses a similar technique. Multiple checkers can check the same region.

Introspection 22/78

slide-53
SLIDE 53

Tamperproofing Algorithm: Chang & Atallah

Checkers compute a hash over a region and compare to the expected value. Checkers check the code and check each other as well! Build up a network of code regions: blocks of user code, checkers , and responders. When a tampered function is found repair it! Skype uses a similar technique. Multiple checkers can check the same region. Multiple responders can repair a tampered region.

Introspection 22/78

slide-54
SLIDE 54

✞ ☎

int main (int argc , char * argv []) { int user_key = 0 xca7ca115 ; int media [] = {10 ,102}; play(user_key ,media ,2); } int getkey (int user_key ) { int player_key = 0 xbabeca75 ; return user_key ^ player_key ; } int decrypt (int user_key , int media ) { int key = getkey (user_key ); return media ^ key; } float decode ( int digital ) { return ( float)digital ;} void play(int user_key , int media [], int len ) { int i; for(i=0;i<len ;i++) printf ("%f\n",decode (decrypt (user_key ,media [i]))); }

✝ ✆

slide-55
SLIDE 55

✞ ☎

#define getkeyHASH 0 xce1d400a #define getkeySIZE 14 uint32 getkeyCOPY [] = {0 x83e58955 ,0x72b820ec ,0 xc7080486 ,...}; #define decryptHASH 0 x3764e45c #define decryptSIZE 16 uint32 decryptCOPY [] = {0 x83e58955 ,0xaeb820ec ,0 xc7080486 ,...}; #define playHASH 0 x4f4205a5 #define playSIZE 29 uint32 playCOPY [] = {0 x83e58955 ,0xedb828ec ,0 xc7080486 ,...};

✝ ✆

slide-56
SLIDE 56

✞ ☎

int main (int argc , char * argv []) { A(); } int A() { B(); } int B() { ... }

✝ ✆

slide-57
SLIDE 57

✞ ☎

uint32 B_COPY []={0 x83e58955 ,0 xaeb820ec ,0 xc7080486 ,...}; int main (int argc , char * argv []) { A(); } int A() { B_hash = hash(B); if ( B_hash != 0 x4f4205a5 ) memcpy (B,B_COPY ); B(); } int B() { ... }

✝ ✆

slide-58
SLIDE 58

✞ ☎

uint32 A_COPY [] ={0 x83e58955 ,0x72b820ec ,0 xc7080486 ,...}; uint32 B_COPY []={0 x83e58955 ,0 xaeb820ec ,0 xc7080486 ,...}; int main (int argc , char * argv []) { A_hash = hash(A); if ( A_hash != 0 x105AB23F ) memcpy (A,A_COPY ); A(); } int A() { B_hash = hash(B); if ( B_hash != 0 x4f4205a5 ) memcpy (B,B_COPY ); B(); } int B() { ... }

✝ ✆

slide-59
SLIDE 59

✞ ☎

uint32 getkeyCOPY [] ={0 x83e58955 ,0 x72b820ec ,0 xc7080486 ,...}; uint32 decryptCOPY []={0 x83e58955 ,0 xaeb820ec ,0 xc7080486 ,...}; uint32 playCOPY [] ={0 x83e58955 ,0 xedb828ec ,0 xc7080486 ,...}; uint32 decryptVal ; int main (int argc , char * argv []) { uint32 playVal = hash((waddr t)play,29); int user_key = 0 xca7ca115 ; decryptVal = hash((waddr t)decrypt,16); int media [] = {10 ,102}; if ( playVal != 0 x4f4205a5 ) memcpy((waddr t)play,playCOPY,29*sizeof(uint32)); play(user_key ,media ,2); } int getkey (int user_key ) { decryptVal = hash((waddr t)decrypt,16); int player_key = 0 xbabeca75 ; return user_key ^ player_key ; }

✝ ✆

slide-60
SLIDE 60

✞ ☎

int decrypt (int user_key , int media ) { uint32 getkeyVal = hash((waddr t)getkey,14); if ( getkeyVal != 0 xce1d400a ) memcpy((waddr t)getkey,getkeyCOPY,14*sizeof(uint32)); int key = getkey (user_key ); return media ^ key; } float decode ( int digital ) { return ( float )digital ; } void play(int user_key , int media [], int len ) { if ( decryptVal != 0 x3764e45c ) memcpy((waddr t)decrypt,decryptCOPY,16*sizeof(uint32)); int i; for(i=0;i<len ;i++) printf ("%f\n",decode (decrypt (user_key ,media [i]))); }

✝ ✆

slide-61
SLIDE 61

Algorithm Chang & Atallah: Checker network

decrypt play getkey decode main

r1 c1 c0 c2 r2 r3 c3

code — code blocks ci — checkers ri — repairers

Introspection 30/78

slide-62
SLIDE 62

Algorithm tpCA: Checker Network

Here’s the corresponding code, as it is laid out in memory:

getkey decrypt decode play main c2 r1 c3 c0 r3 r2 c1

blue represent checkers, pink repairers.

Introspection 31/78

slide-63
SLIDE 63

Generating hash functions

Prevent collusive attacks ⇒ generate a large number of different-looking hash functions.

Introspection 32/78

slide-64
SLIDE 64

Generating hash functions

Prevent collusive attacks ⇒ generate a large number of different-looking hash functions. Self-collusive attacks = the adversary scans through the program for pieces of similar-looking code.

Introspection 32/78

slide-65
SLIDE 65

Generating hash functions

Prevent collusive attacks ⇒ generate a large number of different-looking hash functions. Self-collusive attacks = the adversary scans through the program for pieces of similar-looking code. No need to be “cryptographically secure”.

Introspection 32/78

slide-66
SLIDE 66

Generating hash functions

Prevent collusive attacks ⇒ generate a large number of different-looking hash functions. Self-collusive attacks = the adversary scans through the program for pieces of similar-looking code. No need to be “cryptographically secure”. No need to generate a uniform distribution of values.

Introspection 32/78

slide-67
SLIDE 67

Generating hash functions

Prevent collusive attacks ⇒ generate a large number of different-looking hash functions. Self-collusive attacks = the adversary scans through the program for pieces of similar-looking code. No need to be “cryptographically secure”. No need to generate a uniform distribution of values. Must be simple, fast, stealthy!

Introspection 32/78

slide-68
SLIDE 68

hash1

✞ ☎

typedef unsigned int uint32 ; typedef uint32 * addr_t ; uint32 hash1 ( addr_t addr ,int words ) { uint32 h = * addr; int i; for (i=1; i<words ; i++) { addr ++; h ^= * addr; } return h; }

✝ ✆

Inline the function for better stealth.

Introspection 33/78

slide-69
SLIDE 69

hash2

✞ ☎

uint32 hash2 ( addr_t start ,addr_t end ) { uint32 h = * start; while (1) { start ++; if (start >=end ) return h; h ^= * start; } }

✝ ✆

Will the compiler generate different code than for hash1???

Introspection 34/78

slide-70
SLIDE 70

hash3

✞ ☎

int32 hash3 ( addr_t start ,addr_t end ,int step ) { uint32 h = * start; while (1) { start += step; if (start >=end ) return h; h ^= * start; } }

✝ ✆

Step through the code region in more or less detail ⇒ balance performance and accuracy.

Introspection 35/78

slide-71
SLIDE 71

hash4

uint32 hash4 ( addr_t start ,addr_t end ,uint32 rnd ) { addr_t t = ( addr_t )(( uint32 )start + ( uint32 )end + rnd ); uint32 h = 0; do { h += *(( addr_t )(-( uint32 )end -( uint32 )rnd +( uint32 )t)); t++; } while (t < ( addr_t )(( uint32 )end+ (uint32 )end +( uint32 )rnd )); return h; }

Scan backwards. Obfuscate to prevent pattern-matching attacks: add (and then subtract out) a random value (rnd).

Introspection 36/78

slide-72
SLIDE 72

hash5

✞ ☎

uint32 hash5 ( addr_t start , addr_t end , uint32 C) { uint32 h = 0; while ( start < end ) { h = C*(* start + h); start ++; } return h; }

✝ ✆

Generate 2,916,864 variants, each less than 50 bytes of x86, by reordering basic blocks, inverting conditional branches, replacing multiplication instructions by combinations of shifts, adds, and address computations, permuting instructions within blocks, permuting register assignments, and replacing instructions with equivalents.

Introspection 37/78

slide-73
SLIDE 73

Outline

1

Definitions

2

Introspection Checker Network

3

The Skype obfuscated protocol

4

Attacking self-hashing algorithms

5

State inspection Overlapping instructions

6

Response Mechanisms

7

Discussion

The Skype obfuscated protocol 38/78

slide-74
SLIDE 74

The Skype obfuscated protocol

Voice-over-IP service where users are charged for computer-to-phone and phone-to-computer calls. The Skype client is heavily tamperproofed and obfuscated. 2005: Skype was bought by eBay for $2.6 billion. 2006: Hacked by two researchers at the EADS Corporate Research Center in France.

The Skype obfuscated protocol 39/78

slide-75
SLIDE 75

The Skype obfuscated protocol

The client binary contains:

1 hardcoded RSA keys 2 the IP address and port number of a known server

Break the protection and build your own VoIP network!

The Skype obfuscated protocol 40/78

slide-76
SLIDE 76

Skype protection: Stage 1

  • 4. decrypt

PC

  • 5. load hidden

dll table

  • 6. ...

dll table dll table dll table

  • 1. initialize
  • 2. load dll:s
  • 3. erase
  • 4. decrypt

PC

ENCRYPTED

  • 3. erase
  • 4. decrypt
  • 5. load hidden

dll table

  • 6. ...

PC

  • 3. erase

ERASED

key

ERASED

hidden dll table key key

pink: cleartext code, loads dlls. blue: erase pink code, decrypts green code. green: loads hidden dlls (yellow). Erasing and hiding dlls: hard to recreate binary.

The Skype obfuscated protocol 41/78

slide-77
SLIDE 77

Skype protection: Stage 2

Check for debuggers:

1 Signatures of known debuggers 2 Timing tests

The Skype obfuscated protocol 42/78

slide-78
SLIDE 78

Skype protection: Stage 3

Checker network:

. . .

C36 C37 C2 C38 C1 C72

Hash function computes the address of the next location to be executed! Hash functions are obfuscated, but not enough — attacked by pattern-matching.

The Skype obfuscated protocol 43/78

slide-79
SLIDE 79

uint32 hash7 () { addr_t addr; addr = ( addr_t )(( uint32 )addr ^( uint32 )addr); addr = ( addr_t )(( uint32 )addr + 0 x688E5C ); uint32 hash = 0 x320E83 ^ 0 x1C4C4 ; int bound = hash + 0 xFFCC5AFD ; do { uint32 data = *(( addr_t )(( uint32 )addr + 0 x10 )); goto b1; asm volatile (".byte 0x19"); b1: hash = hash ⊕ data; addr

  • = 1; bound --;

} while ( bound !=0); goto b2; asm volatile (".byte 0 x73"); b2: goto b3; asm volatile (".word 0 xC8528417 ,0 xD8FBBD1 ,0 xA36CFB2F "); asm volatile (".word 0 xE8D6E4B7 ,0 xC0B8797A "); asm volatile (".byte 0x61 ,0xBD "); b3: hash -=0 x4C49F346 ; return hash; }

slide-80
SLIDE 80

Outline

1

Definitions

2

Introspection Checker Network

3

The Skype obfuscated protocol

4

Attacking self-hashing algorithms

5

State inspection Overlapping instructions

6

Response Mechanisms

7

Discussion

Attacking self-hashing algorithms 45/78

slide-81
SLIDE 81

Algorithm reWOS: Attacking self-hashing algorithms

How to attack introspection algorithms?

1 Analyze the code to locate the checkers, or

Attacking self-hashing algorithms 46/78

slide-82
SLIDE 82

Algorithm reWOS: Attacking self-hashing algorithms

How to attack introspection algorithms?

1 Analyze the code to locate the checkers, or 2 Analyze the code to locate the responders, then

Attacking self-hashing algorithms 46/78

slide-83
SLIDE 83

Algorithm reWOS: Attacking self-hashing algorithms

How to attack introspection algorithms?

1 Analyze the code to locate the checkers, or 2 Analyze the code to locate the responders, then 3 Remove or disable them without destroying the rest of the

program.

Attacking self-hashing algorithms 46/78

slide-84
SLIDE 84

Algorithm reWOS: Attacking self-hashing algorithms

How to attack introspection algorithms?

1 Analyze the code to locate the checkers, or 2 Analyze the code to locate the responders, then 3 Remove or disable them without destroying the rest of the

program.

Attack can just as well be external to the program!

Attacking self-hashing algorithms 46/78

slide-85
SLIDE 85

Algorithm reWOS: Attacking self-hashing algorithms

Processors treat code and data differently.

Attacking self-hashing algorithms 47/78

slide-86
SLIDE 86

Algorithm reWOS: Attacking self-hashing algorithms

Processors treat code and data differently. TLBs (Translation Lookaside Buffers) and caches are split in separate parts for code and data.

Attacking self-hashing algorithms 47/78

slide-87
SLIDE 87

Algorithm reWOS: Attacking self-hashing algorithms

Processors treat code and data differently. TLBs (Translation Lookaside Buffers) and caches are split in separate parts for code and data. In the hash-based algorithms code is accessed

1 as code (when it’s being executed) and

⇒ sometimes a function will be read into the I-cache and sometimes into the D-cache.

Attacking self-hashing algorithms 47/78

slide-88
SLIDE 88

Algorithm reWOS: Attacking self-hashing algorithms

Processors treat code and data differently. TLBs (Translation Lookaside Buffers) and caches are split in separate parts for code and data. In the hash-based algorithms code is accessed

1 as code (when it’s being executed) and 2 as data (when it’s being hashed).

⇒ sometimes a function will be read into the I-cache and sometimes into the D-cache.

Attacking self-hashing algorithms 47/78

slide-89
SLIDE 89

Algorithm reWOS: Attacking self-hashing algorithms

Attack: modify the OS such that

1 redirect reads of the code to the original, unmodified program

(hash values will be computed as expected!)

Attacking self-hashing algorithms 48/78

slide-90
SLIDE 90

Algorithm reWOS: Attacking self-hashing algorithms

Attack: modify the OS such that

1 redirect reads of the code to the original, unmodified program

(hash values will be computed as expected!)

2 redirect execution of the code to the modified program (the

modified code will get executed!)

Attacking self-hashing algorithms 48/78

slide-91
SLIDE 91

Algorithm reWOS: Attacking self-hashing algorithms

Attack(P, K):

1 Copy program P to Porig. 2 Modify P as desired to a hacked version P′. 3 Modify the operating system kernel K such that data reads are

directed to Porig, instruction reads to P′.

Attacking self-hashing algorithms 49/78

slide-92
SLIDE 92

Algorithm reWOS: Attacking self-hashing algorithms

Typical memory management system:

TLB miss Offset Page Frame Physical Address Offset Page Index Virtual Address Page Tables TLB TLB hit

On a TLB miss walk the page tables (slow), and update the TLB with the new virtual-to-physical address mapping.

Attacking self-hashing algorithms 50/78

slide-93
SLIDE 93

Algorithm reWOS: Attacking self-hashing algorithms

Typical memory management system:

TLB miss Offset Page Frame Physical Address Offset Page Index Virtual Address Page Tables TLB TLB hit

On a TLB miss walk the page tables (slow), and update the TLB with the new virtual-to-physical address mapping. On the UltraSparc, the hardware gives the OS control on a TLB miss by throwing one of two exceptions depending on whether the miss was caused by a data or an instruction fetch

Attacking self-hashing algorithms 50/78

slide-94
SLIDE 94

Algorithm reWOS: Attacking self-hashing algorithms

1 Copy P to Porig and modify P however you like.

05 02 03 Virtual Address 00 Page Tables I−TLB Instruction fetch Data fetch D−TLB miss TLB 1 2 3 4 5 6 Physical frames abort(); if (expired) abort(); if (false) 2 → 3 2 → 4

Attacking self-hashing algorithms 51/78

slide-95
SLIDE 95

Algorithm reWOS: Attacking self-hashing algorithms

1 Copy P to Porig and modify P however you like. 2 Arrange the physical memory such that frame i comes from

the hacked P and frame i + 1 is the corresponding original frame from Porig.

05 02 03 Virtual Address 00 Page Tables I−TLB Instruction fetch Data fetch D−TLB miss TLB 1 2 3 4 5 6 Physical frames abort(); if (expired) abort(); if (false) 2 → 3 2 → 4

Attacking self-hashing algorithms 51/78

slide-96
SLIDE 96

Algorithm reWOS: Attacking self-hashing algorithms

1 Copy P to Porig and modify P however you like. 2 Arrange the physical memory such that frame i comes from

the hacked P and frame i + 1 is the corresponding original frame from Porig.

3 Modify the kernel: if a page table lookup yields a v → p

virtual-to-physical address mapping, I-TLB is updated with v → p and D-TLB with v → p + 1.

05 02 03 Virtual Address 00 Page Tables I−TLB Instruction fetch Data fetch D−TLB miss TLB 1 2 3 4 5 6 Physical frames abort(); if (expired) abort(); if (false) 2 → 3 2 → 4

Attacking self-hashing algorithms 51/78

slide-97
SLIDE 97

Algorithm reWOS: Attacking self-hashing algorithms

05 02 03 Virtual Address 00 Page Tables I−TLB Instruction fetch Data fetch D−TLB miss TLB 1 2 3 4 5 6 Physical frames abort(); if (expired) abort(); if (false)

2 → 3 2 → 4 1 The attacker has modified the program to bypass a

license-expired check.

Attacking self-hashing algorithms 52/78

slide-98
SLIDE 98

Algorithm reWOS: Attacking self-hashing algorithms

05 02 03 Virtual Address 00 Page Tables I−TLB Instruction fetch Data fetch D−TLB miss TLB 1 2 3 4 5 6 Physical frames abort(); if (expired) abort(); if (false)

2 → 3 2 → 4 1 The attacker has modified the program to bypass a

license-expired check.

2 The original program pages are in blue.

Attacking self-hashing algorithms 52/78

slide-99
SLIDE 99

Algorithm reWOS: Attacking self-hashing algorithms

05 02 03 Virtual Address 00 Page Tables I−TLB Instruction fetch Data fetch D−TLB miss TLB 1 2 3 4 5 6 Physical frames abort(); if (expired) abort(); if (false)

2 → 3 2 → 4 1 The attacker has modified the program to bypass a

license-expired check.

2 The original program pages are in blue. 3 The modified program pages are in pink.

Attacking self-hashing algorithms 52/78

slide-100
SLIDE 100

Algorithm reWOS: Attacking self-hashing algorithms

05 02 03 Virtual Address 00 Page Tables I−TLB Instruction fetch Data fetch D−TLB miss TLB 1 2 3 4 5 6 Physical frames abort(); if (expired) abort(); if (false)

2 → 3 2 → 4 1 The program tries to read its own code in order to execute it

⇒ the processor throws an I-TLB-miss exception, the OS updates the I-TLB to refer to the modified page.

Attacking self-hashing algorithms 53/78

slide-101
SLIDE 101

Algorithm reWOS: Attacking self-hashing algorithms

05 02 03 Virtual Address 00 Page Tables I−TLB Instruction fetch Data fetch D−TLB miss TLB 1 2 3 4 5 6 Physical frames abort(); if (expired) abort(); if (false)

2 → 3 2 → 4 1 The program tries to read its own code in order to execute it

⇒ the processor throws an I-TLB-miss exception, the OS updates the I-TLB to refer to the modified page.

2 The program tries to read its own code in order hash the

processor throws a D-TLB-miss exception, and the OS updates the D-TLB to refer to the original, unmodified, page.

Attacking self-hashing algorithms 53/78

slide-102
SLIDE 102

Outline

1

Definitions

2

Introspection Checker Network

3

The Skype obfuscated protocol

4

Attacking self-hashing algorithms

5

State inspection Overlapping instructions

6

Response Mechanisms

7

Discussion

State inspection 54/78

slide-103
SLIDE 103

What’s wrong with introspection algorithms?

Introspection algorithms

1 read their own code segment (unusual)! 2 only check the validity of the code itself (not runtime data,

function return values, . . . ).

State inspection 55/78

slide-104
SLIDE 104

What’s wrong with introspection algorithms?

Introspection algorithms

1 read their own code segment (unusual)! 2 only check the validity of the code itself (not runtime data,

function return values, . . . ).

Oblivious algorithms

1 detect tampering from the side-effects the code produces 2 check the correctess of data and control-flow

Oblivious ⇒ the adversary should be unaware that his code is being checked.

State inspection 55/78

slide-105
SLIDE 105

Oblivious hashing

More stealthy than introspection techniques.

We don’t read our own code!

An advanced form of assertion checking:

✞ ☎

ASSERT x < 100; ASSERT y != n u l l ;

✝ ✆

Works on Java as well as binary code.

State inspection 56/78

slide-106
SLIDE 106

Challenging functions

Adding assertion checks automatically is hard!

How can we know what values variables should have???

Instead, call functions with challenge inputs:

✞ ☎

int c h a l l e n ge = 5; int expected = 120; int r e s u l t = f a c t o r i a l ( c h a l l e n ge ) ; i f ( r e s u l t != expected ) abort ( ) ;

✝ ✆

State inspection 57/78

slide-107
SLIDE 107

Challenging functions

Be careful not to generate suspicious-looking hash values or challenge data:

✞ ☎

i f ( f a c t o r i a l (17) != 355687428096000) abort ( ) ;

✝ ✆

You can hide the hash value by making copies of every function:✞

int c h a l l e n ge = 17; i f ( f a c t o r i a l o r i g ( c h a l l e n ge ) != f a c t o r i a l c o p y ( c h a l l e n ge )) abort ( ) ;

✝ ✆

State inspection 58/78

slide-108
SLIDE 108

Algorithm tpJJV: Oblivious hashing

IDEA: overlap basic blocks of x86 instructions.

State inspection 59/78

slide-109
SLIDE 109

Algorithm tpJJV: Oblivious hashing

IDEA: overlap basic blocks of x86 instructions. When one block executes it also computes a hash over the second block!

State inspection 59/78

slide-110
SLIDE 110

Algorithm tpJJV: Oblivious hashing

IDEA: overlap basic blocks of x86 instructions. When one block executes it also computes a hash over the second block! The hash is computed without reading the code!

State inspection 59/78

slide-111
SLIDE 111

Algorithm tpJJV: Oblivious hashing

IDEA: overlap basic blocks of x86 instructions. When one block executes it also computes a hash over the second block! The hash is computed without reading the code! Invulnerable to memory splitting attacks!

State inspection 59/78

slide-112
SLIDE 112

✞ ☎

B0 : shll 2,%eax incl %eax ret

✝ ✆ ✞ ☎

B1 : decl %eax shrl 3,%eax ret

✝ ✆

Merge the blocks by interleaving the instructions, inserting jumps to maintain semantics:

✞ ☎

B0 : shll 2,%eax jmp I1 B1 : decl %eax jmp I2 I1 : incl %eax jmp I3 I2 : shrl 3,%eax I3 : ret

✝ ✆

slide-113
SLIDE 113

The merged block has two entry points, B0 and B1. Want the two blocks also to share instruction bytes. Replace the jmp with xorl that takes a 4-byte literal argument:

✞ ☎

B0 : shll 2,%eax xorl %ecx ,next 4 bytes // used to be jmp I1 B1 : decl %eax jmp I2 nop incl %eax ...

✝ ✆

The xorl instruction has, embedded in its immediate

  • perand, the four bytes from decl;jmp;nop!
slide-114
SLIDE 114

B0 ↓ shll $2,%eax incl %eax ret

  • C1

E0 02 40 C3

1 2 3 4

B1 ↓ decl %eax shrl $3,%eax ret

  • 48

C1 E8 03 C3

1 2 3 4

slide-115
SLIDE 115

B0 ↓ shll $2,%eax xorl $90E98148,%ecx incl %eax

  • C1

E0 02 81 F1 48 81 E9 90 40 81 C1

1 2 3 4 5 6 7 8 9 10 11

  • decl %eax

subl $C1814090,%ecx ↑ B1 addl $9003E8C1,%ecx ret

  • 81

C1 C1 E8 03 90 C3

10 11 12 13 14 15 16

  • shrl $3,%eax

nop ret

slide-116
SLIDE 116

Algorithm tpJJV: Oblivious hashing

Executing one block means also computing a hash over the

  • ther block into register %ecx!

You can check the hash as usual. Clever use of the x86’s architectural (mis-)features! Overhead: up to 3x slowdown.

State inspection 64/78

slide-117
SLIDE 117

Outline

1

Definitions

2

Introspection Checker Network

3

The Skype obfuscated protocol

4

Attacking self-hashing algorithms

5

State inspection Overlapping instructions

6

Response Mechanisms

7

Discussion

Response Mechanisms 65/78

slide-118
SLIDE 118

Algorithm tpTCJ: Response Mechanisms

end fail RESPOND() CHECK() program tamper start program

CHECK checks for tampering,

Response Mechanisms 66/78

slide-119
SLIDE 119

Algorithm tpTCJ: Response Mechanisms

end fail RESPOND() CHECK() program tamper start program

CHECK checks for tampering, Later RESPOND takes action,

Response Mechanisms 66/78

slide-120
SLIDE 120

Algorithm tpTCJ: Response Mechanisms

end fail RESPOND() CHECK() program tamper start program

CHECK checks for tampering, Later RESPOND takes action, Later still, the program actually fails

Response Mechanisms 66/78

slide-121
SLIDE 121

Algorithm tpTCJ: Response Mechanisms

✞ ☎

boolean tampered = false ; int global = 10; . . . if (hash(. . .)!=0xb1acca75) tampered = true; . . . if (tampered) global = 0; . . . printf("%i",10/global);

✝ ✆

RESPOND corrupts program state so that the actual failure follows much later

Response Mechanisms 67/78

slide-122
SLIDE 122

Algorithm tpTCJ: Response Mechanisms

✞ ☎

#include <time.h> int global = 10; . . . if (time(0) % 2 == 0) printf("%i",10/global); . . . if (getpid() % 2 == 0) x = 5/global; . . . x = 3/global;

✝ ✆

Introduce a number of failure sites and probabilistically choose between them. Every time the attacker runs the hacked program it is likely to fail in one of the two green spots.

Response Mechanisms 68/78

slide-123
SLIDE 123

Algorithm tpTCJ: Response Mechanisms

spatial separation: There should be as little static and dynamic connection between the RESPOND site and the failure site as possible.

Response Mechanisms 69/78

slide-124
SLIDE 124

Algorithm tpTCJ: Response Mechanisms

spatial separation: There should be as little static and dynamic connection between the RESPOND site and the failure site as possible. temporal separation: A significant length of time should pass between the execution of RESPOND and the eventual failure.

Response Mechanisms 69/78

slide-125
SLIDE 125

Algorithm tpTCJ: Response Mechanisms

spatial separation: There should be as little static and dynamic connection between the RESPOND site and the failure site as possible. temporal separation: A significant length of time should pass between the execution of RESPOND and the eventual failure. stealth: The test, response, and failure code you insert in the program should be stealthy

Response Mechanisms 69/78

slide-126
SLIDE 126

Algorithm tpTCJ: Response Mechanisms

spatial separation: There should be as little static and dynamic connection between the RESPOND site and the failure site as possible. temporal separation: A significant length of time should pass between the execution of RESPOND and the eventual failure. stealth: The test, response, and failure code you insert in the program should be stealthy predictability: Once the tamper response has been invoked, the program should eventually fail.

Response Mechanisms 69/78

slide-127
SLIDE 127

Algorithm tpTCJ: Response Mechanisms

Think about legal implications of your tamper response mechanism! Don’t deliberately destroy data. . . What if tamper-response was issued erroneously? (“I forgot my password, and after three tries the program destroyed my home directory!”) Watch out for unintended consequences. (the program crashes with a file open. . . )

Response Mechanisms 70/78

slide-128
SLIDE 128

Algorithm tpTCJ: Response Mechanisms

RESPOND to set a global pointer variable to NULL, causing the program to crash when the pointer is later dereferenced.

Response Mechanisms 71/78

slide-129
SLIDE 129

Algorithm tpTCJ: Response Mechanisms

RESPOND to set a global pointer variable to NULL, causing the program to crash when the pointer is later dereferenced. If the program doesn’t have enough pointer variables tpTCJ creates new ones by adding a layer of indirection to non-pointer variables.

Response Mechanisms 71/78

slide-130
SLIDE 130

Algorithm tpTCJ: Response Mechanisms

RESPOND to set a global pointer variable to NULL, causing the program to crash when the pointer is later dereferenced. If the program doesn’t have enough pointer variables tpTCJ creates new ones by adding a layer of indirection to non-pointer variables. Assumes that there are enough global variables to choose from.

Response Mechanisms 71/78

slide-131
SLIDE 131

✞ ☎

int tampered =0; int v; void f() { v = 10; } void g() { f(); } void h() { } int main () { if (. . .) tampered =1; h(); g(); }

✝ ✆ ✞ ☎

int tampered =0; int v; int *p v = &v; void f() { *p v = 10; } void g() { f(); } void h() { } int main () { if (. . .) tampered =1; h(); g(); }

✝ ✆

slide-132
SLIDE 132

✞ ☎

int tampered =0; int v; int * p_v = &v; void f() { *p_v = 10; } void g() { f(); } void h() { if ( tampered ) p v = NULL; } int main () { if (. . .) tampered =1; h(); g(); }

✝ ✆

slide-133
SLIDE 133

Algorithm tpTCJ: Example

1 Create a global pointer variable p v.

Response Mechanisms 74/78

slide-134
SLIDE 134

Algorithm tpTCJ: Example

1 Create a global pointer variable p v. 2 To make the program crash you should set p v to NULL. But

where?

Response Mechanisms 74/78

slide-135
SLIDE 135

Algorithm tpTCJ: Example

1 Create a global pointer variable p v. 2 To make the program crash you should set p v to NULL. But

where?

3 You want to avoid g and main since they will be on the call

stack when f throws the pointer-reference-to-nil exception. (Check the stacktrace.)

Response Mechanisms 74/78

slide-136
SLIDE 136

Algorithm tpTCJ: Example

1 Create a global pointer variable p v. 2 To make the program crash you should set p v to NULL. But

where?

3 You want to avoid g and main since they will be on the call

stack when f throws the pointer-reference-to-nil exception. (Check the stacktrace.)

4 Insert the failure-inducing code in h which is “many” calls

away and not in the same call-chain as f.

Response Mechanisms 74/78

slide-137
SLIDE 137

Outline

1

Definitions

2

Introspection Checker Network

3

The Skype obfuscated protocol

4

Attacking self-hashing algorithms

5

State inspection Overlapping instructions

6

Response Mechanisms

7

Discussion

Discussion 75/78

slide-138
SLIDE 138

Trustworthiness

Tamperproofing is about trustworthiness:

Can I trust my program when it’s running on an untrusted site?

Discussion 76/78

slide-139
SLIDE 139

Trustworthiness

Tamperproofing is about trustworthiness:

Can I trust my program when it’s running on an untrusted site?

For us to trust P, the adversary

cannot add/remove/change P’s code! cannot modify P’s environment!

Discussion 76/78

slide-140
SLIDE 140

Trustworthiness

Tamperproofing is about trustworthiness:

Can I trust my program when it’s running on an untrusted site?

For us to trust P, the adversary

cannot add/remove/change P’s code! cannot modify P’s environment!

Essential for DRM, network gaming,. . .

Discussion 76/78

slide-141
SLIDE 141

Basic operations

Check P’s environment:

Am I running under a debugger? Am I running under emulation? Has the OS been hacked?

Discussion 77/78

slide-142
SLIDE 142

Basic operations

Check P’s environment:

Am I running under a debugger? Am I running under emulation? Has the OS been hacked?

Check P’s code:

Have the executable bits been changed?

Discussion 77/78

slide-143
SLIDE 143

Basic operations

Check P’s environment:

Am I running under a debugger? Am I running under emulation? Has the OS been hacked?

Check P’s code:

Have the executable bits been changed?

Check P’s dynamic data:

Is P in a legal executable state?

Discussion 77/78

slide-144
SLIDE 144

In practice. . .

Use a combination of operations!

Check the environment Check the code Check the state

Discussion 78/78

slide-145
SLIDE 145

In practice. . .

Use a combination of operations!

Check the environment Check the code Check the state

You must check the checking code!

Simple attack: remove the checkers!

Discussion 78/78

slide-146
SLIDE 146

In practice. . .

Use a combination of operations!

Check the environment Check the code Check the state

You must check the checking code!

Simple attack: remove the checkers!

The response must be stealthy!

Simple attack: trace back from failure!

Discussion 78/78

slide-147
SLIDE 147

In practice. . .

Use a combination of operations!

Check the environment Check the code Check the state

You must check the checking code!

Simple attack: remove the checkers!

The response must be stealthy!

Simple attack: trace back from failure!

The detection must be stealthy!

Simple attack: detect reads of executable pages!

Discussion 78/78