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.

static - defcon russia 20

1,015 views

Published on

http://defcon-russia.ru

Published in: Technology
  • Be the first to comment

static - defcon russia 20

  1. 1. Digital Security CheckCode group Anatoly Karpenko Alexey Kuzmenko SA Боль Тлен Безысходность Кладбище Limbo of Static Code Analysis for Security http://dsec.ru/
  2. 2. The most important thing whom I making as the programmer during the last years — it starting to apply static analysis of the code aggressively. John Carmack Not so hundreds serious bugs whom it were possible to prevent, how many change of mentality and my relation to reliability of a software and quality of the code НО… 2
  3. 3. Статический анализ Начало  QA  Избыточность кода  Лучшие практики  Мертвый код  Баг и false positive – разные вещи  Security  Предотвращает проблемы с безопасностью  Не любой анализ потоков это безопасность  Валидация входящих параметров и санитайзеры 3
  4. 4. БОЛЬ Статический анализ кода – это боль! 4
  5. 5. Облако Боли 5
  6. 6. Open Source Commercial • Splint С • Frama-С C • SonarQube C/Java/PHP • FindBugs Java • CppCheck C/C++ • PyLint Python • AdaControl Ada • JSLint JavaScript • PMD Java • SonarQube C,Java,PHP • CodeSonar C/C++,Java,bin • Parasoft C/C++,Java,.NET • KlocWork C++,C,C#,Java • Coverity C++,C,C#,Java • HP Fortify C++,C,C#,Java • IBM AppScan Java • LDRA C/C++ • MathWork Polyspace Bug Finder C,C++ • Veracode C/C++,Java,PHP,Ruby • CheckMarx Java,C/C++,Ruby,PHP 6
  7. 7. • Pattern-based • Быстрое сканирование • Ищем специфичные паттерны (via regexp) • Интересует лишь факт паттерна, удобно для Security • Много false positive • Flow-based • Задумываемся о Control Flow, Data Flow, Code Property and etc • Позволяет выводить цикломатическую сложность • Межпроцедурный анализ • Логические ошибки ищутся легче – анализируем потоки • Metrics based • Статистический подход к поиску, смесь между паттернами и потоками • Compiler/build output • Упрощаем жизнь с использованием дампов компиляторов и интерпретаторов • Просто делаем надстройки, модель анализа кода уже сделана Общие концепции построения анализа 7
  8. 8. Техники статического анализа ? SSA (Static Single Assignments) ? Pointer Analysis ? AST, ASG(Abstract Semantic Graph) ? CFG, DFG, CPG ? Tainted Analysis ? Type-based, domain specific ? Interval Analysis ? Symbolic Analysis В реальной жизни подходы и модели имеют определенные ограничения Приходится делать нелегкий выбор между: - Точностью - Глубиной/Полнотой - Масштабируемостью 8
  9. 9. А вокруг мертвые с косами стоят….. gcc -fdump-tree-ssa=if.ssa if.c int main(){ int a; int b; printf("Enter a number you want to check.n"); scanf("%d",&a); if((a%2)==0){b = a + 1;} else{b = a - 6;} return b; } if (_4 == 0) goto <bb 3>; Else goto <bb 4>; <bb 3>: a.2_5 = a; b_6 = a.2_5 + 1; goto <bb 5>; <bb 4>: a.3_7 = a; b_8 = a.3_7 + -6; <bb 5>: # b_1 = PHI <b_6(3), b_8(4)> _9 = b_1; a ={v} {CLOBBER}; <L4>: return _9; 9
  10. 10. …но реальность такова, что if (true) { … } // fixed conditional, not recommended if (x) { // original implementation if (y) { if (x && y) { // optimized implementation // свертка не всегда хорошо if (someVar === true) { // Ok – pattern-based } if (someVar !== 3) { // Ok – patter-based } if (someVar == true) { // Bad – pattern-based } if (someVar != 3) { // Bad – pattern-based } 10
  11. 11. …но реальность такова, что public class Estate { // Noncompliant; array contents can be modified public static final String [] HEIRS = new String [] { "Betty", "Suzy" }; } public class Malicious { public void changeWill() { Estate.HEIRS[0] = "Biff"; if (Estate.HEIRS.length > 1) { for (int i = 1; i < Estate.HEIRS.length; i++) { Estate.HEIRS[i] = ""; } } } MITRE, CWE-582 - Array Declared Public, Final, and Static MITRE, CWE-607 - Public Static Final Field References Mutable Object 11
  12. 12. НЕ ВСЕ ТО CVE, ЧТО CWE CWE – Common Weakness Enumeration CVE – Common Vulnerabilities and Exposures …но реальность такова, что 12
  13. 13. + Статей ОЧЕНЬ много + Исследований множество + Проектов много - Продуктов мало - Проект не вырос до продукта - Не были доведены «до ума» - Прекратили развитие 13
  14. 14. ТЛЕН После черной полосы не наступает белая….. …еще остается 49 оттенков серого 14
  15. 15. Языки общего назначения и их решения  СС++ ClangLLVMGCC  Java PMDJDT  Python ast  JavaScript SpiderMonkey ParserAPI/Esprima  ….. #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclObjC.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/Expr.h" #include "clang/AST/ExprObjC.h" #include "clang/AST/StmtVisitor.h" #include "clang/AST/Type.h« …………………………………………….. Решение: берем готовое Парсинг кода и его представление – отдельная и трудоемкая задача 15
  16. 16. Интерфейсы чтения модели для имплементации , чтобы абстрагироваться от AST producer (e.g. parser vs AST dump file reader, etc). 16
  17. 17. Бизнес “проблемно-ориентированные” языки программирования ∞ Table-driven programming ∞ Высокоуровневое манипулирование состоянием данных ∞ Мощные операторы и функции без оперирования состоянием ∞ Report-generator ∞ Генерация форм ∞ Генерация документов ∞ Одна команда – один отчет ∞ Data management ∞ Косвенное управление данными ( в нашем случае реляционных ) ∞ Мульти типовая типизация ∞ Server-side JavaScript ( XSJS ) ∞ Request processing ∞ Database ∞ HTTP Outbound ∞ Trace ∞ Job Scheduling ∞ ABAP ∞ OOP ∞ BSP ∞ WebDynPro ∞ Database ∞ System Calls ∞ SQLScript ∞ Call R Scripts ∞ Default database calls 17
  18. 18. Бизнес ЯП Стат. анализ Анализ бизнес ориентированных языков - Проблемы ≠ скудное описание в публичных источниках ≠ не вся то полезно, что документация ≠ анализаторов практически нет ≠ анализаторов безопасности еще меньше  Разработчики не используют всю мощность языка  Но никогда не узнаешь, какую именно и кто…. 18
  19. 19. Анализ бизнес ориентированных языков ? Все стандартно плюс свои особенности ? Списки всех возможных функций заложенных в runtime языка ? Несколько документаций для «перекрестного анализа» различных версий ? Не стоит верить внутренней документации системы – ВЕРСИИ!!! ? Очень много, нереально много ключевых слов ? Отсутствие открытых грамматик для парсеров Example: CALL METHOD oref->m1 EXPORTING para = : '1', '2', '3'. Что бы это могло значить????? 19
  20. 20. Анализ бизнес ориентированных языков Вот это полный синтаксис: CALL METHOD oref->m1 EXPORTING para = '1'. CALL METHOD oref->m1 EXPORTING para = '2'. CALL METHOD oref->m1 EXPORTING para = '3'. А документация? Call m1 Как понимали Как надо [‘1’,’2’,’3’] Call m1 Call m1 Call m1 [‘1’] [‘2’] [‘3’] [EXPORTING p1 = a1 p2 = a2 ...] [IMPORTING p1 = a1 p2 = a2 ...] Такой разный Control Flow, который влечет за собой и разный Data Flow 20
  21. 21. Что? Как? Почему? Нет ничего, что могло бы помочь из готового для анализа таких языков Пишем свой, на основе реализаций парсер-генераторов И анализаторов языков общего назначения Используем ANTLR Что? Как? Почему? HQL Hibernate, IDEA, Netbeans and etc используют для себя Adaptive LL(*) Генерируется Lexer, Parser and Tree walkers(Visitor and Listener Patterns) Мы получаем часть работы for free 21
  22. 22. 22
  23. 23. Безысходность Всё бежит по кругу…. Что бы ты ни делал, всё равно ты обречён 23
  24. 24. Грамматики ANTLRv4 https://github.com/antlr/grammars-v4 grammar Expr; prog: (expr NEWLINE)* ; expr: expr ('*'|'/') expr | expr ('+'|'-') expr | INT | '(' expr ')' ; NEWLINE : [rn]+ ; INT : [0-9]+ ; ANTLR не совсем регулярные выражения, но описания правил терминалов им соответствует ! Java ! JavaScript ! SQL ! ……. ? Abap ? SQLScript ? XSJS 24
  25. 25. Грамматики ANTLR пишем сами Написал рул -> Тестанул -> Нашел боевой пример -> Тестанул грамматику -> романтика Что бы ты ни делал, всё равно ты обречён бежать по кругу ∞ Списки ключевых слов – для одного языка один блок 817 слов, без операторов ∞ Списки опций операторов – не поддается исчислению и оценке ∞ Списки встроенных «мощных ЭйПиАй» ∞ Сто пятьсот оттенков типов, видов, наименований идентификаторов ∞ Методы для общих языков – не работают ∞ Сами грамматики не менее пары тройки тысяч строк – ОПЦИИ зло!! 25
  26. 26. Не все то Security, что QA Дерево показывает разбор – но никак не характеризует код, безысходность…. 26
  27. 27. Не все то Security, что QA Если использовать нечеткий разбор То о коде ничего сказать нельзя, кроме одного – корректен он или нет. Если использовать островные, мостовые, атрибутные грамматики То о коде можно сказать больше – типы, вычисления, трансляции, учет контекста по объявлению блока. Но всегда останутся нюансы, что ты не учел…… Это нормально 27
  28. 28. Знай свой язык и потенциальные векторы – чтобы лучше проектировать грамматику для анализатора Не все то Security, что QA 28
  29. 29. Не все то Security, что QA 29
  30. 30. Не все то Security, что QA toExcelDownload : function(oEvent){ document.location.href = "http:://hana21:8010/eerm/eermxs/xs/db.xsjs?dfrom=" + dates.SINCE + "&dto=" + dates.TO +""; } //------- client 30
  31. 31. var id = $.request.getParameter("dfrom"); var val1 = $.request.getParameter("dto"); var conn = $.db.getConnection(); var st = prepareStatement("INSERT INTO "TABLE1" values("+id+","+val1+")"); Не все то Security, что QA 31
  32. 32. for Security, not for QA - Нельзя искать регулярными выражениями – нужно уметь итерироваться по модели - Нельзя строить для каждого исходника модель – это слишком дорого, нужен компромисс - Нельзя пренебрегать мелочами – от них зависит контекст, важно выделить главное 32
  33. 33. for Security, not for QA Без контекста – анализ безопасности кода, просто кусок буковок синтаксических моделей А нам важна еще семантика Но опять же не везде и не во всем «Я специализируюсь на весьма специфическом виде безопасности безопасности подсознания» inception 33
  34. 34. Если с другом вышел в путь…. …то умрете оба - Без качественной грамматики не будет качественного анализатора - Но все это долгий бесконечный процесс по улучшению, дизайну и разработке Не стоит жалеть времени на фундамент Но и не стоит уходить в долгий сплин итеративности Все имеет бесконечный потенциал улучшения 34
  35. 35. ….идей ….людей ….времени Кладбище 35
  36. 36. Хороший анализатор – это движок * проверки Проверки – это долгий итеративный ресерч Движок – это долгая бесконечная разработка Главное правило реальности — не запутаться в своих иллюзиях. 36
  37. 37. Какой самый живучий паразит? Я имею в виду сформировавшуюся идею, полностью осознанную, поселившуюся в голове. Она живуча и крайне заразна. Стоит идее завладеть мозгом, избавиться от неё уже практически невозможно. Идея Движок 37
  38. 38. Проверки Исследовать — значит видеть то, что видели все, и думать так, как не думал никто. Альберт Сент-Дьёрди - Нужно поддерживать общий тренд - Все возможные спецификации безопасного кода - Категории уязвимостей и техники эксплуатации - Иметь то, что не имеют другие, чтобы только у вас это можно было получить 40
  39. 39. For this to work, you must ensure that your security team has the right skill set—in short, you want security folks with software development chops. “Secure programming with Static Analysis” Mess with the best - die like the rest 41
  40. 40. Спасибо за внимание ? ? ? ? ? ? ? ? ? ! 42 Не стоит бояться быть посмелее, малыш!

×