static - defcon russia 20

Post on 06-Aug-2015

95 views 7 download

Transcript of static - defcon russia 20

Digital Security CheckCode group Anatoly Karpenko Alexey Kuzmenko

SA

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

Limbo of Static Code Analysis for Security

http://dsec.ru/

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

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

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

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

санитайзеры

3

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

4

Облако Боли

5

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

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

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

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

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

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

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

7

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

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

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

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

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

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

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

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

CWE – Common Weakness Enumeration CVE – Common Vulnerabilities and Exposures

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

12

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

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

13

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

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

14

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

С\С++ 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

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

16

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

∞ 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

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

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

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

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

19

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

Вот это полный синтаксис: 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

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

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

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

Используем ANTLR

Что?

Как?

Почему?

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

21

22

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

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

23

Грамматики 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

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

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

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

25

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

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

26

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

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

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

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

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

27

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

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

28

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

29

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

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

30

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

for Security, not for QA

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

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

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

32

for Security, not for QA

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

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

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

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

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

inception

33

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

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

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

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

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

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

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

34

….идей

….людей

….времени

Кладбище

35

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

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

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

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

36

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

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

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

Идея

Движок

37

Проверки

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

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

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

40

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

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

?

?

?

?

?

?

?

?

!

42

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

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