Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

oss-fuzz: fuzz lxc_config_define_add and lxc_config_define_load #3763

Merged
merged 3 commits into from Apr 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/cifuzz.yml
Expand Up @@ -28,7 +28,7 @@ jobs:
uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
with:
oss-fuzz-project-name: 'lxc'
fuzz-seconds: 180
fuzz-seconds: 360
dry-run: false
sanitizer: ${{ matrix.sanitizer }}
- name: Upload Crash
Expand Down
3 changes: 3 additions & 0 deletions src/lxc/confile.c
Expand Up @@ -3111,7 +3111,9 @@ bool lxc_config_define_load(struct lxc_list *defines, struct lxc_container *c)
break;
}

#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
lxc_config_define_free(defines);
#endif /* !FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION */
brauner marked this conversation as resolved.
Show resolved Hide resolved

return bret;
}
Expand All @@ -3125,6 +3127,7 @@ void lxc_config_define_free(struct lxc_list *defines)
free(new_item->key);
free(new_item->val);
lxc_list_del(it);
free(it->elem);
free(it);
}
}
Expand Down
64 changes: 64 additions & 0 deletions src/tests/fuzz-lxc-define-load.c
@@ -0,0 +1,64 @@
/* SPDX-License-Identifier: LGPL-2.1+ */

#include <stddef.h>
#include <stdint.h>

#include "conf.h"
#include "confile.h"
#include "lxctest.h"
#include "utils.h"

int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
__do_free char *new_str = NULL;
struct lxc_container *c = NULL;
struct lxc_list defines;
struct lxc_list *it;
__do_close int devnull_fd = -EBADF;

if (size > 102400)
return 0;

c = lxc_container_new("FUZZ", NULL);
lxc_test_assert_abort(c);

new_str = (char *)malloc(size+1);
lxc_test_assert_abort(new_str);
memcpy(new_str, data, size);
new_str[size] = '\0';

lxc_list_init(&defines);

if (lxc_config_define_add(&defines, new_str) < 0)
goto out;

if (!lxc_config_define_load(&defines, c))
goto out;

devnull_fd = open_devnull();
lxc_test_assert_abort(devnull_fd >= 0);

lxc_list_for_each(it, &defines) {
__do_free char *val = NULL;
struct new_config_item *config_item = it->elem;
int len;

len = c->get_config_item(c, config_item->key, NULL, 0);
if (len < 0)
continue;

val = (char *)malloc(len + 1);
lxc_test_assert_abort(val);

if (c->get_config_item(c, config_item->key, val, len + 1) != len)
continue;

if (len > 0)
dprintf(devnull_fd, "[%s/%s]\n", config_item->key, val);
}

out:
lxc_container_put(c);
lxc_config_define_free(&defines);

return 0;
}
11 changes: 9 additions & 2 deletions src/tests/oss-fuzz.sh
Expand Up @@ -43,8 +43,11 @@ sed -i 's/^AC_CHECK_LIB(util/#/' configure.ac

make -j$(nproc)

$CC -c -o fuzz-lxc-config-read.o $CFLAGS -Isrc -Isrc/lxc src/tests/fuzz-lxc-config-read.c
$CXX $CXXFLAGS $LIB_FUZZING_ENGINE fuzz-lxc-config-read.o src/lxc/.libs/liblxc.a -o $OUT/fuzz-lxc-config-read
for fuzz_target_source in src/tests/fuzz-lxc*.c; do
fuzz_target_name=$(basename "$fuzz_target_source" ".c")
$CC -c -o "$fuzz_target_name.o" $CFLAGS -Isrc -Isrc/lxc "$fuzz_target_source"
$CXX $CXXFLAGS $LIB_FUZZING_ENGINE "$fuzz_target_name.o" src/lxc/.libs/liblxc.a -o "$OUT/$fuzz_target_name"
done

perl -lne 'if (/config_jump_table\[\]\s*=/../^}/) { /"([^"]+)"/ && print "$1=" }' src/lxc/confile.c >doc/examples/keys.conf
[[ -s doc/examples/keys.conf ]]
Expand All @@ -53,3 +56,7 @@ perl -lne 'if (/config_jump_table_net\[\]\s*=/../^}/) { /"([^"]+)"/ && print "lx
[[ -s doc/examples/lxc-net-keys.conf ]]

zip -r $OUT/fuzz-lxc-config-read_seed_corpus.zip doc/examples

mkdir fuzz-lxc-define-load_seed_corpus
perl -lne '/([^=]+)/ && print "printf $1= >fuzz-lxc-define-load_seed_corpus/$1"' doc/examples/{keys,lxc-net-keys}.conf | bash
zip -r $OUT/fuzz-lxc-define-load_seed_corpus.zip fuzz-lxc-define-load_seed_corpus