Re: [PATCH v2] libsepol: add module package fuzzer
Stephen Smalley <[email protected]> Fri, 24 Jul 2026 10:21:22 -0400
| Newsgroups | org.kernel.vger.selinux |
|---|---|
| Message-ID | <CAEjxPJ7oZ-t4g7f+mkBBFyWvU1i1fDCe3AN+ATnOMrTpuDDGgQ@mail.gmail.com> |
On Tue, Jul 21, 2026 at 3:41 PM Stephen Smalley <[email protected]> wrote: > > On Tue, Jul 21, 2026 at 7:16 AM Petr Matyas <[email protected]> wrote: > > > > Add a libFuzzer target for the binary module package format > > (.mod/.pp) read by sepol_module_package_read(). On a valid package, > > also exercises sepol_module_package_to_cil() to cover the CIL > > conversion path for module policies. > > > > The seed corpus contains a minimal module package produced by > > checkmodule + semodule_package to give the fuzzer a structurally > > correct starting point. > > > > Wire the new fuzzer into scripts/oss-fuzz.sh alongside the existing > > libsepol and checkpolicy fuzzers. > > > > Signed-off-by: Petr Matyas <[email protected]> > > Acked-by: Stephen Smalley <[email protected]> Merged. Would also suggest having it call sepol_module_package_info() to exercise that code path. > > > --- > > libsepol/fuzz/min_mod.pp | Bin 0 -> 859 bytes > > libsepol/fuzz/module-package-fuzzer.c | 47 ++++++++++++++++++++++++++ > > scripts/oss-fuzz.sh | 11 ++++++ > > 3 files changed, 58 insertions(+) > > create mode 100644 libsepol/fuzz/min_mod.pp > > create mode 100644 libsepol/fuzz/module-package-fuzzer.c > > > > diff --git a/libsepol/fuzz/min_mod.pp b/libsepol/fuzz/min_mod.pp > > new file mode 100644 > > index 0000000000000000000000000000000000000000..264bd4406bf94b1c0044d46d0ca82fcdc4716f88 > > GIT binary patch > > literal 859 > > zcmb`FOA5k35Jbxl=uVd|J%Q*A+_=+~2MCyq;4dTjfQwu~Jg+OIFa^zEK*a~mbWhh* > > zC(yS?b#DP+3;|pp)qMb9y%;ZdX?Yp1d{Q1=8^EZR_3@$y;IvDllTSJTW|Qf>?pS0_ > > zHBrrzoHHN0Jnz=6t<MgUaFAqvvv+Y3Wp+eUE^I&aR86ez;Ih;mqe31{=)Jy=*gJYM > > z)YoZe5nJ0l^b4_C<_yiy`HMz`Zw0+SohO>SzP<k!{0FXMy?QKdaP72i-21Sn6|wj4 > > Fcmk%9EE)g+ > > > > literal 0 > > HcmV?d00001 > > > > diff --git a/libsepol/fuzz/module-package-fuzzer.c b/libsepol/fuzz/module-package-fuzzer.c > > new file mode 100644 > > index 00000000..2516970b > > --- /dev/null > > +++ b/libsepol/fuzz/module-package-fuzzer.c > > @@ -0,0 +1,47 @@ > > +#include <sepol/debug.h> > > +#include <sepol/module.h> > > +#include <sepol/module_to_cil.h> > > + > > +extern int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); > > + > > +// set to 1 to enable more verbose libsepol logging > > +#define VERBOSE 0 > > + > > +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) > > +{ > > + sepol_module_package_t *mod = NULL; > > + struct sepol_policy_file *spf = NULL; > > + FILE *devnull = NULL; > > + > > + sepol_debug(VERBOSE); > > + > > + if (sepol_policy_file_create(&spf)) > > + goto exit; > > + > > + sepol_policy_file_set_mem(spf, (char *)data, size); > > + > > + if (sepol_module_package_create(&mod)) > > + goto exit; > > + > > + if (sepol_module_package_read(mod, spf, VERBOSE)) > > + goto exit; > > + > > + devnull = fopen("/dev/null", "we"); > > + if (!devnull) > > + goto exit; > > + > > + /* sepol_module_package_read() stores contexts sections as raw blobs > > + * without validating their text syntax; sepol_module_package_to_cil() > > + * is the first place that parses them, so a graceful error return here > > + * is expected behaviour for malformed input, not a bug. */ > > + (void)sepol_module_package_to_cil(devnull, mod); > > + > > +exit: > > + if (devnull) > > + fclose(devnull); > > + sepol_module_package_free(mod); > > + sepol_policy_file_free(spf); > > + > > + /* Non-zero return values are reserved for future use. */ > > + return 0; > > +} > > diff --git a/scripts/oss-fuzz.sh b/scripts/oss-fuzz.sh > > index 9376b6e4..08e06975 100755 > > --- a/scripts/oss-fuzz.sh > > +++ b/scripts/oss-fuzz.sh > > @@ -74,6 +74,17 @@ $CXX $CXXFLAGS $LIB_FUZZING_ENGINE binpolicy-fuzzer.o "$DESTDIR/usr/lib/libsepol > > > > zip -j "$OUT/binpolicy-fuzzer_seed_corpus.zip" libsepol/fuzz/policy.bin > > > > +## module package fuzzer ## > > + > > +# CFLAGS, CXXFLAGS and LIB_FUZZING_ENGINE have to be split to be accepted by > > +# the compiler/linker so they shouldn't be quoted > > +# shellcheck disable=SC2086 > > +$CC $CFLAGS -c -o module-package-fuzzer.o libsepol/fuzz/module-package-fuzzer.c > > +# shellcheck disable=SC2086 > > +$CXX $CXXFLAGS $LIB_FUZZING_ENGINE module-package-fuzzer.o "$DESTDIR/usr/lib/libsepol.a" -o "$OUT/module-package-fuzzer" > > + > > +zip -j "$OUT/module-package-fuzzer_seed_corpus.zip" libsepol/fuzz/min_mod.pp > > + > > ## checkpolicy fuzzer ## > > > > make -C checkpolicy clean > > -- > > 2.55.0 > > > >