44
Кузьменко Алексей Аналитик ИБ, Digital Security Статический анализ кода: Гордость и Предубеждения

Статический анализ: гордость и предубеждения

  • View
    616

  • Download
    1

Embed Size (px)

Citation preview

Кузьменко АлексейАналитик ИБ, Digital Security

Статический анализ кода: Гордость и Предубеждения

Начала Στοιχεῖα

«Самая важная вещь, которую я сделал как программист за последние годы, — начал агрессивно применять статический анализ кода. Не столь значимы сотни серьёзных багов, которые удалось предотвратить, сколь смена ментальности и моего отношения к надёжности ПО и качеству кода».

*http://altdevblogaday.com/2011/12/24/static-code-analysis/

Джон Кармак

Начала Στοιχεῖα

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

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

Начала Στοιχεῖα

Pattern-based➔ Быстрое сканирование➔ Ищем специфичные паттерны (via regexp)➔ Интересует лишь факт паттерна, удобно для Security➔ Много false positiveFlow-based➔ Задумываемся о Control Flow, Data Flow, Code Property and etc➔ Позволяет выводить цикломатическую сложность➔ Межпроцедурный анализ➔ Логические ошибки ищутся легче – анализируем потокиMetrics based➔ Статистический подход к поиску, смесь паттернов и потоковCompiler/build output➔ Упрощаем жизнь с использованием дампов компиляторов и интерпретаторов➔ Просто делаем надстройки, модель анализа кода уже есть

Гордость есть из чего выбирать

Гордость - есть из чего выбирать

● 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● Onapsis: ABAP, Java● CheckMarx: Java,C/C++,Ruby,

PHP

● ErlangSecurity: Erlang● Brakeman: Ruby on Rails● Flow: JavaScript● Bandit: Python● Joern: C/C++● JSDetox: JavaScript● JSNice: JavaScript● ESLint: JavaScript(ScanJs)● Pysonar2: Python● NDepend: C#● …….. etc

Гордость Модели и техники

➔ SSA (Static Single Assignments)

➔ Pointer Analysis➔ AST, ASG(Abstract

Semantic Graph)➔ CFG, DFG, CPG➔ Tainted Analysis➔ Type-based, domain specific➔ Interval Analysis➔ Symbolic Analysis

В реальной жизни подходы и модели имеют определенные ограничения.Приходится делать нелегкий выбор между:

- точностью;- глубиной/полнотой;- масштабируемостью.

Гордость

gcc -fdump-tree-ssa=CoreCheck.ssa CoreCheck.cpp

……………………...int resval;//core -

stack address escape//resval = strlen(argv[0]);//---------------------------//core - NullDiferenceivec* nulltest;

if(argc > 5)nulltest = new ivec();

resval = nulltest->sq();myprint("nulldif test: %i\n", resval);

………….…………...

Гордость

void * D.2370; struct ivec * nulltest; int resval; int D.2368; void * nulltest.0; void * _7; void * nulltest.0_8; int _14;

<bb 2>: if (argc_3(D) > 5) goto <bb 3>; else goto <bb 4>;

<bb 3>: _7 = operator new (12); nulltest.0_8 = _7; ivec::ivec (nulltest.0_8); nulltest_10 = nulltest.0_8;

<bb 4>: # nulltest_1 = PHI <nulltest_4(D)(2), nulltest_10(3)> resval_12 = ivec::sq (nulltest_1); xprintf ("nulldif test: %i\n", resval_12); _14 = 0;

<L3>: return _14;

|-IfStmt 0x1d7a438 <line:41:2, line:42:23>| | |-<<<NULL>>>| | |-BinaryOperator 0x1d73f58 <line:41:5, col:12> '_Bool' '>'| | | |-ImplicitCastExpr 0x1d73f40 <col:5> 'int' <LValueToRValue>| | | | `-DeclRefExpr 0x1d73ef8 <col:5> 'int' lvalue ParmVar 0x1d73ae0 'argc' 'int'| | | `-IntegerLiteral 0x1d73f20 <col:12> 'int' 5| | |-BinaryOperator 0x1d7a410 <line:42:3, col:23> 'class ivec *' lvalue '='| | | |-DeclRefExpr 0x1d73f80 <col:3> 'class ivec *' lvalue Var 0x1d73e80 'nulltest' 'class ivec *'| | | `-CXXNewExpr 0x1d7a3b8 <col:14, col:23> 'class ivec *' Function 0x1d79b40 'operator new' 'void *(unsigned long) throw(class std::bad_alloc)'| | | `-CXXConstructExpr 0x1d7a388 <col:18, col:23> 'class ivec' 'void (void)'| | `-<<<NULL>>>

Гордость

clang -cc1 -ast-dump CoreCheck.cpp

Гордость - CFG,DFG, CPG

*https://www.tu-braunschweig.de/Medien-DB/sec/pubs/2014-ieeesp.pdf

Гордость - CFG,DFG, CPG

Clang++ -cc1 -analyze -analyzer-checker=debug.dumpDFG CoreCheck.cpp

Или

Scan-build -enable-checker debug.DumpCFG g++ -c CoreCheck.cpp

Предубеждения

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

CWE – Common Weakness EnumerationCVE – Common Vulnerabilities and Exposures

Гордость - Языки общего назначения, Типы, Caver

Type Casting -> Bad downcasting -> type-confusion vulnerability -> !Cast Verifier -> Caver

*https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-lee.pdf*https://www.usenix.org/sites/default/files/conference/protected-files/sec15_slides_lee_1.pdf

- Based on LLVM Compiler suites ( Added 3,540 lines of C++ code)

- Currently support Linux x86-64 - CaVer can be activated with one extra

compiler flag

Гордость - Языки общего назначения, Типы, Caver

Caver использует THTable, Runtime Type Information:

*https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-lee.pdf*https://www.usenix.org/sites/default/files/conference/protected-files/sec15_slides_lee_1.pdf

THTableInstrumentation

+ Caver Runtime

Secured ExecutableSource

Compile Link

Гордость - Языки общего назначения, Типы, Caver

Caver:THTable - Type Hierarchy Table для анализа

- используется для валидации и хранения инфомации о типах

- содержит множество всевозможных вариантов кастинга для типа T

- определяет два вида отношений:- is -a : имплементация наследования- has-a: имплементация композиции

Статика в типах

Гордость - Языки общего назначения, Типы, Caver

Статическая типизация подсказывает: cpp:int * some_mCPP(int, double, char*, int);

java:public static void some_mJava(int a, String b);

Но, что если так:cpp:template<typename T>int* some_mTCPP(T const& a, T &b);

java:public <T> staticvoid some_mGJava(int a, T b);

Динамика в типах

Гордость - Языки общего назначения, Типы, Caver

Динамическая типизация - непонятно:javascript:var p = {}; var p1 = function(i){

if(isFinite(i)) return {};return function(i){return i;};

}

Python:def avsv(f, *arg, **kwarg):

…….

Когда все - объект, вопрос остается: что именно за ним скрывается?..

Предубеждения

+ Множество материала+ Исследований множество+ “Проектов” много

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

Гордость - Языки общего назначения

Парсинг кода и его представление – отдельная и трудоемкая задача

#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«……………………………………………..

● С\С++ Clang\LLVM\GCC ● Java PMD\JDT\Spoon..● Python ast, redbaron...● JavaScript SpiderMonkey,ScriptEngine

(Nashorn) ParserAPI/Esprima…...

Решение: берем готовое

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

Гордость - Языки общего назначения

clang++ --analyze -Xanalyzer -analyzer-checker=core CoreChecker.cpp -o report или scan-build -enable-checker core

Гордость - Языки общего назначения

Предубеждения - Проблемно-ориентированные языки

● 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

● PeopleCode○ OOP, ISscript○ External C and PeopleCode○ …...

● SQLScript○ Call R Scripts○ Default database calls

Предубеждения - Проблемно-ориентированные языки

● Разработчики не используют всю мощность языка

● Но никогда не узнаешь, какую именно и кто….

➢ скудное описание в публичных источниках

➢ не все то полезно, что документация

➢ анализаторов практически нет○ анализаторов безопасности

еще меньше

● Все стандартно плюс свои особенности● Списки всех возможных функций, заложенных в runtime

языка● Несколько документаций для «перекрестного анализа»

различных версий● Не стоит верить внутренней документации системы –

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

Предубеждения - Проблемно-ориентированные языки

Предубеждения - Проблемно-ориентированные языки

Example:CALL METHOD oref->m1 EXPORTING para = : '1', '2', '3'.

Что бы это могло значить? Кортеж?

Предубеждения - Проблемно-ориентированные языки

Вот это полный синтаксис:CALL METHOD oref->m1 EXPORTING para = '1'. CALL METHOD oref->m1 EXPORTING para = '2'. CALL METHOD oref->m1 EXPORTING para = '3'.

Что говорит документация:[EXPORTING p1 = a1 p2 = a2 ...] [IMPORTING p1 = a1 p2 = a2 ...]

Такой разный Control Flow, который влечет за собой и разный Data Flow

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

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

Гордость- Что, Как, Почему

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

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

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

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

! Java! JavaScript! SQL! …….

? Abap ? SQLScript? XSJS

Гордость - ANTLR

Предубеждения- Все Пишем Сами

● Списки ключевых слов – для одного языка один блок 817 слов, без операторов

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

Предубеждения

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

Предубеждения - Не все то Security, что QA

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

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

● Но всегда останутся нюансы, что ты не учел……это нормально

Предубеждения - Не все то Security, что QA

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

Предубеждения - Не все то Security, что QA

//JS……………………..

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

//------- client

Предубеждения - Не все то Security, что QA

Предубеждения - Не все то Security, что QA

Предубеждения - Не все то Security, что QA

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

Для Security:

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

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

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

Предубеждения - Не все то Security, что QA

Предубеждения - Не все то Security, что QA

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

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

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

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

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

Проверки - долгий итеративный процесс исследований

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

Гордость- Не все то Security, что QA

● Нужно поддерживать общий тренд● Все возможные спецификации

безопасного кода● Категории уязвимостей и техники

эксплуатации● Иметь то, что не имеют другие, чтобы

только у вас это можно было получить

Гордость - Проверки и Движок

Заключение

“For this to work, you must ensure that your security team has the right skillset—in short, you want security folks with software development chops.”

“Secure programming with Static Analysis”

Телефон в МосквеТелефон в Санкт Петербурге

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