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

CodeFest 2019. Максим Бакиров (2ГИС) — Тестиров...

CodeFest
April 06, 2019

CodeFest 2019. Максим Бакиров (2ГИС) — Тестирование мусорными данными с libFuzzer

Поисковый запрос в 2ГИС содержит 25+ параметров, начиная c введённого текста и заканчивая персональными предпочтениями пользователя. Чтобы обеспечить стабильную работу приложения, мы решили не ограничиваться тестовыми запросами, сгенерированными человеческой логикой. Так в нашей жизни появился фаззинг — тестирование приложения на неправильных, неожиданных или случайных данных. На примере библиотеки libFuzzer расскажу про фаззинг. Узнаем, какую магию он использует под капотом, чтобы находить баги в коде, и как с помощью API его приручить. Не обойдём вниманием приёмы по интеграции в пайплайн разработки.

CodeFest

April 06, 2019
Tweet

More Decks by CodeFest

Other Decks in Technology

Transcript

  1. Это вообще работает? Баг случается с вероятностью 0,000001 = вероятность

    стабильной работы 0,999999 Вызовов 1 млн. 0,999999 ^ 1000000 ~ 0,37 вероятность, что функция отработает стабильно
  2. 17%

  3. libFuzzer ✓ Удобное и расширяемое C-API для интеграции ✓ Входит

    в поставку с компилятором Clang >= 6 ✓ Хорошая документация
  4. 1.bool FuzzMe(Char data[ ], Int8 size /*[0,128)*/) { 2. return

    size >= 3 && 3. data[0] == 'F' && 4. data[1] == 'U' && 5. data[2] == 'Z' && 6. data[3] == 'Z'; 7.}
  5. 1.bool FuzzMe(Char data[ ], Int8 size /*[0,128)*/) { 2. return

    size >= 3 && // data[ ] = “FUZ”, size = 3 3. data[0] == 'F' && // OK 4. data[1] == 'U' && // OK 5. data[2] == 'Z' && // OK 6. data[3] == 'Z'; // ← Out of bounds access 7.}
  6. Как это устроено? тестовый корпус → вызов функции → оценка

    сценариев → следующее поколение → мутации данных → ∞ → артефакты
  7. Подытожим тестовый корпус → вызов функции → оценка сценариев →

    следующее поколение → мутации данных → ∞ → артефакты
  8. Что получилось — Нашли 10 потенциальных крашей — Внедрили в

    пайплайн разработки — Оцениваем регрессию
  9. Полезные ссылки Библиотеки libFuzzer — https://llvm.org/docs/LibFuzzer.html American fuzzy lop —

    http://lcamtuf.coredump.cx/afl/ PyJFuzz — https://github.com/mseclab/PyJFuzz HeartBleed — http://heartbleed.com Баг, найденный PyJFuzz — https://github.com/cesanta/frozen/issues/15 Доклад про Monkey Testing — https://2017.codefest.ru/lecture/1141 Доклад про Fuzzing компилятора — https://www.youtube.com/watch?v=S2vBz_ZPAbc
  10. Не подходит если: — Функция выполняется за 10 мс —

    Входные данные сильно ограничены и структурированы
  11. Не подходит если: — Функция выполняется за 10 мс —

    Входные данные сильно ограничены и структурированы — Функция меняет своё поведение от вызова к вызову
  12. Как внедряли собрали проект-приложение → из коробки мало → свои

    мутаторы → реальные данные → оценка результатов → CI
  13. Как внедряли собрали проект-приложение → из коробки мало → свои

    мутаторы → реальные данные → оценка результатов → CI
  14. Как внедряли собрали проект-приложение → из коробки мало → свои

    мутаторы → реальные данные → оценка результатов → CI
  15. Как внедряли собрали проект-приложение → из коробки мало → свои

    мутаторы → реальные данные → оценка результатов → CI
  16. Как внедряли собрали проект-приложение → из коробки мало → свои

    мутаторы → реальные данные → оценка результатов → CI
  17. Как внедряли собрали проект-приложение → из коробки мало → свои

    мутаторы → реальные данные → оценка результатов → CI
  18. $ echo "aaa" | radamsa aaaa $ echo "aaa" |

    radamsa :aaa $ echo "Fuzztron 2000" | radamsa Fuzztron 4294967296 Radamsa
  19. $ echo "100 * (1 + (2 / 3))" |

    radamsa | bc […] (standard_in) 1418: illegal character: ^_ (standard_in) 1422: syntax error (standard_in) 1424: syntax error (standard_in) 1424: memory exhausted [hang] Radamsa