The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Google открыл Atheris, инструментарий для fuzzing-тестирования кода на языке Python

06.12.2020 11:01

Компания Google объявила об открытии исходных текстов проекта Atheris, развивающего специализированный инструментарий для fuzzing-тестирования кода на языке Python и расширений для CPython, написанных на C/C++. Проект использует движок на основе libFuzzer и может применяться совместно с инструментами Address Sanitizer и Undefined Behavior Sanitizer для выявления дополнительных ошибок. Код открыт под лицензией Apache 2.0.

Поддерживается проверка кода на Python 2.7 и Python 3.3+, но для полноценного учёта покрытия кода (coverage guided) рекомендуется использовать ветки Python 3.8 и 3.9, в которых появилась поддержка статистики opcode-by-opcode. В процессе работы Atheris перебирает возможные комбинации входных данных и генерирует отчёт о всех выявленных сбоях и неперехваченных исключениях. Например, при проверке в Atheris библиотеки разбора формата YAML было выявлено, что некоторые YAML-конструкции, такие как указание "-_" вместо целого значения или использование списка вместо ключа, приводят к возникновению непредусмотренного исключения вместо штатной ошибки YAMLErrors.

Atheris также можно применять для выявления отличий в поведении библиотек, нацеленных для выполнения идентичных задач. Например, при сводной проверке Python-пакета "idna" и библиотеки "libidn2", которые выполняют задачу декодирования интернационализированных доменных имён, было выявлено, что они не всегда выдают одинаковый результат. В частности, если в домене использовались Unicode-последовательности [U+0130, U+1df9], то "idna" и "libidn2" преобразовывали интернационализированное доменное имя в разные хосты.

Напомним, что при fuzzing-тестировании осуществляется генерация потока всевозможных случайных комбинаций входных данных, приближенных к реальным данным (например, html-страницы с случайными параметрами тегов, архивы или изображения с аномальными заголовками и т.п.), и фиксация возможных сбоев в процессе их обработки. Если какая-то последовательность приводит к исключению или не соответствует ожидаемой реакции, то такое поведение с высокой вероятностью свидетельствует об ошибке или уязвимости.

  1. Главная ссылка к новости (https://opensource.googleblog....)
  2. OpenNews: Атака на системы online-компиляции через манипуляцию с заголовочными файлами
  3. OpenNews: Facebook представил Pysa, статический анализатор для языка Python
  4. OpenNews: Проект Mozilla представил FuzzDB, базу данных типовых шаблонов атак
  5. OpenNews: Итоги пяти месяцев изучения безопасности СПО проектом OSS-Fuzz
  6. OpenNews: Google открыл код ClusterFuzz, платформы для выявления ошибок и уязвимостей
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/54204-fuzzer
Ключевые слова: fuzzer, atheris
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (41) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 11:14, 06/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Я одного не могу понять, а почему Гугл НЕ создал эту программу открытой изначально?
     
     
  • 2.3, Аноним (3), 11:20, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    наверно потому, что сам он этого не делал, а опять купил, как и ВСЕ остальные проекты? Да-да, даже нынешний поисковик гугла - купленный.
     
     
  • 3.9, макаронофикус (?), 12:28, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    >> нынешний поисковик гугла - купленный.

    Поделись, пжа, источником.

     
     
  • 4.18, 101 (??), 14:40, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +8 +/
    Вот здесь можно посметреть что купил google, в том числе и поисковики
    https://en.wikipedia.org/wiki/List_of_mergers_and_acquisitions_by_Alphabet
     
     
  • 5.45, Аноним (45), 17:27, 07/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Если пройтись по ссылкам из таблицы, там написано, что наработки купленных текстовых поисковиков использовались только для вычисления рейтинга для сортировки результатов.
     
     
  • 6.47, anonimous (?), 01:08, 08/12/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >Если пройтись по ссылкам из таблицы, там написано, что наработки купленных текстовых поисковиков использовались только для вычисления рейтинга для сортировки результатов.

    Это как-бы в поисковике самое главное. Остальное это робот для выкачки файлов по ссылкам.

     
     
  • 7.48, Аноним (48), 02:25, 08/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    В Гугле главное — это децентрализация. Он смог подняться благодаря тому, что за поиск отвечал не один-единственный супермощный и дорогой сервер, как у той же Альтависты, а скачанные страницы и индексы были с самого начала разбросаны по почти десятку разнородных машин (и интелы, и спарки, и пауэры). Чтобы угнаться за ростом Интернета, ему достаточно тупо докупать новые сервера для датацентров. Их уже миллионы.
     
  • 2.5, Аноним (5), 11:23, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +10 +/
    А с чего им делиться с конкурентами полезными наработками, в которые они вложили деньги? А вот когда оно стало ненужно или полезность не оправдала ожиданий - выкидываешь в опен сорс - кушайте, не обляпайтесь. Гугл теперь выглядит белым и пушистым - "поделился", а поддерживают пусть кто хочет своими силами. Бонус поинты за рализ только сырцов без документации и инструментов сборки - вроде и открыли, а долбиться никто не захочет.
     
     
  • 3.24, Аноним (24), 19:47, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вы правы, но это лучше чем ничего. Когда даже уже древнее ПО все еще не хотят открывать это грустно, кому-то да может понадобиться...
     
  • 2.12, погроммист (?), 13:03, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +9 +/
    В компаниях вроде гугла используется тонна внутренних сервисов и библиотек: от собственной системы сборки и CI, до собственной VCS и диалекта ЯП. Оно сильно интегрировано между собой, что даёт серьезный буст производительности разработчикам, но затрудняет открытие сорцов. Нужно потратить уйму времени на рутинное отвязывание кода от всего этого NIH добра, а также настроить синхронизацию внешнего кода с внутренней монорепой, выделить человека для связи с общественностью (категоризацию багов, внешнего код ревью).
     
  • 2.15, Аноним (15), 13:42, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Дав ваще беспредел! Скрывают от сообщества сырые неюзабельные прототипы без документации!
     
  • 2.16, commiethebeastie (ok), 14:21, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Потому что код может быть написан так, что годен только для внутреннего использования.
     

  • 1.7, Аноним (-), 11:51, 06/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    > libFuzzer

    Хочу такую же, но для gcc !!!

     
     
  • 2.13, погроммист (?), 13:11, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Его вроде можно и к GCC >= 9.0 прикрутить (но я не пробовал). См. man gcc /-fsanitize-coverage=
     
  • 2.14, Аноним (15), 13:40, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Тебе не пофиг, чем *тестовую* сборку делать?
     
     
  • 3.22, Аноним (-), 18:15, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Не пофиг
     
  • 2.31, Аноним (31), 07:15, 07/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Эээ, american fuzzy loop не подойдёт?
     

  • 1.20, Аноним (20), 17:15, 06/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    >version = subprocess.check_output(

    [current_path + "/setup_utils/check_libfuzzer_version.sh", libfuzzer])

    вот у вас питон есть, зачем всякое говно через subprocess вызывать?

     
     
  • 2.21, Аноним (21), 17:49, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Как это ни удивительно, некоторые вещи проще и адекватнее делать на шелле. А главное быстрее. Когда это что-то сложнее запустить 1-2 программы и сравнить полтора значения, тут уже возможны варианты.
     
     
  • 3.32, Аноним (31), 07:19, 07/12/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    В вызываемом там скрипте не делается ничего такого, что на питоне не ложится в сравнимое или меньшее количество строчек. Просто поиск текста в выводе objdump.
     
     
  • 4.33, Аноним (21), 07:24, 07/12/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Зачем из питона вызывать шел с питоном (ну или без шела)? Нужен более многострочный и менее читаемый вариант? Нормальный, не вызывающий отвращения вариант аналогичного кода, будет значительно больше. И он будет менее удобен для сопровождения.
     
  • 2.23, Аноним (-), 18:20, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • –3 +/
    вы ничего не понимаете.... питон - это для другого....
     
  • 2.25, Вадик (??), 19:55, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    А чего сюда-то писать, можно же прямо к ним с этим придти и с коммитом если считаешь что неправильно.
     
     
  • 3.26, Аноним (20), 21:06, 06/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    1. Зачем мне выполнять за Гугл его работу?
    2. ... с перспективой получить ответ "и без твоего PR прекрасно жили"?
     
     
  • 4.35, VALERII (?), 09:43, 07/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    А мне интересно как можно проверить на Питоне или другом языке следующее:
    # libfuzzer = /path/to/libFuzzer*.a
    if objdump -t "$libfuzzer" | grep "LLVMFuzzerRunDriver" > /dev/null; then
      echo "up-to-date"
    else
      if objdump -t "$libfuzzer" | grep "__sanitizer_cov_8bit_counters_init" > /dev/null; then
        echo "outdated-recoverable"
      else
        echo "outdated-unrecoverable"
      fi
    fi
     
     
  • 5.42, Ordu (ok), 12:50, 07/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Можно попробовать сделать dlopen, и получить адрес символа -- если адреса не нашлось, значит символа нету. Правда это в C, в пайтоне, наверное, всё немного иначе.
     
  • 5.46, Аноним (20), 23:05, 07/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    from pathlib import Path

    libfuzzer = next(Path("/path/to").glob("libFuzzer*.a"))

    import sh

    odt = sh.Command("objdump").bake(t=True)

    ls = odt(libfuzzer).splitlines()

    def chk(sym, msg):
        for l in ls:
            if l.find(sym) > -1:
                print(msg)
                sys.exit(0)


    chk("LLVMFuzzerRunDriver", "up-to-date")
    chk("__sanitizer_cov_8bit_counters_init", "outdated-recoverable")

    print("outdated-unrecoverable")

     
     
  • 6.49, VALERII (?), 21:38, 08/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    так это тоже самое + sh это pip пакет, который нужно доставлять
     
     
  • 7.50, Аноним (50), 23:44, 08/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    sh не обязательно ставить, можно обойтись subprocess, просто как через subprocess делается я навскидку не скажу.
     
  • 7.51, Аноним (50), 23:51, 08/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Насчёт "то же самое" - зато извращаться не приходится с грепами. С чуть более сложным скриптом извращаться пришлось бы с седами авками и ксаргами и expr. Плюс можно избавиться от лишних процессов. При желании можно заюзать elfutils, и получать инфу вообще без парсинга вывода консольки в структурированном виде. Или наоборот можно заморочиться и сделать правильный парсер вывода без false-positiveов.
     
     
  • 8.53, VALERII (?), 19:33, 09/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Я посмотрел - не так это легко Я бы даже согласился бы, что не нужно это делат... текст свёрнут, показать
     

  • 1.27, Аноним (27), 22:37, 06/12/2020 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +1 +/
     

     ....ответы скрыты (7)

  • 1.28, Rodegast (ok), 23:58, 06/12/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Чем оно лучше hypothesis-а?
     
     
  • 2.37, Аноним (37), 11:37, 07/12/2020 [^] [^^] [^^^] [ответить]  
  • +/
    тем что оно не hypothesis
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру