Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Методы защиты Java-приложений и их обход

459 views

Published on

Доклад описывает спектр известных способов защиты Java-приложений, для большинства из которых существуют сценарии обхода.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Методы защиты Java-приложений и их обход

  1. 1. Методы защиты Java-приложений и их обход Ведущий: Специалист по информационной безопасности в "ASP Labs" Лебедев Филипп Ведущий: Лукьяненко Леонид 1
  2. 2. 1. Java-приложения в наше время 2. Особенности компиляции и функционирования java-приложений 3. Обзор способов защиты java приложений 4. Обзор плагина Immunity Debugger java dumper и спектр решаемых с помощью него задач 5. Результаты Структура доклада 2
  3. 3. Java-приложения в наше время Android Apps Software Tools Server Apps (J2EE) Java Web applications Big Data technologies Java Card Scientific Applications 3
  4. 4. Особенности компиляции и функционирования java-приложений (1) Текстовыйредактор .java Байткод .class Среда JVM 4
  5. 5. Особенности компиляции и функционирования java-приложений (2) Текстовыйредактор .java Байткод .class Среда JVM Vuln_1 5
  6. 6. Обход: используем декомпиляторы DJ Java Decompiler, JAD, Procyon, Fernflower, CFR и т. д. Защита: обфусцируем java-код Уязвимость 1 Простота декомпиляции .class 6
  7. 7. Особенности компиляции и функционирования java-приложений (3) Обфускация A=A B=B Java-app 1.class n.class 7
  8. 8. Обфускация Java-приложений 8 • Обфускация строк • Обфускация имен • Обфускация логики
  9. 9. Обход: злоумышленник все равно получает Java код, многие переменные и функции сохраняют свое оригинальное название, декомпиляторы частично деобфусцируют код Защита: использование модификации байт-кода Java Уязвимости 2 Обфускация кода 9
  10. 10. Особенности компиляции и функционирования java-приложений (4) Изменение байт-кода A=A B=B Java-app 1.class n.class 10
  11. 11. Изменение байт-кодовых инструкций (1) 11 public void paint(Graphics g) { g.drawString(date + " by ",100, 15); g.drawString(email,290,15); } javap –c file.class
  12. 12. Изменение байт-кодовых инструкций (2) public void paint(java.awt.Graphics); Code: 0: aload_1 1: new #8 // class java/lang/StringBuilder 4: dup 5: invokespecial #9 // Method java/lang/StringBuilder."<init>":()V 8: aload_0 9: getfield #5 // Field date:Ljava/lang/String; 12: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 15: ldc #11 // String by 17: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 20: invokevirtual #12 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 23: bipush 100 25: bipush 15 27: invokevirtual #13 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V 30: aload_1 31: aload_0 32: getfield #7 // Field email:Ljava/lang/String; 35: sipush 290 38: bipush 15 40: invokevirtual #13 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V 43: return 12
  13. 13. Обход: Часть кода декомпилируется, различные методы могут быть получены разными декомпиляторами, другая часть может быть проанализирована в байт-коде Защита: Использование динамической загрузки классов с возможным шифрованием и разделением кода Уязвимость 3 Байт-код 13
  14. 14. Особенности компиляции и функционирования java-приложений (5) Java app Обфускация и изменение байт-кодовых инструкций jar 1.class n.class 14 jar 1.class m.class Bootstrap Classloader System Classloader • Загружает основные классы приложения Secured Classloader • Шифрует и расшифровывает загружаемые классы Extension Classloader
  15. 15. Особенности компиляции и функционирования java-приложений (5) Java app Обфускация и изменение байт-кодовых инструкций jar 1.class n.class 15 jar 1.class m.class Bootstrap Classloader System Classloader • Загружает основные классы приложения Secured Classloader • Шифрует и расшифровывает загружаемые классы Extension Classloader Vuln_5
  16. 16. Обход: исходные классы получаются путем модификации загрузчика классов или использования Java Agent Защита: Используем обертку для Java приложений посредством алгоритмов сжатия и упаковки в .exe Уязвимости 4 Динамическая загрузка кода 16
  17. 17. Особенности компиляции и функционирования java-приложений (6) .EXE x86 x64 Обфускация и изменение байт-кодовых инструкций A=A B=B Java-app 1.class n.class 17
  18. 18. Особенности компиляции и функционирования java-приложений (7) .EXE x86 x64 Обфускация и изменение байт-кодовых инструкций A=A B=B Java-app 1.class n.class 18
  19. 19. Обход: используем IDA, windbg, immunity debugger, radare2, binary ninja и т. д, любой java-декомпилятор и в ходе реверса и отладки вытаскиваем классы из памяти Защита: используем проприетарную цепочку классовых загрузчиков с шифрующим корневым классовым загрузчиком, упакованным в .exe файл Уязвимости 5 Сложность дизассемблирования .EXE не влияет на сложность восстановления .class 19
  20. 20. Bootstrap Classloader System Classloader •Загружает основные классы приложения Secured Classloader •Шифрует и расшифровывает загружаемые классы Classloader 1 Extension Classloader Classloader N Особенности компиляции и функционирования java-приложений (6) 20
  21. 21. Особенности компиляции и функционирования java-приложений (7) Bootstrap Classloader System Classloader •Загружает основные классы приложения Secured Classloader •Шифрует и расшифровывает загружаемые классы Classloader 1 Extension Classloader Classloader N 21 Vuln_6
  22. 22. Принцип работы плагина java-dumper (1) CreateFileW calls ReadFileW calls CloseHandle calls 22
  23. 23. Принцип работы плагина java-dumper (2) # collect system functions addresses CreateFileW_addr = imm.getAddress("kernel32.CreateFileW") ReadFile_addr = imm.getAddress("kernel32.ReadFile") CloseHandle_addr = imm.getAddress("kernel32.CloseHandle") … # catch CreateFileW calls whook = Hooker(verbose, heaps_scan) whook.add("bp_on_kernel32.CreateFileW", CreateFileW_addr) imm.log('[*] CreateFileW hook') # catch ReadFile calls rhook = Hooker(verbose, heaps_scan) rhook.add("bp_on_kernel32.ReadFile", ReadFile_addr) imm.log('[*] ReadFile hook') # catch CloseHandle calls chook = Hooker(verbose, heaps_scan) chook.add("bp_on_kernel32.CloseHandle", CloseHandle_addr) imm.log('[*] CloseHandle hook') 23
  24. 24. Принцип работы плагина java-dumper (3) CreateFileW calls ReadFileW calls CloseHandle calls leak java.class leak java.class leak java.class 24
  25. 25. Принцип работы плагина java-dumper (4) Chunk 1 decrypted1.class decrypted2.class Chunk 2 decrypted3.class decrypted4.class Chunk N decrypted2N_1.class decrypted2N.class 25
  26. 26. Принцип работы плагина java-dumper (5) def scan_heaps(self,imm): # get all heaps heaps = imm.getHeapsAddress() for heap in heaps: pheap = imm.getHeap(heap) # get all chunks in current heap chunks = pheap.getChunks(0) for chunk in chunks: imm.log('[*] checking chunk at address 0x%08X' % chunk.addr) data = imm.readMemory(chunk.addr, chunk.size) self.check_java_class(imm, buf = data, chunk = chunk) def run(self, regs): imm = immlib.Debugger() self.regs = regs # scan memory self.scan_heaps(imm) 26
  27. 27. Принцип работы плагина java-dumper (6) Chunk 1 decrypted1.class decrypted2.class Chunk 2 decrypted3.class decrypted4.class Chunk N decrypted2N_1.class decrypted2N.class LEAKED 27
  28. 28. Принцип работы плагина java-dumper (7) Chunk i securedclassloader.class 28
  29. 29. Принцип работы плагина java-dumper (8) Chunk i securedclassloader.class LEAKED 29
  30. 30. Принцип работы плагина java-dumper (9) 30
  31. 31. Принцип работы плагина java-dumper (10) 31
  32. 32. Обход: с помощью плагина java-dumper сканируем память и вытаскиваем из нее securedclassloader.class, с помощью заданных алгоритмов шифрования и ключа получаем все необходимые java-классы Защита: Ooooops Уязвимость 6 Любой зашифрованный класс когда-нибудь расшифруется и загрузится в память 32
  33. 33. 1. Выявлено, что большая часть способов защиты java-приложений легко обходится с помощью известных программных инструментов и техник 2. Определено, что задача получения расшифрованных java-классов сводится к применению представленного плагина java-dumper Результы 33
  34. 34. • https://github.com/ASP-Labs/Java-dumper Ссылка на плагин 34

×