Libfuzzer target для анализа на диске

Я в настоящее время интегрирую libFuzzer в проекте, который анализирует файлы на жестком диске. У меня есть некоторый предыдущий опыт работы с AFL, где использовалась такая командная строка:

afl-fuzz -m500 -i input/ -o output/ -t100 -- program_to_fuzz @@

...где @@ был путь к сгенерированному вводу. Смотря на libFuzzer однако, я вижу, что пушистые цели выглядят так:

extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
  DoSomethingInterestingWithMyAPI(Data, Size);
  return 0;  // Non-zero return values are reserved for future use.
}

Я понимаю, что входные данные предоставляются не в виде файла, а в виде буфера в памяти. Проблема в том, что программа, которую я пытаюсь распознать, работает с файлами и получает свои данные через fread() звонки. В любой момент времени весь вход не должен быть загружен в память (где, в общем случае, он может даже не помещаться); так что я мало что могу сделать с const uint8_t*,

Запись буфера обратно на жесткий диск для возврата файла кажется крайне неэффективной. Это можно обойти?

0 ответов

Вы можете сделать, как в этом примере, из команды безопасности Google. Определенный здесь файл buf_to_file берет ваш буфер и возвращает путь char* pathname, который вы затем можете передать своей цели:
(из https://github.com/google/security-research-pocs/blob/master/autofuzz/fuzz_utils.h#L27)

// Write the data provided in buf to a new temporary file. This function is  
// meant to be called by LLVMFuzzerTestOneInput() for fuzz targets that only  
// take file names (and not data) as input.  
//  
// Return the path of the newly created file or NULL on error. The caller should  
// eventually free the returned buffer (see delete_file).   
extern "C" char *buf_to_file(const uint8_t *buf, size_t size);

Обязательно освободите ресурс с помощью функции delete_file.

Вы можете использовать LD_PRELOAD и переопределить fread.

Другие вопросы по тегам