Анонс фаззера Atheris Python
Fuzz-тестирование - это хорошо известный метод выявления ошибок программирования. Многие из обнаруживаемых ошибок имеют серьезные последствия для безопасности. С помощью этого метода Google смогла обнаружить тысячи уязвимостей и других ошибок. Фаззинг традиционно используетсчя на нативных языках, таких как C или C++, но в прошлом году Google создала новый движок фаззинга Python. Сегодня она выпустила фаззинг-движок Atheris с открытым исходным кодом.
Что умеет Atheris?
Atheris можно использовать для автоматического поиска ошибок в коде Python и собственных расширениях. Atheris - фаззер, с «упавляемым покрытием», что означает, что Atheris будет многократно пробовать различные входные данные для вашей программы, наблюдая, как она выполняется, и пытаться найти интересные пути.
Одно из лучших применений Atheris - это дифференциальные фаззеры. Это фаззеры, которые ищут различия в поведении двух библиотек, которые предназначены для решения одних и тех же задач. Один из примеров фаззеров, поставляемых с Atheris, сравнивает работу пакета Python «idna» с пакетом C «libidn2». Оба этих пакета предназначены для декодирования и разрешения интернационализированных доменных имен. Однако, данный пример с фазером idna_uts46_fuzzer.py показывает, что они не всегда дают одинаковые результаты. Если вы когда-нибудь решили приобрести домен, содержащий (Unicode codepoints [U+0130, U+1df9]), вы обнаружите, что библиотеки idna и libidn2 разрешают этот домен для двух совершенно разных веб-сайтов.
Atheris полезен для чистого кода Python всякий раз, когда у вас есть способ выразить, что такое «правильное» поведение или какое поведение определенно неверно. Это может быть набор обычного кода в фазере, который оценивает правильность вывода библиотеки, или проверяет отсутствия непредвиденных исключений. Последний случай очень полезен. В то время как наихудшим результатом неожиданного исключения является отказ в обслуживании (вызывающий сбой программы), непредвиденные исключения, как правило, выявляют более серьезные ошибки в библиотеках. Например, одна из библиотек синтаксического анализа YAML, на которой тестировался Atheris, говорит, что она будет вызывать только ошибки YAMLErrors; однако yaml_fuzzer.py обнаруживает множество других исключений, таких как ValueError при попытке интерпретировать «-_» как целое число или TypeError при попытке использовать список в качестве ключа в dict. Это указывает на недостатки парсера.
Наконец, Atheris поддерживает фаззинг собственных расширений Python с помощью libFuzzer. libFuzzer - это механизм фаззинга, интегрированный в Clang, обычно используемый для фаззинга C или C ++. При использовании libFuzzer с Atheris, Atheris может находить все ошибки, описанные ранее, а также ошибки повреждения памяти, которые существуют только в собственном коде. Atheris поддерживает Clang sanitizers Address Sanitizer и Undefined Behavior Sanitizer. Это позволяет легко обнаружить повреждение заранее. В одном случае автор этого документа обнаружил ошибку LLVM с помощью фаззера Atheris.
Что поддерживает Atheris?
Atheris поддерживает фаззинг кода Python и собственные расширения в Python 2.7 и Python 3.3+. При фаззинге кода Python настоятельно рекомендуется использовать Python 3.8+, поскольку он позволяет получить гораздо лучшую информацию о покрытии. При фаззинге собственных расширений Atheris можно использовать в сочетании с Address Sanitizer или Undefined Behavior Sanitizer. OSS-Fuzz - это сервис фаззинга от Google, где бесплатно работает фаззер для открытого исходного кода. OSS-Fuzz скоро будет поддерживать Atheris!
С чего начать?
Взгляните на репозиторий, в частности на примеры. Для фаззинга чистого Python все очень просто:
Код:
pip3 install atheris
А затем просто определите функцию TestOneInput, которая запускает код, который вы хотите фаззировать:
Код:
import atheris
import sys
def TestOneInput(data):
if data == b"bad":
raise RuntimeError("Badness!")
atheris.Setup(sys.argv, TestOneInput)
atheris.Fuzz()
Это все! Atheris будет многократно вызывать TestOneInput и отслеживать поток выполнения, пока не произойдет сбой или исключение.
Для получения дополнительных сведений, в том числе о том, как фаззить собственный код, см. README.
Оригинал статьи: https://opensource.googleblog.com/2020/12/announcing-atheris-python-fuzzer.html
Автор перевода: PicMe, для xss.pro