hypervisor based analysis of macos malware
play

Hypervisor-based Analysis of macOS Malware Felix Seele June 2 nd - PowerPoint PPT Presentation

Hypervisor-based Analysis of macOS Malware Felix Seele June 2 nd 2019 whoami Technical Lead @ VMRay M. Sc. IT-Security Released first preview version of macOS sandbox in March @c1truz_ 2 Structure of this Talk => => Why?


  1. Hypervisor-based Analysis of macOS Malware Felix Seele June 2 nd 2019

  2. whoami • Technical Lead @ VMRay • M. Sc. IT-Security • Released first preview version of macOS sandbox in March @c1truz_ 2

  3. Structure of this Talk => => Why? How? Challenges Motivation Background Virtual Machine Introspection 3

  4. The Marketing Pitch Need better tools for efficient and sound, automated analysis of macOS malware! 4

  5. State of the Art • Many tools to monitor different aspects of the system: ProcInfo, BlockBlock - Goals: dtrace (fs_usage, dtruss, …) - Firewalls Full visibility of function calls at - • => every level (soundness) Debugger - ✗ No function call tracer Isolation & Transparency • (like ltrace ) Efficiency & Automation • ✗ Tools run inside analysis VM ✗ No automation 5

  6. Full Visibility of Function Calls [NSData dataWithContentsOfURL :] CFURLRequestCreate(...) Foundation.framework Evil.app high-level application frameworks socket(...) CFNetwork.framework connect(...) syscall 97 syscall 98 low-level system libraries libsystem_kernel.dylib kernelspace kernel 6

  7. Isolation & Performance • Analysis system must be higher privileged than the analyzed sample • Full system visibility requires hypervisor-level analysis • Emulators are extremely slow, unsuited for full system Hypervisor analysis • Hardware-assisted virtualization provides isolation Kernelspace with small performance overhead Userspace → How to instrument the hypervisor for malware analysis? 7

  8. Two-Dimensional Paging Address translation 101 (x86_64) Virtual Address Physical Address 0x00000 00 10 ad 5f 000 PDPT PDT PML4T PT Memory r-x CR3 8

  9. Two-Dimensional Paging Address translation 101 (x86_64) Virtual Address Physical Address Execution will cause page fault and trap to kernel! EXC_BAD_ACCESS (code=2, address=0x7ffeefbff408) 0x00000 00 10 ad 5f 000 PDPT PDT PML4T PT Memory rw- CR3 9

  10. Two-Dimensional Paging Second-level page tables Virtual Machine Hypervisor r-x r-x Guest Virtual Guest Physical Host Physical Memory Memory Memory 10

  11. Two-Dimensional Paging Second-level page tables Execution will cause page fault and trap Virtual Machine Hypervisor to hypervisor! r-x r-- Guest Virtual Guest Physical Host Physical Memory Memory Memory 11

  12. Two-Dimensional Paging Using TDP to monitor API calls • Divide memory regions into two sets: Set A: Target - Evil.app Foundation.framework executable Set B: System libraries - and kernel CFNetwork.framework libsystem_kernel.dylib kernel 12

  13. Two-Dimensional Paging Using TDP to monitor API calls • Divide memory regions into two sets: ✗ Set A: Target - Evil.app Foundation.framework executable Set B: System libraries - and kernel CFNetwork.framework • One of the sets is executable, the other libsystem_kernel.dylib non-executable kernel 13

  14. Two-Dimensional Paging Using TDP to monitor API calls • Divide memory ✗ regions into two sets: Set A: Target - Evil.app Foundation.framework executable Set B: System libraries - and kernel CFNetwork.framework • One of the sets is executable, the other libsystem_kernel.dylib non-executable kernel 14

  15. Two-Dimensional Paging Using TDP to monitor API calls • Divide memory regions into two sets: Set A: Target - Evil.app Foundation.framework executable Set B: System libraries - and kernel CFNetwork.framework ✗ • One of the sets is executable, the other libsystem_kernel.dylib non-executable kernel 15

  16. Two-Dimensional Paging Summary • Approach was presented first by Carsten Willems and Ralf Hund 1) • Transparency & Isolation: Page permission are only modified outside of the guest No modifications to the OS necessary - Not detectable, even from the kernel - • Efficiency: Calls are intercepted at the highest level possible Preserves high-level semantics - Simplifies behavior analysis - 1) https://www.syssec.ruhr-uni-bochum.de/media/emma/veroeffentlichungen/2012/11/26/TR-HGI-2012-002.pdf 16

  17. Virtual Machine Introspection 17

  18. Virtual Machine Introspection The basics Objective-C ??? Inter-Process Communication Resolve function and syscalls Function Call Monitoring Extract parameters Parse virtual address space Virtual Memory Resolve loaded libraries Process creation & termination Process Monitoring Process & thread switches Process information 18

  19. Objective-C Runtime Introspection Extracting function call parameters [0040.706] -[NSString writeToFile:(NSString *) atomically:(BOOL)] Arguments in rdx, rcx, r8, … Instance Method Pointer to object in rdi • Need to know the class to extract value NSString • Can’t trust the function prototype (class clusters, protocols) NSCFString NSPathStore2 => Need to determine class at runtime NSCFConstantString 19

  20. Objective-C Runtime Introspection Finding an object’s class 0x011dffff87f471d8 0x011dffff87f471d8 & ISA_MASK struct objc_object { 0x100503930 union isa_t { = 0x7fff87f471d8 struct objc_class *cls; uintptr_t bits; } } struct objc_class : objc_object { // Class ISA; Class superclass; // +0x08 #define ISA_MASK 0x00007ffffffffff8ULL cache_t cache; // +0x10 “__NSCFConstantString” struct { class_data_bits_t bits; // +0x20 uintptr_t nonpointer : 1; } 4 pointer derefs and 1 string read 👏 uintptr_t has_assoc : 1; uintptr_t has_cxx_dtor : 1; uintptr_t shiftcls : 44; uintptr_t magic : 6; struct class_rw_t { struct class_ro_t { uintptr_t weakly_referenced : 1; uint32_t flags; // +0x00 uint32_t flags; // +0x00 uintptr_t deallocating : 1; uint32_t version; // +0x04 // ... uintptr_t has_sidetable_rc : 1; const class_ro_t *ro; // +0x08 const char *name; // +0x18 uintptr_t extra_rc : 8; // ... } }; } 20

  21. Objective-C Runtime Introspection Finding an object’s class (the efficient way) 0x011dffff87f471d8 & ISA_MASK struct objc_object { 0x100503930 union isa_t { = 0x7fff87f471d8 struct objc_class *cls; uintptr_t bits; } } __DATA 00007fff87e12000-00007fff87f55000 rw-/rwx SM=COW /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation __DATA + 0x1351D8 000000000057a340 s _OBJC_CLASS_$___NSCFCharacterSet 000000000057a1d8 s _OBJC_CLASS_$___NSCFConstantString 000000000057a390 s _OBJC_CLASS_$___NSCFData 000000000057a020 s _OBJC_CLASS_$___NSCFDictionary 21

  22. Objective-C Runtime Introspection Finding an object’s class (the efficient way) • Need to know the location of DATA segments in memory • Not trivial due to the use of dyld shared caches • But: Only one pointer deref required + compare to precomputed offsets • Next: Reconstruct the objects internal data representation - Fairly straightforward for CoreFoundation (open-source) - Needs to be done for every class that should be reconstructed from the hypervisor • Idea: Automatically extract even unknown classes using Objective-C’s ivar information 22

  23. Objective-C Runtime Introspection Example Code Analysis Log NSLog(@"Hello, World!"); [0045.565] NSLog (format="Hello, World!") [0045.706] +[NSProcessInfo processInfo] NSProcessInfo *processInfo = [NSProcessInfo processInfo]; returned 0x7f9a3740d080 NSLog(@"Process ID is: %d", [processInfo processIdentifier]); [0045.706] -[NSProcessInfo<0x7f9a3740d080> processIdentifier] returned 488 [0045.706] NSLog (format="Process ID is: %d") NSString *username = [processInfo userName]; [0045.706] -[NSProcessInfo<0x7f9a3740d080> userName] returned="xsbgsz” NSFileManager *filemgr = [NSFileManager defaultManager]; NSString *filename = [[filemgr currentDirectoryPath] [0045.824] +[NSFileManager defaultManager] stringByAppendingPathComponent:@"user.txt"]; returned 0x7f9a37402850 [0045.824] -[NSFileManager<0x7f9a37402850> currentDirectoryPath] returned="/Users/xsbgsz" [username writeToFile:filename [0045.916] -[NSString<0x7f9a3740d150> stringByAppendingPathComponent:"user.txt"] atomically:YES returned="/Users/xsbgsz/user.txt” encoding:NSStringEncodingConversionAllowLossy error:nil]; [0045.916] -[NSString<0x7a736762737865> writeToFile:"/Users/xsbgsz/user.txt" atomically:1 encoding:0x1 error:0x0] returned 1 NSLog(@"Content written to path: %@\n", filename); [0045.923] NSLog (format="Content written to path: %@\n") 23

  24. Inter-Process Communication • XPC is used heavily on macOS Install and control LaunchAgents/Daemons - XPC-based Launch processes out of context ( open(1) ) - RPC Remote Procedure Calls - ... - CFPort MIG XPC messages • Used by > 90% of samples • Can be used to evade dynamic malware Mach messages analysis systems https://thecyberwire.com/events/docs/IanBeer_JSS_Slides.pdf 24

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend