Code Monkey home page Code Monkey logo

futag's Issues

Ошибка сборки php

Пытаюсь собрать пакет php (контейнер на базе Ubuntu20).
Без Futag всё собирается нормально.
Команды:

git clone --depth=1 --single-branch --branch=PHP-7.2.34 https://github.com/php/php-src cd php-src ./buildconf ./configure make

Компилятор:

root@fuzzing:/Futag# cc --version
Ubuntu clang version 12.0.1-++20211029101322+fed41342a82f-1~exp1~20211029221816.4
Target: x86_64-pc-linux-gnu

Дополнительно установлены пакеты по рекомендациям php:

apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev

Скачиваю проект и пытаюсь собрать его Futag.

Если не запустить ./buildconf, то предупреждение следующее:

root@fuzzing:/Futag# python3 py1.py
-- [Futag]: Futag is finding for configure or cmake in you library root
-- [Futag]: Futag is unable to automatically build your library. Please do it yourself!
Total functions:  0
Total enums:  0
Total structs:  0
Total typedefs:  0
Analysis result:  /Futag/php-src/futag-analysis/futag-analysis-result.json

Если же запустить, то ошибка!

root@fuzzing:/Futag# python3 py1.py
-- [Futag]: Futag is finding for configure or cmake in you library root
-- [Futag]: File configure found, trying to build library with configure...
-- [Futag]: Library was configured successfully!
-- [Futag]: Build command:  /Futag/futag-llvm-package/bin/scan-build -enable-checker futag.FutagFunctionAnalyzer -analyzer-config futag.FutagFunctionAnalyzer:report_dir=/Futag/php-src/futag-analysis make -j16
libtool: compile: specify a tag with `--tag'
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:820: ext/opcache/zend_accelerator_blacklist.lo] Error 1
make: *** Waiting for unfinished jobs....
make: *** [Makefile:832: ext/opcache/zend_file_cache.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:826: ext/opcache/zend_accelerator_module.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:824: ext/opcache/zend_accelerator_hash.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:834: ext/opcache/zend_shared_alloc.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:818: ext/opcache/ZendAccelerator.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:840: ext/opcache/shared_alloc_mmap.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:822: ext/opcache/zend_accelerator_debug.lo] Error 1
libtool: compile: specify a tag with `--tag'
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:828: ext/opcache/zend_persist.lo] Error 1
make: *** [Makefile:848: ext/opcache/Optimizer/pass2.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:846: ext/opcache/Optimizer/pass1_5.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:836: ext/opcache/zend_accelerator_util_funcs.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:842: ext/opcache/shared_alloc_posix.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:830: ext/opcache/zend_persist_calc.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:838: ext/opcache/shared_alloc_shm.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:844: ext/opcache/Optimizer/zend_optimizer.lo] Error 1

Traceback (most recent call last):
  File "py1.py", line 8, in <module>
    json0_13.auto_build()
  File "/usr/local/lib/python3.8/dist-packages/futag/preprocessor.py", line 120, in auto_build
    self.build_configure()
  File "/usr/local/lib/python3.8/dist-packages/futag/preprocessor.py", line 245, in build_configure
    raise ValueError(LIB_BUILD_FAILED)
ValueError: -- [Futag]: Build library failed, please build it your own!

Содержимое файла p1.py:

root@fuzzing:/Futag# cat py1.py
\# package futag must be already installed
from futag.preprocessor import *

json0_13 = Builder(
    "/Futag/futag-llvm-package/", # path to the futag-llvm-package
    "/Futag/php-src" # library root
)
json0_13.auto_build()
json0_13.analyze()

Утеря profraw

Хотелось бы иметь .profraw файлы после работы FUTAG. Как я увидел - флаги для компиляции достаточны для генерации покрытия через llvm-cov. Однако при сборке инструмента и генерации цели даже для дополнительного выставленных флагов .profraw файлы не появляются (либо удаляются).

New information to issues #42

По пути Futag/src/python/futag-package/dist/futag-1.2.2.tar.gz лежит не тот generation.py. При установке с помощью pip install Futag/src/python/futag-package/dist/futag-1.2.2.tar.gz возникает проблема:

Traceback (most recent call last):
  File "analyze.py", line 22, in <module>
    generator.compile_targets(
  File "/home/negoro/.local/lib/python3.8/site-packages/futag/generator.py", line 2703, in compile_targets
    compiler_flags_aflplusplus += " -fPIE"
UnboundLocalError: local variable 'compiler_flags_aflplusplus' referenced before assignment

Исправляется заменой инсталлированного generation.py на generation.py который лежит в исходниках (Futag/src/python/futag-package/src/futag)


При генерации обвязок под AFLPLUSPLUS все равно возникает ошибка (пробовал с PAM, так и с json-c)

-- [Futag] ERROR on target  json_object_array_add126 :
 gcc: error: : No such file or directory
gcc: error: : No such file or directory

В качестве workaroud попробовал сделать символическую ссылку на компилятор afl-clang-lto, установленный в систему, проблема аналогичная.
Система и скрипты сборки аналогичные issues #42.

С генерацией для libfuzzer все ок:

-- [Futag] collecting result ...
-- [Futag] Result of compiling: 1157 fuzz-driver(s)

Проблема установки модуля Futag с помощью pip

При попытке установки модуля Futag на системе Debian столкнулся с подобной ошибкой.

ian@mn4-fuzz-dev:~ pip install ./futag-llvm/python-package/futag-1.3.tar.gz 
ERROR: Exception:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/base_command.py", line 223, in _main
    status = self.run(options, args)
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/req_command.py", line 180, in wrapper
    return func(self, options, args)
  File "/usr/lib/python3/dist-packages/pip/_internal/commands/install.py", line 317, in run
    reqs = self.get_requirements(args, options, finder, session)
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/req_command.py", line 368, in get_requirements
    for parsed_req in parse_requirements(
  File "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", line 151, in parse_requirements
    for parsed_line in parser.parse(filename, constraint):
  File "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", line 341, in parse
    for line in self._parse_and_recurse(filename, constraint):
  File "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", line 346, in _parse_and_recurse
    for line in self._parse_file(filename, constraint):
  File "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", line 379, in _parse_file
    _, content = get_file_content(filename, self._session)
  File "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", line 569, in get_file_content
    content = auto_decode(f.read())
  File "/usr/lib/python3/dist-packages/pip/_internal/utils/encoding.py", line 39, in auto_decode
    return data.decode(
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

Предположительно ошибочная работа futag с С++-библиотекой pugixml

На основе сообщения https://t.me/sdl_dynamic/3172

Futag корректно не отрабатывает на "модельной" С++-библиотеке pugixml (https://github.com/zeux/pugixml), модельная она поскольку порождает ровно один бинарник после сборки, использовалась нами в курсах по фаззингу и ряде документации.

Порядок сборки pugixml - как и у json-c из примера:

  • подготовил futag;
  • загитклонил pugixm;
  • попробовал сделать make - все собирается корректно - сделал make clean (также пробовал сразу после гитклона);
  • указал вместо json0_13 = Builder("/futag/futag-llvm-package", "/futag/json-c") строку json0_13 = Builder("/futag/futag-llvm-package", "/futag/pugixml"), запустил futag-скрипт сборки и анализа (пути к проектам точно корректные).

Futag говорит, что ноль объектов определено. При этом аналогичные действия для json-c приводят к успешному порождению. В препринте статьи C++ упоминается в качестве поддерживаемого ЯП - вроде тут проблем быть не должно. Протестируйте, пожалуйста.

Разделение успешно собранных целей, и целей, которые не удалось собрать

  1. Сделать параметр генератора, например "SaveOnlySuccessful"
  2. По умолчанию он должен иметь значение False
  3. То, что удалось собрать, помещать в "success". То что не удалось - в "error" (если SaveOnlySuccessful == false)
  4. Для целей, которые не удалось собрать, помещать рядом лог ошибки сборки, чтобы аналитик мог сразу посмотреть в чем причина ошибки сборки
  5. Добавить этот параметр "SaveOnlySuccessful" сразу в примерный типовой скрипт, который приведён в README

Вопросы по запуску Futag

  1. Провел подготовку:
    myprog.auto_build()
    myprog.analyze()

  2. Сгенерил таргеты:
    g.gen_targets()

-- [Futag] Fuzz-driver has been compiled successfully
-- [Futag] Result of compiling: 42 of 703 fuzz-driver(s)

Что означает 42, что собрались 42 из 703 ?
В каталоге futag-fuzz-drivers 695 подкаталогов и 1 файл.
В части каталогов есть файлы с расширением .out, из запуск приводит к одному из результатов:

  • выводу сообщения об утечки памяти и прерыванию работы
  • выводу сообщения о падении процесса
  • нормальной работе libfuzzer и выводу статистики его работы на экран
  1. Фаззинг
    f.fuzz()
    В обычном случае приводит к сообщению:
    ============ FINISH ============

Если пробовать издеваться над содержимым каталога futag-fuzz-drivers, оставив в нем несколько подкаталогов с содержимым в котором есть файл с расширением .out , то какое то время выдается, что осуществляется фаззинг и сохраняются его результаты в формате svres

Применимо ли использование вашего проекта не для библиотеки, а для приложения ? На сколько я понимаю обертка создается для конкретной функции и Futag собирает все зависимости для неё. Т.е. нет особых противоречий и всё должно работать. Я прав ?

Флаги libFuzzer

Если возникла потребность запустить цель с такими флагами:

./target.out Corpus/ -detect_leaks=1 -print_final_stats=1 -use_counters=1 -reload=1 -print_coverage=1

Можно ли их как-то отправить внутрь Fuzzer() как строку флагов или можно использовать только опции, указаннные в параметрах?

Ошибка в requirements

Collecting docutils==0.17.1
Using cached docutils-0.17.1-py2.py3-none-any.whl (575 kB)
Collecting flake8==5.0.4
Using cached flake8-5.0.4-py2.py3-none-any.whl (61 kB)
ERROR: Exception:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 3103, in init
super(Requirement, self).init(requirement_string)
File "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/requirements.py", line 101, in init
raise InvalidRequirement("Invalid URL given")
pkg_resources.extern.packaging.requirements.InvalidRequirement: Invalid URL given

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/pip/_internal/cli/base_command.py", line 186, in _main
status = self.run(options, args)
File "/usr/lib/python3/dist-packages/pip/_internal/commands/install.py", line 357, in run
resolver.resolve(requirement_set)
File "/usr/lib/python3/dist-packages/pip/_internal/legacy_resolve.py", line 177, in resolve
discovered_reqs.extend(self._resolve_one(requirement_set, req))
File "/usr/lib/python3/dist-packages/pip/_internal/legacy_resolve.py", line 333, in _resolve_one
abstract_dist = self._get_abstract_dist_for(req_to_install)
File "/usr/lib/python3/dist-packages/pip/_internal/legacy_resolve.py", line 270, in _get_abstract_dist_for
skip_reason = self._check_skip_installed(req)
File "/usr/lib/python3/dist-packages/pip/_internal/legacy_resolve.py", line 228, in _check_skip_installed
req_to_install.check_if_exists(self.use_user_site)
File "/usr/lib/python3/dist-packages/pip/_internal/req/req_install.py", line 443, in check_if_exists
self.satisfied_by = pkg_resources.get_distribution(str(no_marker))
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 480, in get_distribution
dist = Requirement.parse(dist)
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 3150, in parse
req, = parse_requirements(s)
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 3096, in parse_requirements
yield Requirement(line)
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 3105, in init
raise RequirementParseError(str(e))
pkg_resources.RequirementParseError: Invalid URL given

root@fuzzing:/Futag/src/python# cat requirements.txt
alabaster==0.7.12
attrs==22.1.0
Babel==2.10.3
beautifulsoup4==4.10.0
build==0.8.0
certifi==2022.6.15.1
charset-normalizer==2.1.1
configparser==5.3.0
coverage==6.4.4
cxxfilt==0.3.0
cycler==0.11.0
docutils==0.17.1
flake8==5.0.4

futag @ file:///home/thientc/futag-tests/Futag/src/python/futag-package/dist/futag-1.1.tar.gz

Предложения по улучшению readme

На основе сообщения https://t.me/sdl_dynamic/3172

Начал тестировать futag, возникло несколько вопросов/предложений по документации и собственно по инструменту:

  1. Добавить в 2.1 явно установку python3-pip. Он потребуется для установки futag.

  2. Опечатки - цифры 1-2-3 в наименованиях библиотек в 2.1.

  3. В строке pip install /path/to/python/futag-package/dist/futag-0.1.tar.gz путь не сразу понятен - ../Futag/src/python/futag-package/dist/futag-0.1.tar.gz было бы читабельнее.

  4. В 3 в "Запуск сборки..." предлагается чуть подробнее расписать два параметра Builder (хотя бы в том объеме, в котором они собственно в compiler.py закомментированы). В частности, первый параметр должен указывать конкретно на каталог build, полученный на прошлом шаге.

  5. В 3, в "Генерация..." путь "/path/to/futag/package/" для единообразия предлагается заменить на упомянутый чуть выше "../../futag-llvm-package".

  6. Мелочь, но всё таки - от фразы "Успешно скомпилированные цели находятся в каталоге futag-fuzz-drivers. Каждый драйвер находится внутри своей поддиректории." ожидаешь, что в поддиректориях будут лежать именно что бинарники. А не исходные тексты, которые успешно скомпилировал futag, но все равно нужно компилировать самому. Предлагаю фразу уточнить. Кстати, опционально, почему бы рядом не прикладывать именно бинарники собранные? Например с address, undefined? И аналогично - coverage?

  7. После сборки json-c у меня получилось около 50ти драйверов. Большинство из них представлены как каталог с именем драйвера, в котором лежит один единственный файл исходных текстов драйвера с расширением .c. Однако:

7.1. В некоторых каталогах (процентов 15 от общего числа) дополнительно лежит большой файл .out (3-4 мегабайта), в котором похоже лежат пострипанные символы. Это зачем? Это баг (НДВ :)) или фича? Опишите, пожалуйста, в readme, если это фича.

7.2. Для ряда драйверов файлов-исходников получилось сильно больше чем 1 (в частности для json-c для драйвера json_object_to_fd их больше 10ти). Я понимаю, что это видимо завязано на перегрузки конструкторов, в т. ч. конструкторов объектов параметров. Но можно ли чуть подробнее раскрыть данный вопрос в документации (в частности глубина перебора вариантов конструкторов)? В том числе фраза "Каждый драйвер находится внутри своей поддиректории." получается частично неверной - в одной поддиректории может быть 1-N драйверов.

Проблема сборки

100%] Building CXX object utils/benchmark/src/CMakeFiles/benchmark.dir/benchmark_register.cc.o
In file included from .../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.cc:15:
.../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h: In function ‘void AddRange(std::vector<T>*, T, T, int)’:
.../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:30: error: ‘numeric_limits’ is not a member of ‘std’
17 | static const T kmax = std::numeric_limits<T>::max();
| ^~~~~~~~~~~~~~
.../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:46: error: expected primary-expression before ‘>’ token
17 | static const T kmax = std::numeric_limits<T>::max();
| ^
.../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:49: error: ‘::max’ has not been declared; did you mean 'std::max'?
17 | static const T kmax = std::numeric_limits<T>::max();
| ^~~
| std::max
In file included from /usr/include/c++/11/algorithm:62,
from .../Futag/custom-llvm/llvm/utils/benchmark/include/benchmark/benchmark.h:175,
from .../Futag/custom-llvm/llvm/utils/benchmark/src/internal_macros.h:4,
from ...//Futag/custom-llvm/llvm/utils/benchmark/src/check.h:8,
from .../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:6,
from .../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.cc:15:
/usr/include/c++/11/bits/stl_algo.h:3467:5: note: ‘std::max’ declared here
3467 | max(initializer_list<_Tp> __l, _Compare __comp)
| ^~~
make[2]: *** [utils/benchmark/src/CMakeFiles/benchmark.dir/build.make:90: utils/benchmark/src/CMakeFiles/benchmark.dir/benchmark_register.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:163662: utils/benchmark/src/CMakeFiles/benchmark.dir/all] Error 2
make: *** [Makefile:156: all] Error 2

Ошибка сборки. Ubuntu 22.04 x86_64

Ошибка при сборке тестового примера json-c

Traceback (most recent call last):
  File "/home/futag-llvm.2.0.2/make_targs.py", line 13, in <module>
    test_build.analyze()
  File "/home/.local/lib/python3.10/site-packages/futag/preprocessor.py", line 739, in analyze
    "return_type_pointer": function_list[func]["return_type_pointer"],
KeyError: 'return_type_pointer'

Создать параметр выходного каталога

  1. Сделать параметр, который говорит, куда сохранять обертки и результаты сборки целей генератором.
  2. Данный параметр сразу по умолчанию вставить в (README)[https://github.com/#3-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8e. Значение по умолчанию - текущий каталог.
  3. Мне как пользователю в первую и основную очередь интересен именно каталог результатов билда ( а в него помещать в соответствии с #33 ). Каталоги futag-analysis и прочие служебные мне, как конечному пользователю, не интересны.

Уменьшение объема Futag-дистрибутива

Развертывание Futag по readme-инструкции в настоящий момент требует скачивания около 2х ГБ исходников (в основном LLVM). Даже в достаточно быстрой сети это процесс не моментальный, особенно если CI будет выстроен в парадигме сборки каждого окружения "с нуля" (такие примеры нам известны). Можно ли как-то уменьшить объём скачиваемого дистрибутива?

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

Сделать режим многопоточной генерации драйверов

Запускаю futag на процессоре с 32 ядрами.

Хотелось бы иметь возможность распараллеливания процесса порождения драйверов. Иначе процесс генерации выполняется долго, но при этом задействуется только одно ядро - соответственно генерация растягивается надолго.

Это не критический функционал - futag в целом не предназначен для постоянных перезапусков на одной и той же кодовой базе, так что скорее это инструмент однократного применения, и его можно оставить и на ночь.

Однако если такую возможность можно ввести (по умолчанию задействование всех доступных ядер, либо принудительно указывать количество) это точно не будет лишним.

FUTAG, glibc и Debian

Из-за того, что в FUTAG используется готовый llvm, на системах Debian из-за более старой версии glibc clang не работает.

Возникла потребность научить FUTAG работать с системным clang'ом..

Хотелось бы получить инструкцию по работе FUTAG с системным llvm'ом, и возможной доработки FUTAGA'а в случае если это проблематично или невозможно...

В идеале хотелось бы получить поддержку LLVM_CONFIG или какого-то ее аналога. А сам FUTAG чтобы дальше у него всю информацию об LLVM получал. 

Генерация фаззинг-оберток в различных форматах

В настоящий момент отсутствует единый формат фаззинг-обертки (собственно и едины стандарт фаззера также отсутствует). Нужно добавить в Futag возможность порождать фаззинг-обертки под различные системы фаззинга.

Технические требования

  1. Выбор вида генерации обертки должен осуществляться параметром в классе Generator. Параметр - одно из значений Enum. В настоящий момент следует предусмотреть четыре вида оберток:

1.а. Стандартная обертка libfuzzer / Sydr. Данная обертка является значением по умолчанию.

1.b. Стандартная обертка AFL++ / Crusher.

Входной буффер передаётся в main() через stdin и далее, после преобразования, в тестируемую функцию.

1.c. Стандартная обертка AFL++ / Crusher Persistence Mode. Пример здесь:

Входной буффер передаётся в main() через stdin и далее, после преобразования, в тестируемую функцию, которая обернута в макрос AFL_LOOP.
https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.persistent_mode.md#4-persistent-mode

1.d. Стандартная обертка AFL++ Persistence Mode with Shared Buffer. Пример здесь: https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.persistent_mode.md#2-tldr с учётом https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.persistent_mode.md#5-shared-memory-fuzzing

  1. В качестве основной версии AFL++ рассматриваем текущую (ver. 4.02с). В качестве основного компилятора для AFL-режима - afl-clang-fast (желательно afl-clang-lto).

Добавить тестовый скрипты

В каталог Futag помещать сразу шаблоны двух простых скриптов анализа и генерации. Чтобы нужно было только подставить каталог к исходникам и можно было запускать.

Проблема с генерацией цели.

При попытке начать компиляцию целей с помощью FUTAG получил ошибку вида:

-- [Futag] Fuzz-driver for function:  pg_strip_crlf  generated!
-- [Futag] Fuzz-driver for function:  pg_clean_ascii  generated!
Traceback (most recent call last):
  File "generate.py", line 14, in <module>
    g.compile_targets()
  File "/home/ian/.local/lib/python3.8/site-packages/futag/generator.py", line 615, in compile_targets
    [x for x in (self.install_path / "include" ).iterdir() if x.is_dir()]
  File "/home/ian/.local/lib/python3.8/site-packages/futag/generator.py", line 615, in <listcomp>
    [x for x in (self.install_path / "include" ).iterdir() if x.is_dir()]
  File "/usr/lib/python3.8/pathlib.py", line 1122, in iterdir
    for name in self._accessor.listdir(self):
FileNotFoundError: [Errno 2] No such file or directory: '/home/ian/Work/FUZ-48/libpq-standalone/futag-install/include'

Хотел бы уточнить, с чем это может быть связано (сборка была успешно произведена)?

  1. Python скрипты были использованы те же, что в doc файле "https://github.com/ispras/Futag/tree/main/src/python/futag-package". То есть сначала auto_build() или build_cmake(), далее analyze(), а затем gen_targets() и compile_targets().

  2. Проект был взят открытый с GitLab (собирается через CMake): "https://gitlab.com/sabelka/libpq-standalone/-/tree/main/"

  3. Ошибка появлялась на этапе компиляции. Сборка проходила успешно.

Сборка из исходников llvm-12(13,14)

При выборе сборки из исходников для llvm-12 (13, 14), т.е. любой версии, получаю ошибку вида:

CMake Error at /path/Futag/custom-llvm/llvm-project/llvm/cmake/modules/LLVMProcessSources.cmake:114 (message):
  Found unknown source file FutagCatchInfo.cpp

  Please update
 /path/Futag/custom-llvm/llvm-project/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt


Call Stack (most recent call first):
   /path/Futag/custom-llvm/llvm-project/llvm/cmake/modules/LLVMProcessSources.cmake:63 (llvm_check_source_file_list)
   /path/Futag/custom-llvm/llvm-project/llvm/cmake/modules/AddLLVM.cmake:426 (llvm_process_sources)
   /path/Futag/custom-llvm/llvm-project/clang/cmake/modules/AddClang.cmake:103 (llvm_add_library)
   /path/Futag/custom-llvm/llvm-project/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt:6 (add_clang_library)


-- Configuring incomplete, errors occurred!

При построении покрытия по цели FUTAG genhtml идёт по несуществующему пути.

Возможно это не связано напрямую с FUTAG, но genhtml после осуществления необходимых шагов пытается найти директорию .futag-fuzz-drivers. Я бы хотел уточнить, она генерируется при работе инструмента и удаляется? Просто grep находит во многих файлах её именно с точкой в сгенерированных исходниках *.c:
Это ошибка, выдаваемая genhtml (она в конце блока появляется)

Executing: llvm-profdata-14 merge -output=/home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/profdata /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/pqEndcopy31.profraw
Executing: llvm-cov-14 export /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/pqEndcopy31.out -instr-profile=/home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus//profdata -format=lcov > /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/profdata.lcov
Executing: genhtml -o /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/pqEndcopy3.html /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/profdata.lcov
Reading data file /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/profdata.lcov
Found 3 entries.
Found common filename prefix "/home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq"
Writing .css and .png files.
Generating output.
genhtml: ERROR: cannot read /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/pqEndcopy3/pqEndcopy31/pqEndcopy31.c
Processing file .futag-fuzz-drivers/pqEndcopy3/pqEndcopy31/pqEndcopy31.c

Это пример грепа корня репозитория FUTAG.

Futag │ on    main  grep -nrw '\.futag-fuzz-*'     
examples/opus_decode1.c:102:/home/futag/Futag-tests/libopus/opus-1.3.1/.futag-fuzz-drivers/opus_decode/opus_decode1/opus_decode1.c:80:5: warning: ignoring return value of function declared with 'warn_unused_result' attribute [-Wunused-result]

Здесь примеры этой строчки с ".futag-fuzz-drivers" вместо "futag-fuzz-drivers" в сгенерированных исходниках целей:

grep -nrw '.futag-*'
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:80:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:89:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:98:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:106:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:114:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:16:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:123:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:16:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:132:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:16:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:1:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:10:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:19:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:28:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:37:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:45:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:

Возможно ошибка размещения llvm после последнего коммита

Не получается запустить тестовый срипт сборки и анализа.

  1. Скрипт выглядит так:
from futag.preprocessor import *

json0_13 = Builder(
    "/Futag/futag-llvm-package/", # path to the futag-llvm-package
    "/Futag/json-c" # library root
)
json0_13.auto_build()
json0_13.analyze()
  1. Вот так выглядит структура каталогов после сборки llvm и установки futag посредством pip:
root@2bf92881f9c9:/Futag# pwd
/Futag
root@2bf92881f9c9:/Futag# tree -L 2 -d
.
|-- build
|   |-- CMakeFiles
|   |-- benchmarks
|   |-- bin
|   |-- cmake
|   |-- docs
|   |-- examples
|   |-- include
|   |-- lib
|   |-- libexec
|   |-- projects
|   |-- runtimes
|   |-- share
|   |-- test
|   |-- tools
|   |-- unittests
|   `-- utils
|-- custom-llvm
|   |-- clang
|   |-- compiler-rt
|   `-- llvm
|-- futag-llvm-package
|   |-- python
|   `-- svres-tmpl
|-- json-c
|   |-- apps
|   |-- bench
|   |-- cmake
|   |-- doc
|   |-- fuzz
|   `-- tests
|-- src
|   |-- Checkers
|   |-- clang
|   |-- python
|   `-- svres-tmpl
`-- vendors
    |-- deb-rdepend-downloader
    `-- json-3.10.5

39 directories
root@2bf92881f9c9:/Futag# ll
total 108
drwxr-xr-x  9 root root  4096 Jul 28 11:04 ./
drwxr-xr-x  1 root root  4096 Jul 28 10:45 ../
-rw-r--r--  1 root root 12288 Jul 28 11:04 .build.py.swp
drwxr-xr-x  8 root root  4096 Jul 28 10:45 .git/
-rw-r--r--  1 root root   203 Jul 28 10:45 .gitignore
-rw-r--r--  1 root root   417 Jul 28 10:45 CHANGELOG.md
-rw-r--r--  1 root root 35149 Jul 28 10:45 LICENSE
-rw-r--r--  1 root root  3718 Jul 28 10:45 README.en.md
-rw-r--r--  1 root root  6236 Jul 28 10:45 README.md
drwxr-xr-x 18 root root  4096 Jul 28 10:47 build/
-rw-r--r--  1 root root   199 Jul 28 11:04 build.py
drwxr-xr-x  5 root root  4096 Jul 28 10:46 custom-llvm/
drwxr-xr-x  4 root root  4096 Jul 28 10:51 futag-llvm-package/
drwxr-xr-x 10 root root  4096 Jul 28 10:52 json-c/
drwxr-xr-x  6 root root  4096 Jul 28 10:45 src/
drwxr-xr-x  4 root root  4096 Jul 28 10:45 vendors/
  1. При попытке запуска тестового скрипта (я назвал его build.py) выводится вот такая ошибка:
root@2bf92881f9c9:/Futag# python3 build.py
Traceback (most recent call last):
  File "build.py", line 3, in <module>
    json0_13 = Builder(
  File "/usr/local/lib/python3.8/dist-packages/futag/preprocessor.py", line 81, in __init__
    raise ValueError(INVALID_FUTAG_PATH, futag_llvm_package)
ValueError: ('-- [Futag]: Incorrect path to FUTAG llvm package', '/Futag/futag-llvm-package/')
  1. Пробовал "поиграть" путями - не смог подобрать пути, чтобы скрипт запустился.

Генерация обёрток для функций содержащих char*&

В пилотном примере pugixml часто встречается тип данных char*&.
const char*& передает в функцию ссылку на указатель,а const char*, сейчас Futag не умеет генерировать обёртки для подобных функций, предлагаю добавить функционал позволяющий инициализировать этот тип.

Ошибка при сборке цели с CMakeLists.txt

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

-- [Futag] Try to generate fuzz-driver for function:  <имя_функции>
Traceback (most recent call last):
  File "/build//run_futag.py", line 13, in <module>
    g.compile_targets()
  File "/home/имя_пользователя/.local/lib/python3.10/site-packages/futag/generator.py", line 2752, in compile_targets
    current_include.append("-I" + i + "/")
TypeError: can only concatenate str (not "PosixPath") to str

Отсутствует объявление переменной dyn_size

В процессе работы Futag сгенерировалась такая цель:

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int LLVMFuzzerTestOneInput(uint8_t * Fuzz_Data, size_t Fuzz_Size)
{
    if (Fuzz_Size < sizeof(int)) return 0;
    uint8_t * pos = Fuzz_Data;
    //GEN_VAR_FUNCTION
    lua_State * L = luaL_newstate();
    //GEN_BUILTIN
    int narg;
    memcpy(&narg, pos, sizeof(int));
    pos += sizeof(int);
    //GEN_SIZE
    int clear = (int) dyn_size;
    //FUNCTION_CALL
    docall(L ,narg ,clear );
    //FREE
    return 0;
}

Переменная dyn_size, используемая в "int clear = (int) dyn_size;", не объявлена.

/home/user/luajit/futag-fuzz-drivers/docall/docall1/docall1.c:18:23: error: use of undeclared identifier 'dyn_size'
    int clear = (int) dyn_size;

Ошибка при старте фаззинга готовых целей

-- [Futag] FUZZING driver: PQconnectdb1... 

-- [Futag] FUZZING command:.../futag-fuzz-drivers/PQconnectdb/PQconnectdb1/PQconnectdb1.out -timeout=1000 -rss_limit_mb=30 -max_total_time=1000 -artifact_prefix=.../futag-fuzz-drivers/PQconnectdb/PQconnectdb1/

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

==990319==ERROR: AddressSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22)
==990319==Process memory map follows:
	0x000000400000-0x000000421000	.../futag-fuzz-drivers/pg_b64_enc_len/pg_b64_enc_len1/pg_b64_enc_len1.out
	0x000000421000-0x000000548000	.../futag-fuzz-drivers/pg_b64_enc_len/pg_b64_enc_len1/pg_b64_enc_len1.out
	0x000000548000-0x000000584000	.../futag-fuzz-drivers/pg_b64_enc_len/pg_b64_enc_len1/pg_b64_enc_len1.out
	0x000000584000-0x000000586000	.../futag-fuzz-drivers/pg_b64_enc_len/pg_b64_enc_len1/pg_b64_enc_len1.out
	0x000000586000-0x000000590000	.../futag-fuzz-drivers/pg_b64_enc_len/pg_b64_enc_len1/pg_b64_enc_len1.out
	0x000000590000-0x000000e6c000	[heap]
	0x00007fff7000-0x00008fff7000	
	0x00008fff7000-0x02008fff7000	
	0x02008fff7000-0x10007fff8000	
	0x7ffff76e1000-0x7ffff7a48000	
	0x7ffff7a48000-0x7ffff7a70000	/usr/lib/x86_64-linux-gnu/libc.so.6
	0x7ffff7a70000-0x7ffff7c05000	/usr/lib/x86_64-linux-gnu/libc.so.6
	0x7ffff7c05000-0x7ffff7c5d000	/usr/lib/x86_64-linux-gnu/libc.so.6
	0x7ffff7c5d000-0x7ffff7c61000	/usr/lib/x86_64-linux-gnu/libc.so.6
	0x7ffff7c61000-0x7ffff7c63000	/usr/lib/x86_64-linux-gnu/libc.so.6
	0x7ffff7c63000-0x7ffff7c70000	
	0x7ffff7c70000-0x7ffff7c73000	/usr/lib/x86_64-linux-gnu/libgcc_s.so.1
	0x7ffff7c73000-0x7ffff7c8a000	/usr/lib/x86_64-linux-gnu/libgcc_s.so.1
	0x7ffff7c8a000-0x7ffff7c8e000	/usr/lib/x86_64-linux-gnu/libgcc_s.so.1
	0x7ffff7c8e000-0x7ffff7c8f000	/usr/lib/x86_64-linux-gnu/libgcc_s.so.1
	0x7ffff7c8f000-0x7ffff7c90000	/usr/lib/x86_64-linux-gnu/libgcc_s.so.1
	0x7ffff7c90000-0x7ffff7c9e000	/usr/lib/x86_64-linux-gnu/libm.so.6
	0x7ffff7c9e000-0x7ffff7d1a000	/usr/lib/x86_64-linux-gnu/libm.so.6
	0x7ffff7d1a000-0x7ffff7d75000	/usr/lib/x86_64-linux-gnu/libm.so.6
	0x7ffff7d75000-0x7ffff7d76000	/usr/lib/x86_64-linux-gnu/libm.so.6
	0x7ffff7d76000-0x7ffff7d77000	/usr/lib/x86_64-linux-gnu/libm.so.6
	0x7ffff7d77000-0x7ffff7e11000	/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
	0x7ffff7e11000-0x7ffff7f22000	/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
	0x7ffff7f22000-0x7ffff7f92000	/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
	0x7ffff7f92000-0x7ffff7f9d000	/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
	0x7ffff7f9d000-0x7ffff7fa0000	/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
	0x7ffff7fa0000-0x7ffff7fa3000	
	0x7ffff7fb1000-0x7ffff7fbd000	
	0x7ffff7fbd000-0x7ffff7fc1000	[vvar]
	0x7ffff7fc1000-0x7ffff7fc3000	[vdso]
	0x7ffff7fc3000-0x7ffff7fc5000	/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
	0x7ffff7fc5000-0x7ffff7fef000	/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
	0x7ffff7fef000-0x7ffff7ffa000	/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
	0x7ffff7ffa000-0x7ffff7ffb000	
	0x7ffff7ffb000-0x7ffff7ffd000	/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
	0x7ffff7ffd000-0x7ffff7fff000	/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
	0x7ffffffde000-0x7ffffffff000	[stack]
	0xffffffffff600000-0xffffffffff601000	[vsyscall]
==990319==End of process memory map.
==990319==AddressSanitizer CHECK failed: .../Futag/custom-llvm/compiler-rt/lib/sanitizer_common/sanitizer_common.cpp:54 "((0 && "unable to mmap")) != (0)" (0x0, 0x0)
    <empty stack>

Улучшение проекта futag-tests

  1. Добавить ссылку на проект futag-tests в readme.md текущего проекта Futag, и краткий комментарий, что это за проект.
  2. Сделать в futag-tests скрипт, который запустит по очереди все скрипты сборки целей для подпроектов и выведет ошибку, если что-то где-то отработало некорректно. Такое регрессионное тестирование futag у конечных пользователей.

Совместимость с afl-clang-fast

Хотелось бы попробовать получить бинари для afl-fuzz, но для цели afl-clang-fast потребовал -fPIE, а с этим флагом вся сборка цели падает. Как бы с этим справиться?

undefined reference при сборке цели

Futag'ом была сгенерированна фаззинг-цель:

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int LLVMFuzzerTestOneInput(uint8_t * Fuzz_Data, size_t Fuzz_Size)
{
    if (Fuzz_Size < sizeof(int)) return 0;
    uint8_t * pos = Fuzz_Data;
    //GEN_VAR_FUNCTION
    lua_State * L = luaL_newstate();
    //GEN_BUILTIN
    int firstline;
    memcpy(&firstline, pos, sizeof(int));
    pos += sizeof(int);
    //FUNCTION_CALL
    pushline(L ,firstline );
    //FREE
    return 0;
}

В процессе штатной работы Futag цель не собирается. При попытке сбора цели, с помощью команды приведённой в файле, компилятор выдаёт ошибку:

/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:12:5: error: use of undeclared identifier 'lua_State'
    lua_State * L = luaL_newstate();
    ^
/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:12:17: error: use of undeclared identifier 'L'
    lua_State * L = luaL_newstate();
                ^
/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:12:21: warning: implicit declaration of function 'luaL_newstate' is invalid in C99 [-Wimplicit-function-declaration]
    lua_State * L = luaL_newstate();
                    ^
/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:18:5: warning: implicit declaration of function 'pushline' is invalid in C99 [-Wimplicit-function-declaration]
    pushline(L ,firstline );
    ^
/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:18:14: error: use of undeclared identifier 'L'
    pushline(L ,firstline );

Поиск в коде исследуемого ПО показал, что "lua_State" объявляется в нескольких заголовочных файлах: lj_obj.h, lua.h, lj_memprof.h. Если вручную добавить заголовочный файл к сгененированной цели, то эта ошибка исчезнет. Однако появится другая:

/usr/bin/ld: /tmp/pushline1-efaeca.o: in function `LLVMFuzzerTestOneInput':
/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:18: undefined reference to `pushline'
/usr/bin/ld: /home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:18: undefined reference to `pushline'
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)

Функция pushline, та самая для которой эта цель и генеририровалась объявляется и используется в файле "luajit.c".

Таким образом получается что Futag некорректно сформировал цель и не может задействовать её про фаззинге.

Ошибка при генерации обёртки в парадигме AFL

При компиляции обёртки в парадигме AFL возникает такая ошибка. В парадигме libFuzzer данная обёртка собирается без ошибок.

user@futag-vm:~/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1$ /home/user/futag-llvm/AFLplusplus/usr/local/bin/afl-clang-fast++ -fsanitize=address -g -O0 -fPIE  -I/home/user/pugixml/src/  /home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp -o /home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.out -Wl,--start-group /home/user/pugixml/.futag-install/lib/libpugixml.a /home/user/pugixml/.futag-build/libpugixml.a -Wl,--end-group

afl-cc++4.02c by Michal Zalewski, Laszlo Szekeres, Marc Heuse - mode: LLVM-PCGUARD

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:13:1: error: C++ requires a type specifier for all declarations

main() {

^

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:23:21: error: use of undeclared identifier 'read'; did you mean '_IO_cookie_io_functions_t::read'?

    int Fuzz_Size = __AFL_FUZZ_TESTCASE_LEN;  // don't use the macro directly in a call!

                    ^

<command line>:12:88: note: expanded from here

#define __AFL_FUZZ_TESTCASE_LEN (__afl_fuzz_ptr ? *__afl_fuzz_len : (*__afl_fuzz_len = read(0, __afl_fuzz_alt_ptr, 1048576)) == 0xffffffff ? 0 : *__afl_fuzz_len)

                                                                                       ^

/usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h:57:27: note: '_IO_cookie_io_functions_t::read' declared here

  cookie_read_function_t *read;         /* Read bytes.  */

                          ^

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:23:21: error: invalid use of non-static data member 'read'

    int Fuzz_Size = __AFL_FUZZ_TESTCASE_LEN;  // don't use the macro directly in a call!

                    ^~~~~~~~~~~~~~~~~~~~~~~

<command line>:12:88: note: expanded from here

#define __AFL_FUZZ_TESTCASE_LEN (__afl_fuzz_ptr ? *__afl_fuzz_len : (*__afl_fuzz_len = read(0, __afl_fuzz_alt_ptr, 1048576)) == 0xffffffff ? 0 : *__afl_fuzz_len)

                                                                                       ^~~~

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:75:41: warning: '/*' within block comment [-Wcomment]

  cookie_read_function_t *read;         /* Read bytes.  */

                                        ^

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:77:1: error: expected unqualified-id

/home/user/pugixml/.futag-fuzz-drivers/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:23:21: error: invalid use of non-static data member 'read'

^

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:79:23: error: expected a class name after '~' to name a destructor

                    ^~~~~~~~~~~~~~~~~~~~~~~

                      ^

1 warning and 5 errors generated.

Ошибка при установке Futag

Возникает ошибка при установке зависимостей Futag в ОС Ubuntu 20.04 :
pip install -r futag-llvm-package/python-package/requirements.txt
изображение

Ошибка сборки nDPI

Добрый день!
Пытаюсь экспериментировать с библиотекой nDPI:

-- [Futag]: Futag is finding for configure or cmake in you library root
-- [Futag]: File configure found, trying to build library with configure...
-- [Futag]: Starting analyzing:
-- [Futag]: Configure command:  /home/user/Futag/futag-llvm-package/bin/scan-build -disable-checker core -disable-checker security -disable-checker unix -disable-checker deadcode -disable-checker nullability -disable-checker cplusplus /home/user/nDPI/configure --prefix=/home/user/nDPI/futag-install
-- [Futag]: Analyzing command:  /home/user/Futag/futag-llvm-package/bin/scan-build -disable-checker core -disable-checker security -disable-checker unix -disable-checker deadcode -disable-checker nullability -disable-checker cplusplus -enable-checker futag.FutagFunctionAnalyzer -analyzer-config futag.FutagFunctionAnalyzer:report_dir=/home/user/nDPI/futag-analysis make -j16
-- [Futag]: Analyzing succeeded
-- [Futag]: Configure command:  /home/user/nDPI/configure --prefix=/home/user/nDPI/futag-install
configure: error: in `/home/user/nDPI/futag-build':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details

Traceback (most recent call last):
  File "/home/user/Futag_test/ftest.py", line 7, in <module>
    json0_13.auto_build()
  File "/home/user/.local/lib/python3.10/site-packages/futag/preprocessor.py", line 117, in auto_build
    self.build_configure()
  File "/home/user/.local/lib/python3.10/site-packages/futag/preprocessor.py", line 356, in build_configure
    raise ValueError(LIB_CONFIGURE_FAILED)
ValueError: --Configure library failed, please build it your own!

Фрагмент из лога в каталоге futag-build:

configure:4508: $? = 0
configure:4497: /home/user/Futag/futag-llvm-package/bin/clang -V >&5
clang-11: error: argument to '-V' is missing (expected 1 value)
clang-11: error: no input files
configure:4508: $? = 1
configure:4497: /home/user/Futag/futag-llvm-package/bin/clang -qversion >&5
clang-11: error: unknown argument '-qversion'; did you mean '--version'?
clang-11: error: no input files
configure:4508: $? = 1
configure:4497: /home/user/Futag/futag-llvm-package/bin/clang -version >&5
clang-11: error: unknown argument '-version'; did you mean '--version'?
clang-11: error: no input files
configure:4508: $? = 1
configure:4528: checking whether the C compiler works
configure:4550: /home/user/Futag/futag-llvm-package/bin/clang -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -O0 -fprofile
-instr-generate -fcoverage-mapping conftest.c  >&5
configure:4554: $? = 0
configure:4604: result: yes
configure:4607: checking for C compiler default output file name
configure:4609: result: a.out
configure:4615: checking for suffix of executables
configure:4622: /home/user/Futag/futag-llvm-package/bin/clang -o conftest -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -
O0 -fprofile-instr-generate -fcoverage-mapping conftest.c  >&5
configure:4626: $? = 0
configure:4649: result:
configure:4671: checking whether we are cross compiling
configure:4679: /home/user/Futag/futag-llvm-package/bin/clang -o conftest -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -
O0 -fprofile-instr-generate -fcoverage-mapping conftest.c  >&5
configure:4683: $? = 0
configure:4690: ./conftest
==3092119==ERROR: AddressSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22)
==3092119==Process memory map follows:
        0x000000400000-0x00000041f000   /home/user/nDPI/futag-build/conftest
        0x00000041f000-0x000000500000   /home/user/nDPI/futag-build/conftest
        0x000000500000-0x000000532000   /home/user/nDPI/futag-build/conftest
        0x000000533000-0x000000534000   /home/user/nDPI/futag-build/conftest
        0x000000534000-0x00000053d000   /home/user/nDPI/futag-build/conftest
        0x00000053d000-0x000000de5000
        0x00007fff7000-0x00008fff7000
        0x00008fff7000-0x02008fff7000
        0x02008fff7000-0x10007fff8000
        0x7ff4b1c9a000-0x7ff4b1fff000
        0x7ff4b1fff000-0x7ff4b2027000   /usr/lib/x86_64-linux-gnu/libc.so.6
        0x7ff4b2027000-0x7ff4b21bc000   /usr/lib/x86_64-linux-gnu/libc.so.6
        0x7ff4b21bc000-0x7ff4b2214000   /usr/lib/x86_64-linux-gnu/libc.so.6
        0x7ff4b2214000-0x7ff4b2218000   /usr/lib/x86_64-linux-gnu/libc.so.6
        0x7ff4b2218000-0x7ff4b221a000   /usr/lib/x86_64-linux-gnu/libc.so.6
 

Ошибка сборки

Добрый день!
Действую по п.4 (Сборка из исходного кода), при выполнении build.sh получаю ошибку

[ 22%] Linking CXX static library ../libLLVMSupport.a
[ 22%] Built target LLVMSupport
make: *** [Makefile:156: all] Ошибка 2

======== End of install script for FUTAG - a fuzzing target automated generator ========

Пролистывая чуть назад лог, нахожу красные ошибки:

In file included from /home/user/Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.cc:15:
/home/user/Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h: In function ‘void AddRange(std::vector<T>*, T, T, int)’:
/home/user/Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:30: error: ‘numeric_limits’ is not a member of ‘std’
   17 |   static const T kmax = std::numeric_limits<T>::max();
      |                              ^~~~~~~~~~~~~~
/home/user/Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:46: error: expected primary-expression before ‘>’ token
   17 |   static const T kmax = std::numeric_limits<T>::max();
      |                                              ^
/home/user/Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:49: error: ‘::max’ has not been declared; did you mean ‘std::max’?
   17 |   static const T kmax = std::numeric_limits<T>::max();
      |                                                 ^~~
      |                                                 std::max

Система Ubuntu 22.04
По тем пакетам, что в требованиях:
cmake version 3.22.1
gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0
Python 3.10.4
pip 22.2.2
zlib 1.2.11
make 4.3

При выборе типа цели AFLPLUSPLUS получаю ошибки компиляции

/home/sedley/Work/Fuzzing/futag-llvm.2.0.2/futag-llvm/AFLplusplus/usr/local/bin/afl-clang-fast -fsanitize=address -g -O0 -fPIE  
-I/home/sedley/Work/Development/libpq-standalone/libpq/pg/src/interfaces/libpq/ -I/home/sedley/Work/Development/libpq-
standalone/libpq/pg/src/include/ -I/home/sedley/Work/Development/libpq-standalone/.futag-build/libpq/  /home/sedley
/Work/Development/libpq-standalone/.futag-fuzz-drivers/PQputnbytes/PQputnbytes2/PQputnbytes2.c -o /home/sedley
/Work/Development/libpq-standalone/.futag-fuzz-drivers/PQputnbytes/PQputnbytes2/PQputnbytes2.out -Wl,--start-group 
/home/sedley/Work/Development/libpq-standalone/.futag-build/libpq/libpq.a /home/sedley/Work/Development/libpq-standalone
/libpq/pg/pgsql/lib/libpgtypes.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libecpg.a /home/sedley
/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libpgfeutils.a /home/sedley/Work/Development/libpq-standalone/libpq
/pg/pgsql/lib/libpgcommon_shlib.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libpgport_shlib.a 
/home/sedley/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libpq.a /home/sedley/Work/Development/libpq-standalone
/libpq/pg/pgsql/lib/libpgport.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libecpg_compat.a 
/home/sedley/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libpgcommon.a /home/sedley/Work/Development/libpq-
standalone/libpq/pg/install/lib/libpgtypes.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/install/lib/libecpg.a 
/home/sedley/Work/Development/libpq-standalone/libpq/pg/install/lib/libpgfeutils.a /home/sedley/Work/Development/libpq-
standalone/libpq/pg/install/lib/libpgcommon_shlib.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/install
/lib/libpgport_shlib.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/install/lib/libpq.a /home/sedley
/Work/Development/libpq-standalone/libpq/pg/install/lib/libpgport.a /home/sedley/Work/Development/libpq-standalone/libpq
/pg/install/lib/libecpg_compat.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/install/lib/libpgcommon.a 
/home/sedley/Work/Development/libpq-standalone/libpq/pg/src/interfaces/ecpg/compatlib/libecpg_compat.a /home/sedley
/Work/Development/libpq-standalone/libpq/pg/src/interfaces/ecpg/pgtypeslib/libpgtypes.a /home/sedley/Work/Development/libpq-
standalone/libpq/pg/src/interfaces/ecpg/ecpglib/libecpg.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/src
/interfaces/libpq/libpq.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/src/fe_utils/libpgfeutils.a /home/sedley
/Work/Development/libpq-standalone/libpq/pg/src/port/libpgport_shlib.a /home/sedley/Work/Development/libpq-standalone/libpq
/pg/src/port/libpgport.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/src/port/libpgport_srv.a /home/sedley
/Work/Development/libpq-standalone/libpq/pg/src/common/libpgcommon_shlib.a /home/sedley/Work/Development/libpq-
standalone/libpq/pg/src/common/libpgcommon_srv.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/src/common
/libpgcommon.a -Wl,--end-group 

-- [Futag] ERROR on target  PQputnbytes2 

-- [Futag] collecting result ...
-- [Futag] Result of compiling: 0 fuzz-driver(s)

При генерации целей их получается 590, при компиляции в виде libFuzzer их выходит >600, а для AFL++ - 0.

Запуск сборок проектов futag-tests в контейнерах

Некоторые пакеты требуют доустановки окружения.
Некоторым пакетам может мешать уже ранее установленное окружение пакетов других версий.

Предлагается проработать вопрос реализации запуска сборки и анализа каждого пакета в отдельном контейнере. Тогда в скрипте prepare.sh можно будет минимально настраивать окружение под каждый конкретный пакет.

Эта задача, даже если будет принята, в любом случае ФОНОВОГО приоритета, поскольку не связана с основной бизнес-логикой Futag.

Автоматическое создание целей в AFL-парадигме

Многие пользователи выстроили фаззинг-процессы в парадигме AFL++ - оформление фаззинг-целей в ней отличается от парадигмы libfuzzer.

Хотелось бы, чтобы Futag умел порождать фаззинг-цели в одном из двух режимов, по выбору пользователя.

Простейший вариант обертки цели под AFL-парадигму приведён в частности в руководстве Андрея Федотова (https://github.com/ispras/oss-sydr-fuzz/wiki/Fuzzzing-FreeImage-project-with-Sydr-and-AFLplusplus).

В качестве эталонной версии компилятора для проверки сборки предлагается рассматривать текущий компилятор afl-clang-lto (afl-clang-lto++) версии 4.01.

gcc: error: unrecognized command line option ‘-ferror-limit=1’

Ошибка

При генерации фаззинг-оберток для AFL++ автоматически подставляется флаг -ferror-limit=1, компилятор afl-clang-fast его не поддерживает и из-за этого фаззинг-обертки не генерируются.

Команда для генерации:

/home/negoro/Fuzzing/Futag/futag-llvm/AFLplusplus/usr/local/bin/afl-clang-fast -fsanitize=address -g -O0 -ferror-limit=1 -I/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/libpam/ -I/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/libpam/ -I/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/libpam/../ -I/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/libpam/include/ /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-fuzz-drivers/_pam_strdup/_pam_strdup1/_pam_strdup1.c -o /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-fuzz-drivers/_pam_strdup/_pam_strdup1/_pam_strdup1.out -Wl,--start-group /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/libpam_misc.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/libpam.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/libpamc.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_warn.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_namespace.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_deny.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_listfile.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_limits.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_echo.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_group.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_exec.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_access.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_permit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_xauth.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_setquota.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_time.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_umask.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_mkhomedir.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_localuser.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_faildelay.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_keyinit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_stress.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_filter.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_sepermit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_motd.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_faillock.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_env.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_unix.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_succeed_if.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_mail.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_securetty.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_usertype.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_shells.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_rhosts.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_timestamp.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_ftp.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_rootok.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_nologin.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_lastlog.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_debug.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_issue.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_selinux.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_pwhistory.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_wheel.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_loginuid.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/libpam_misc/.libs/libpam_misc.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/libpamc/.libs/libpamc.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/libpam/.libs/libpam.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_ftp/.libs/pam_ftp.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_sepermit/.libs/pam_sepermit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_loginuid/.libs/pam_loginuid.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_listfile/.libs/pam_listfile.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_pwhistory/.libs/pam_pwhistory.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_exec/.libs/pam_exec.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_securetty/.libs/pam_securetty.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_issue/.libs/pam_issue.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_succeed_if/.libs/pam_succeed_if.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_usertype/.libs/pam_usertype.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_localuser/.libs/pam_localuser.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_keyinit/.libs/pam_keyinit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_nologin/.libs/pam_nologin.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_lastlog/.libs/pam_lastlog.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_limits/.libs/pam_limits.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_warn/.libs/pam_warn.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_env/.libs/pam_env.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_faildelay/.libs/pam_faildelay.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_filter/.libs/pam_filter.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_permit/.libs/pam_permit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_setquota/.libs/pam_setquota.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_namespace/.libs/pam_namespace.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_time/.libs/pam_time.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_selinux/.libs/pam_selinux.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_debug/.libs/pam_debug.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_rhosts/.libs/pam_rhosts.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_rootok/.libs/pam_rootok.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_mail/.libs/pam_mail.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_mkhomedir/.libs/pam_mkhomedir.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_timestamp/.libs/pam_timestamp.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_xauth/.libs/pam_xauth.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_group/.libs/pam_group.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_shells/.libs/pam_shells.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_deny/.libs/pam_deny.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_faillock/.libs/pam_faillock.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_echo/.libs/pam_echo.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_unix/.libs/pam_unix.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_umask/.libs/pam_umask.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_stress/.libs/pam_stress.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_wheel/.libs/pam_wheel.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_access/.libs/pam_access.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_motd/.libs/pam_motd.a -Wl,--end-group

Лог ошибки

-- [Futag] ERROR on target  _pam_strdup1 :
 gcc: error: : No such file or directory
gcc: error: : No such file or directory
gcc: error: unrecognized command line option ‘-ferror-limit=1’

Сопутствующая информация

OS:

Distributor ID: Ubuntu
Description: Ubuntu 20.04.5 LTS
Release: 20.04
Codename: focal
uname -a: Linux negoro 5.4.0-132-generic #148-Ubuntu SMP Mon Oct 17 16:02:06 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux.

Project:

linux-pam-1.5.2.

Build script:

from futag.preprocessor import *

FUTAG_PATH = "/home/negoro/Fuzzing/Futag/futag-llvm/"
lib_path = "/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2"

build_test = Builder(
    FUTAG_PATH,
    lib_path,
    clean=True,
    processes=1,
    build_ex_params="--disable-doc --disable-shared", 
    flags="-fPIE -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping" #flags for compiling
)
build_test.auto_build()
build_test.analyze()

Generation script:

from futag.generator import *

FUTAG_PATH = "/home/negoro/Fuzzing/Futag/futag-llvm/"
lib_path = "/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2"
lib_json_file="/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-analysis/futag-analysis-result.json"
flags_afl="-fsanitize=address -g -O0"
flags_libfuzz="-fsanitize=address,fuzzer -g -O0"

generator = Generator(
    FUTAG_PATH, # путь к директории "futag-llvm"
    lib_path, #path to source
    target_type=AFLPLUSPLUS, #select fuzzers
    json_file=lib_json_file #path to json file
)

generator.gen_targets(
  anonymous=False
)
# Compile fuzz drivers
generator.compile_targets(
  4, # количество задач при сборке
  flags=flags_afl
)

Version LLVM:

clang version 14.0.6 (https://github.com/ispras/Futag 4373a71)
Собирали все из репозитория самостоятельно 13.12.2022.
git clone репозитория выполнялся 12.12.2022.
Сборка из исходников произошла успешно.

Version python package:

futag 1.2.1

Также вопрос, будет ли добавлен afl-clang-lto?

Ошибка в preprocessor.py

Компилятор Python 3.11.2
Ошибка возникает при попытке сгенерировать фаззинг-обертку
image

в Futag/src/python/futag-package/src/futag/preprocessor.py строка 80:
sys.exit(INVALID_FUTAG_PATH, futag_llvm_package)

Согласно документации https://docs.python.org/3.11/library/sys.html туда можно передать только 1 аргумент, а не 2.

Предлагаемые варианты решения: описаны здесь https://stackoverflow.com/questions/44515386/typeerror-exit-expected-at-most-1-arguments-got-3

Ошибки санитайзера при сборке пакета

Предлагаю убрать из обязательных параметров компилятора санитайзеры.
В процессе тестирования пакета пакета luajit (https://github.com/tarantool/luajit), столкнулся с ошибками санитайзера на этапе сборки. Использовав метод народного тыка, было обнаружено что сборка без сайнитайзера проходит успешно, после чего был отредактирован файл preprocessor.py, в части "self.flags = "-fsanitize=address -g -O0" и далее процесс прошел без ошибок.

На сколько необходимо осуществлять сборку именно с санитайзерами?

Генерация обёрток для анонимных функций

Исходя из подтверждения работоспособности такой конструкции (на скринах), предлагаю сделать ещё один подход к генерации анонимных функций.
3
4

Алгоритм такой:

  1. Генерируем обертки для анонимной функции (уже реализовано);
  2. Смотрим в каком файле эта функция находится;
  3. Копируем файл обертки;
  4. Изменяем заголовочные файлы;
  5. Добавляем сгенерированную обертку [1] в конце файла [2]

redefinition of 'var_name' with a different type

В сгенерированной Futag`ом цели, 2 раза происходит инициализация переменной с одинаковым именем но разного типа.
Библиотека: json-c-0.16-20220414.
Цель: json_object_object_add_ex10.zip

[json_object_object_add_ex10.zip](https://github.com/ispras/Futag/files/9607305/json_object_object_add_ex10.zip)


 /home/user/Futag-tests/json-c/json-c/futag-fuzz-drivers/json_object_object_add_ex/json_object_object_add_ex10/json_object_object_add_ex10.c:26:31: error: redefinition of 'var_name' with a different type: 'struct json_object *const' vs 'const char *const'
    struct json_object *const var_name = uval;

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int LLVMFuzzerTestOneInput(uint8_t * Fuzz_Data, size_t Fuzz_Size)
{
    if (Fuzz_Size < sizeof(int32_t)+sizeof(const char *const)+sizeof(struct json_object *const)+sizeof(unsigned)) return 0;
    uint8_t * pos = Fuzz_Data;
    //GEN_BUILTIN
    int32_t f_i;
    ...
    const char *const var_name = ukey;
    ...
    struct json_object *const var_name = uval;
    ...
    free(uopts);
    return 0;
}

При попытке направить FUTAG на расширение для Postgres получаю следующие ошибки

cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
make: *** [<builtin>: src/utils/logger.o] Error 1
make: *** Waiting for unfinished jobs....
make: *** [<builtin>: src/utils/pgut.o] Error 1
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
make: *** [<builtin>: src/utils/parray.o] Error 1
make: *** [<builtin>: src/utils/thread.o] Error 1
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
make: *** [<builtin>: src/utils/json.o] Error 1
make: *** [<builtin>: src/utils/configuration.o] Error 1
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
make: *** [<builtin>: src/utils/remote.o] Error 1
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
make: *** [<builtin>: src/utils/file.o] Error 1

Сделать возможность сборки целей для функций из анонимных пространств имен

  1. Данный параметр назвать например "AnonymousBuild", по умолчанию он имеет значение "false"
  2. Параметр со значением по умолчанию обязательно включить в README. Также сделать комментарий "Использовать, только если уверены, что вам это нужно"
  3. В каждой успешно сгенерированной цели, между кодом цели и командой сборки помещать комментарий вида:

"Данная цель сформирована для анонимной функции, в нормальном режиме работы не доступной для прямого вызова пользователем. Подача мутированных данных в данную функцию без дополнительной валидации и коррекции данных в обертке скорее всего приведёт к False Positive падениям цели".

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.