Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Современное состояние исследований и разработок в области автоматического анализа программ

SECR 2019
November 15, 2019

Современное состояние исследований и разработок в области автоматического анализа программ

Александр Герасимов
Старший научный сотрудник, ИСП РАН
SECR 2019

Обзор текущего состояния исследований и разработок в области автоматического анализа программ с учётом опыта разработки и применения инструментов автоматического анализа программ на наличие ошибок и уязвимостей безопасности.

SECR 2019

November 15, 2019
Tweet

More Decks by SECR 2019

Other Decks in Programming

Transcript

  1. Современное состояние исследований и разработок в области автоматического анализа программ

    Александр Герасимов ИСП РАН Software Engineering Conference Russia November 14-15, 2019. Saint-Petersburg
  2. Что такое ошибка в программе? • IEEE 1044-2019 Standard Classification

    of Software Anomalies • NIST. Software Error Analysis Defect, anomaly, error, failure, fault… – много терминов, мало смысла 2
  3. Что такое ошибка в программе? • IEEE 1044-2019 Standard Classification

    of Software Anomalies • NIST. Software Error Analysis Defect, anomaly, error, failure, fault… – много терминов, мало смысла Программа должна работать корректно в соответствии со спецификацией. 3
  4. Зачем искать ошибки? 4 0 2000 4000 6000 8000 10000

    12000 14000 16000 18000 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 Common Vulnerabilities and Exposures (CVE)
  5. Тестирование программы может весьма эффективно продемонстрировать наличие ошибок, но безнадёжно

    неадекватно для демонстрации их отсутствия. Тестирование 11 Эдсгер Вибе Дейкстра
  6. Покрытие кода 15 Автоматическое построение покрытия: • По базовым блокам

    • По исходам условных выражений • По исходам операндов условных выражений (MC/DC) if(a || b){ … } a T T F F b T F T F
  7. Покрытие кода 16 Автоматическое построение покрытия: • По базовым блокам

    • По исходам условных выражений • По исходам операндов условных выражений (MC/DC) • По путям
  8. Фаззинг: проблемы 18 void foo(long x) { if ( x

    == 1234567) { abort(); } } P(1234567) = " #$%#%&'$%( = 0,000000000232831
  9. Фаззинг: практика 19 Применение санитизации кода позволяет найти «тихие» ошибки

    • AddressSanitizer • LeakSanitizer • MemorySanitizer • ThreadSanitizer • UndefinedBehaviourSanitizer
  10. Фаззинг: инструменты 20 • Americal Fuzzy Lop • Radamsa •

    Peach Fuzzing Platform • Defensics • Syzkaller • ISP Fuzzer
  11. Динамическое Символьное исполнение 26 1975 – впервые дано описание метода

    2005 – первые автоматические инструменты Идея: целенаправленное построение тестового покрытия программы. Проблемы: низкая производительность. Причины: • Замедление работы программы из-за инструментации • Высокая вычислительная сложность решения задач SMT • Большое количество путей для исследования, чаще - ∞
  12. Статический анализ 29 1951 – Теорема Райса (Генри Гордон Райс)

    о невозможности определения нетривиальных свойств вычислимых функций. Расходимся…
  13. Статический анализ 30 1951 – Теорема Райса (Генри Гордон Райс)

    о невозможности определения нетривиальных свойств вычислимых функций. 1970-е: ситаксические анализаторы (lint) 2000-е: • Klocwork inSight • Coverity Prevent • Svace
  14. История 1. 1940-е: физическое удаление насекомых - debugging 2. 1950-е:

    Инспекция кода и тестирование 3. 1970-е: Стандарты кодирования и первые инструменты статического анализа (lint) 31 if (a == b) { … } if (a = b) { … }
  15. Статический анализ 32 char * cpabuf(char * buf){ char* p

    = NULL; if ( strlen( buf ) > 0 ) { if( buf [0] == ‘a’ ) { p = malloc( strlen( buf ) + 1); } else { logerror(‘unexpected input’); } } strcpy(p, buf); return p; } FD FP N T ID D I T N char * cpabuf char* buf T N FB = p char* NULL …
  16. Статический анализ 33 char * cpabuf(char * buf){ char* p

    = NULL; if ( strlen( buf ) > 0 ) { if( buf [0] == ‘a’ ) { p = malloc( strlen( buf ) + 1); } else { logerror(‘unexpected input’); } } strcpy(p, buf); return p; }
  17. Статический анализ 34 char * cpabuf(char * buf){ char* p

    = NULL; if ( strlen( buf ) > 0 ) { if( buf [0] == ‘a’ ) { p = malloc( strlen( buf ) + 1); } else { logerror(‘unexpected input’); } } strcpy(p, buf); return p; }
  18. Статический анализ 35 char * cpabuf(char * buf){ char* p

    = NULL; // Инициализация if ( strlen( buf ) > 0 ) { if( buf [0] == ‘a’ ) { p = malloc( strlen( buf ) + 1); } else { logerror(‘unexpected input’); } } strcpy(p, buf); // Реализация return p; }
  19. Статический анализ 36 char * cpabuf(char * buf){ char* p

    = NULL; // Инициализация if ( strlen( buf ) > 0 ) { if( buf [0] == ‘a’ ) { p = malloc( strlen( buf ) + 1); } else { logerror(‘unexpected input’); } } strcpy(p, buf); // Реализация return p; } void foo(){ char * a = cpabuf(“allow”); // Ok char * b = cpabuf(“deny”); // Error }
  20. Статический анализ 37 Проблемы: • Ложные предупреждения об ошибках •

    Пропуск ошибок Преимущества: • Производительность • Масштабируемость
  21. Как примененять? 38 Код Сборка Статический анализ ПО Отчёт и

    эксплойт Автотесты Отчёт Фаззинг Динамический анализ Отчёт Отчёт и эксплойт
  22. Комбинированные методы 42 • Fuzzing + Динамическое символьное исполнение: •

    Driller • Crusher • Статический анализ + динамическое символьное исполнение