ispras / futag Goto Github PK
View Code? Open in Web Editor NEWFUTAG (FUzzing Target Automated Generator) - автоматический генератор фаззинг-оберток для библиотек
License: GNU General Public License v3.0
FUTAG (FUzzing Target Automated Generator) - автоматический генератор фаззинг-оберток для библиотек
License: GNU General Public License v3.0
"Данная цель сформирована для анонимной функции, в нормальном режиме работы не доступной для прямого вызова пользователем. Подача мутированных данных в данную функцию без дополнительной валидации и коррекции данных в обертке скорее всего приведёт к False Positive падениям цели".
При компиляции обёртки в парадигме 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 на системе 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 сгенерировалась такая цель:
#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;
Предлагаю проработать возможность генерации обёрток для функции использующих тип данных wchar_t
В настоящий момент отсутствует единый формат фаззинг-обертки (собственно и едины стандарт фаззера также отсутствует). Нужно добавить в Futag возможность порождать фаззинг-обертки под различные системы фаззинга.
Технические требования
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
Провел подготовку:
myprog.auto_build()
myprog.analyze()
Сгенерил таргеты:
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, из запуск приводит к одному из результатов:
Если пробовать издеваться над содержимым каталога futag-fuzz-drivers, оставив в нем несколько подкаталогов с содержимым в котором есть файл с расширением .out , то какое то время выдается, что осуществляется фаззинг и сохраняются его результаты в формате svres
Применимо ли использование вашего проекта не для библиотеки, а для приложения ? На сколько я понимаю обертка создается для конкретной функции и Futag собирает все зависимости для неё. Т.е. нет особых противоречий и всё должно работать. Я прав ?
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
На основе сообщения https://t.me/sdl_dynamic/3172
Начал тестировать futag, возникло несколько вопросов/предложений по документации и собственно по инструменту:
Добавить в 2.1 явно установку python3-pip. Он потребуется для установки futag.
Опечатки - цифры 1-2-3 в наименованиях библиотек в 2.1.
В строке pip install /path/to/python/futag-package/dist/futag-0.1.tar.gz путь не сразу понятен - ../Futag/src/python/futag-package/dist/futag-0.1.tar.gz было бы читабельнее.
В 3 в "Запуск сборки..." предлагается чуть подробнее расписать два параметра Builder (хотя бы в том объеме, в котором они собственно в compiler.py закомментированы). В частности, первый параметр должен указывать конкретно на каталог build, полученный на прошлом шаге.
В 3, в "Генерация..." путь "/path/to/futag/package/" для единообразия предлагается заменить на упомянутый чуть выше "../../futag-llvm-package".
Мелочь, но всё таки - от фразы "Успешно скомпилированные цели находятся в каталоге futag-fuzz-drivers. Каждый драйвер находится внутри своей поддиректории." ожидаешь, что в поддиректориях будут лежать именно что бинарники. А не исходные тексты, которые успешно скомпилировал futag, но все равно нужно компилировать самому. Предлагаю фразу уточнить. Кстати, опционально, почему бы рядом не прикладывать именно бинарники собранные? Например с address, undefined? И аналогично - coverage?
После сборки json-c у меня получилось около 50ти драйверов. Большинство из них представлены как каталог с именем драйвера, в котором лежит один единственный файл исходных текстов драйвера с расширением .c. Однако:
7.1. В некоторых каталогах (процентов 15 от общего числа) дополнительно лежит большой файл .out (3-4 мегабайта), в котором похоже лежат пострипанные символы. Это зачем? Это баг (НДВ :)) или фича? Опишите, пожалуйста, в readme, если это фича.
7.2. Для ряда драйверов файлов-исходников получилось сильно больше чем 1 (в частности для json-c для драйвера json_object_to_fd их больше 10ти). Я понимаю, что это видимо завязано на перегрузки конструкторов, в т. ч. конструкторов объектов параметров. Но можно ли чуть подробнее раскрыть данный вопрос в документации (в частности глубина перебора вариантов конструкторов)? В том числе фраза "Каждый драйвер находится внутри своей поддиректории." получается частично неверной - в одной поддиректории может быть 1-N драйверов.
-- [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>
Если возникла потребность запустить цель с такими флагами:
./target.out Corpus/ -detect_leaks=1 -print_final_stats=1 -use_counters=1 -reload=1 -print_coverage=1
Можно ли их как-то отправить внутрь Fuzzer() как строку флагов или можно использовать только опции, указаннные в параметрах?
Из-за того, что в FUTAG используется готовый llvm, на системах Debian из-за более старой версии glibc clang не работает.
Возникла потребность научить FUTAG работать с системным clang'ом..
Хотелось бы получить инструкцию по работе FUTAG с системным llvm'ом, и возможной доработки FUTAGA'а в случае если это проблематично или невозможно...
В идеале хотелось бы получить поддержку LLVM_CONFIG или какого-то ее аналога. А сам FUTAG чтобы дальше у него всю информацию об LLVM получал.
Возможно это не связано напрямую с 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:
В пилотном примере pugixml часто встречается тип данных char*&.
const char*& передает в функцию ссылку на указатель,а const char*, сейчас Futag не умеет генерировать обёртки для подобных функций, предлагаю добавить функционал позволяющий инициализировать этот тип.
Развертывание Futag по readme-инструкции в настоящий момент требует скачивания около 2х ГБ исходников (в основном LLVM). Даже в достаточно быстрой сети это процесс не моментальный, особенно если CI будет выстроен в парадигме сборки каждого окружения "с нуля" (такие примеры нам известны). Можно ли как-то уменьшить объём скачиваемого дистрибутива?
Также, как вариант, дополнительно подготовить и выложить публично пресобранный контейнер, который явно должен быть меньше по размеру?
По пути 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)
Было бы очень хорошо, если бы утилита сообщала, почему не получилось сгенерировать обертку для конкретной функции.
/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 помещать сразу шаблоны двух простых скриптов анализа и генерации. Чтобы нужно было только подставить каталог к исходникам и можно было запускать.
Не получается запустить тестовый срипт сборки и анализа.
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()
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/
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/')
Хотелось бы попробовать получить бинари для afl-fuzz, но для цели afl-clang-fast потребовал -fPIE, а с этим флагом вся сборка цели падает. Как бы с этим справиться?
Некоторые пакеты требуют доустановки окружения.
Некоторым пакетам может мешать уже ранее установленное окружение пакетов других версий.
Предлагается проработать вопрос реализации запуска сборки и анализа каждого пакета в отдельном контейнере. Тогда в скрипте prepare.sh можно будет минимально настраивать окружение под каждый конкретный пакет.
Эта задача, даже если будет принята, в любом случае ФОНОВОГО приоритета, поскольку не связана с основной бизнес-логикой Futag.
На основе сообщения https://t.me/sdl_dynamic/3172
Futag корректно не отрабатывает на "модельной" С++-библиотеке pugixml (https://github.com/zeux/pugixml), модельная она поскольку порождает ровно один бинарник после сборки, использовалась нами в курсах по фаззингу и ряде документации.
Порядок сборки pugixml - как и у json-c из примера:
Futag говорит, что ноль объектов определено. При этом аналогичные действия для json-c приводят к успешному порождению. В препринте статьи C++ упоминается в качестве поддерживаемого ЯП - вроде тут проблем быть не должно. Протестируйте, пожалуйста.
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 некорректно сформировал цель и не может задействовать её про фаззинге.
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
Многие пользователи выстроили фаззинг-процессы в парадигме 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.
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'
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
На основе сообщения https://t.me/sdl_dynamic/3172
Можно ли сделать каталог futag-fuzz-drivers произвольным, указываемым по параметру?
При генерации фаззинг-оберток для 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’
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.
linux-pam-1.5.2.
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()
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
)
clang version 14.0.6 (https://github.com/ispras/Futag 4373a71)
Собирали все из репозитория самостоятельно 13.12.2022.
git clone репозитория выполнялся 12.12.2022.
Сборка из исходников произошла успешно.
futag 1.2.1
Также вопрос, будет ли добавлен afl-clang-lto?
При выборе сборки из исходников для 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] 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
Хотелось бы иметь .profraw файлы после работы FUTAG. Как я увидел - флаги для компиляции достаточны для генерации покрытия через llvm-cov. Однако при сборке инструмента и генерации цели даже для дополнительного выставленных флагов .profraw файлы не появляются (либо удаляются).
Предлагаю убрать из обязательных параметров компилятора санитайзеры.
В процессе тестирования пакета пакета luajit (https://github.com/tarantool/luajit), столкнулся с ошибками санитайзера на этапе сборки. Использовав метод народного тыка, было обнаружено что сборка без сайнитайзера проходит успешно, после чего был отредактирован файл preprocessor.py, в части "self.flags = "-fsanitize=address -g -O0" и далее процесс прошел без ошибок.
На сколько необходимо осуществлять сборку именно с санитайзерами?
Для повышение совместимости с bash, необходимо исключить из имени файлов специальные символы, такие как ":" "(" и т.д. например на символ "_"
Ошибка возникает при запуске тестового контейнера https://github.com/thientc/Futag-tests/tree/main/json-c
Исходя из подтверждения работоспособности такой конструкции (на скринах), предлагаю сделать ещё один подход к генерации анонимных функций.
Алгоритм такой:
При попытке начать компиляцию целей с помощью 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'
Хотел бы уточнить, с чем это может быть связано (сборка была успешно произведена)?
Python скрипты были использованы те же, что в doc файле "https://github.com/ispras/Futag/tree/main/src/python/futag-package". То есть сначала auto_build()
или build_cmake()
, далее analyze()
, а затем gen_targets()
и compile_targets()
.
Проект был взят открытый с GitLab (собирается через CMake): "https://gitlab.com/sabelka/libpq-standalone/-/tree/main/"
Ошибка появлялась на этапе компиляции. Сборка проходила успешно.
В сгенерированной 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;
}
Добрый день!
Действую по п.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
Компилятор Python 3.11.2
Ошибка возникает при попытке сгенерировать фаззинг-обертку
в 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
Пытаюсь собрать пакет 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()
Запускаю futag на процессоре с 32 ядрами.
Хотелось бы иметь возможность распараллеливания процесса порождения драйверов. Иначе процесс генерации выполняется долго, но при этом задействуется только одно ядро - соответственно генерация растягивается надолго.
Это не критический функционал - futag в целом не предназначен для постоянных перезапусков на одной и той же кодовой базе, так что скорее это инструмент однократного применения, и его можно оставить и на ночь.
Однако если такую возможность можно ввести (по умолчанию задействование всех доступных ядер, либо принудительно указывать количество) это точно не будет лишним.
Добрый день!
Пытаюсь экспериментировать с библиотекой 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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.