40
Digital Security CheckCode group Anatoly Karpenko Alexey Kuzmenko SA Боль Тлен Безысходность Кладбище Limbo of Static Code Analysis for Security http://dsec.ru/

static - defcon russia 20

Embed Size (px)

Citation preview

Page 1: static  - defcon russia 20

Digital Security CheckCode group Anatoly Karpenko Alexey Kuzmenko

SA

Боль Тлен Безысходность Кладбище

Limbo of Static Code Analysis for Security

http://dsec.ru/

Page 2: static  - defcon russia 20

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

Page 3: static  - defcon russia 20

Статический анализ Начало

QA Избыточность кода Лучшие практики Мертвый код Баг и false positive – разные вещи

Security Предотвращает проблемы с безопасностью Не любой анализ потоков это безопасность Валидация входящих параметров и

санитайзеры

3

Page 4: static  - defcon russia 20

БОЛЬ Статический анализ кода – это боль!

4

Page 5: static  - defcon russia 20

Облако Боли

5

Page 6: static  - defcon russia 20

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

Page 7: static  - defcon russia 20

• Pattern-based • Быстрое сканирование • Ищем специфичные паттерны (via regexp)

• Интересует лишь факт паттерна, удобно для Security • Много false positive

• Flow-based • Задумываемся о Control Flow, Data Flow, Code Property and etc • Позволяет выводить цикломатическую сложность • Межпроцедурный анализ • Логические ошибки ищутся легче – анализируем потоки

• Metrics based • Статистический подход к поиску, смесь между паттернами и потоками

• Compiler/build output • Упрощаем жизнь с использованием дампов компиляторов и интерпретаторов • Просто делаем надстройки, модель анализа кода уже сделана

Общие концепции построения анализа

7

Page 8: static  - defcon russia 20

Техники статического анализа ? 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

Page 9: static  - defcon russia 20

А вокруг мертвые с косами стоят…..

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

Page 10: static  - defcon russia 20

…но реальность такова, что

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

Page 11: static  - defcon russia 20

…но реальность такова, что

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

Page 12: static  - defcon russia 20

НЕ ВСЕ ТО CVE, ЧТО CWE

CWE – Common Weakness Enumeration CVE – Common Vulnerabilities and Exposures

…но реальность такова, что

12

Page 13: static  - defcon russia 20

+ Статей ОЧЕНЬ много + Исследований множество + Проектов много

- Продуктов мало - Проект не вырос до продукта - Не были доведены «до ума» - Прекратили развитие

13

Page 14: static  - defcon russia 20

ТЛЕН После черной полосы не наступает белая…..

…еще остается 49 оттенков серого

14

Page 15: static  - defcon russia 20

Языки общего назначения и их решения

С\С++ Clang\LLVM\GCC Java PMD\JDT 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

Page 16: static  - defcon russia 20

Интерфейсы чтения модели для имплементации , чтобы абстрагироваться от AST producer (e.g. parser vs AST dump file reader, etc).

16

Page 17: static  - defcon russia 20

Бизнес “проблемно-ориентированные” языки программирования

∞ 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

Page 18: static  - defcon russia 20

Бизнес ЯП

Стат. анализ

Анализ бизнес ориентированных языков - Проблемы

≠ скудное описание в публичных источниках ≠ не вся то полезно, что документация ≠ анализаторов практически нет

≠ анализаторов безопасности еще меньше

Разработчики не используют всю мощность языка Но никогда не узнаешь, какую именно и кто….

18

Page 19: static  - defcon russia 20

Анализ бизнес ориентированных языков

? Все стандартно плюс свои особенности ? Списки всех возможных функций заложенных в runtime языка ? Несколько документаций для «перекрестного анализа» различных версий

? Не стоит верить внутренней документации системы – ВЕРСИИ!!! ? Очень много, нереально много ключевых слов ? Отсутствие открытых грамматик для парсеров

Example: CALL METHOD oref->m1 EXPORTING para = : '1', '2', '3'. Что бы это могло значить?????

19

Page 20: static  - defcon russia 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

Page 21: static  - defcon russia 20

Что? Как? Почему?

Нет ничего, что могло бы помочь из готового для анализа таких языков

Пишем свой, на основе реализаций парсер-генераторов И анализаторов языков общего назначения

Используем ANTLR

Что?

Как?

Почему?

HQL Hibernate, IDEA, Netbeans and etc используют для себя Adaptive LL(*) Генерируется Lexer, Parser and Tree walkers(Visitor and Listener Patterns) Мы получаем часть работы for free

21

Page 22: static  - defcon russia 20

22

Page 23: static  - defcon russia 20

Безысходность Всё бежит по кругу….

Что бы ты ни делал, всё равно ты обречён

23

Page 24: static  - defcon russia 20

Грамматики ANTLRv4

https://github.com/antlr/grammars-v4

grammar Expr; prog: (expr NEWLINE)* ; expr: expr ('*'|'/') expr | expr ('+'|'-') expr | INT | '(' expr ')' ; NEWLINE : [\r\n]+ ; INT : [0-9]+ ;

ANTLR не совсем регулярные выражения, но описания правил терминалов им соответствует

! Java ! JavaScript ! SQL ! …….

? Abap ? SQLScript ? XSJS

24

Page 25: static  - defcon russia 20

Грамматики ANTLR пишем сами

Написал рул -> Тестанул -> Нашел боевой пример -> Тестанул грамматику -> романтика Что бы ты ни делал, всё равно ты обречён бежать по кругу

∞ Списки ключевых слов – для одного языка один блок 817 слов, без операторов ∞ Списки опций операторов – не поддается исчислению и оценке ∞ Списки встроенных «мощных ЭйПиАй» ∞ Сто пятьсот оттенков типов, видов, наименований идентификаторов ∞ Методы для общих языков – не работают ∞ Сами грамматики не менее пары тройки тысяч строк – ОПЦИИ зло!!

25

Page 26: static  - defcon russia 20

Не все то Security, что QA

Дерево показывает разбор – но никак не характеризует код, безысходность….

26

Page 27: static  - defcon russia 20

Не все то Security, что QA

Если использовать нечеткий разбор То о коде ничего сказать нельзя, кроме одного – корректен он или нет.

Если использовать островные, мостовые, атрибутные грамматики То о коде можно сказать больше – типы, вычисления, трансляции, учет контекста по объявлению блока.

Но всегда останутся нюансы, что ты не учел……

Это нормально

27

Page 28: static  - defcon russia 20

Знай свой язык и потенциальные векторы – чтобы лучше проектировать грамматику для анализатора

Не все то Security, что QA

28

Page 29: static  - defcon russia 20

Не все то Security, что QA

29

Page 30: static  - defcon russia 20

Не все то Security, что QA

toExcelDownload : function(oEvent){ document.location.href = "http:://hana21:8010/eerm/eermxs/xs/db.xsjs?dfrom=" + dates.SINCE + "&dto=" + dates.TO +""; } //------- client

30

Page 31: static  - defcon russia 20

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

Page 32: static  - defcon russia 20

for Security, not for QA

- Нельзя искать регулярными выражениями – нужно уметь итерироваться по модели

- Нельзя строить для каждого исходника модель – это слишком дорого, нужен компромисс

- Нельзя пренебрегать мелочами – от них зависит контекст, важно выделить главное

32

Page 33: static  - defcon russia 20

for Security, not for QA

Без контекста – анализ безопасности кода, просто кусок буковок синтаксических моделей

А нам важна еще семантика

Но опять же не везде и не во всем

«Я специализируюсь на весьма специфическом виде безопасности

безопасности подсознания»

inception

33

Page 34: static  - defcon russia 20

Если с другом вышел в путь….

…то умрете оба

- Без качественной грамматики не будет качественного анализатора

- Но все это долгий бесконечный процесс по улучшению, дизайну и разработке

Не стоит жалеть времени на фундамент

Но и не стоит уходить в долгий сплин итеративности

Все имеет бесконечный потенциал улучшения

34

Page 35: static  - defcon russia 20

….идей

….людей

….времени

Кладбище

35

Page 36: static  - defcon russia 20

Хороший анализатор – это движок * проверки

Проверки – это долгий итеративный ресерч

Движок – это долгая бесконечная разработка

Главное правило реальности — не запутаться в своих иллюзиях.

36

Page 37: static  - defcon russia 20

Какой самый живучий паразит?

Я имею в виду сформировавшуюся идею, полностью осознанную, поселившуюся в голове.

Она живуча и крайне заразна. Стоит идее завладеть мозгом, избавиться от неё уже практически невозможно.

Идея

Движок

37

Page 38: static  - defcon russia 20

Проверки

Исследовать — значит видеть то, что видели все, и думать так, как не думал никто.

Альберт Сент-Дьёрди

- Нужно поддерживать общий тренд - Все возможные спецификации безопасного кода - Категории уязвимостей и техники эксплуатации - Иметь то, что не имеют другие, чтобы только у вас это можно было получить

40

Page 39: static  - defcon russia 20

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

Page 40: static  - defcon russia 20

Спасибо за внимание ?

?

?

?

?

?

?

?

?

!

42

Не стоит бояться быть

посмелее, малыш!