Fuzz tests use libFuzzer to test the SAPI
_Prepare and _Complete functions.
Building fuzz tests can be enabled using the --with-fuzzing= option. For which
there are two possible values.
libFuzzer tests can be built natively or using the docker fuzzing target.
Build the fuzz tests by setting --with-fuzzing=libfuzzer and statically
linking to the fuzzing TCTI.
export GEN_FUZZ=1
./bootstrap
./configure \
CC=clang \
CXX=clang++ \
--enable-debug \
--with-fuzzing=libfuzzer \
--enable-tcti-fuzzing \
--enable-tcti-device=no \
--enable-tcti-mssim=no \
--with-maxloglevel=none \
--disable-shared
make -j $(nproc) checkRun the fuzz tests by executing any binary ending in .fuzz in test/fuzz/.
./test/fuzz/Tss2_Sys_ZGen_2Phase_Prepare.fuzzBuild the fuzz targets and check that they work by building the fuzzing docker
target.
docker build --target fuzzing -t tpm2-tss:fuzzing .Run a fuzz target and mount a directory as a volume into the container where it should store its findings should it produce any.
docker run --rm -ti tpm2-tss:fuzzing \
-v "${PWD}/findings_dir":/artifacts \
./test/fuzz/Tss2_Sys_PolicyPhysicalPresence_Prepare.fuzz \
-artifact_prefix=/artifactsOSS fuzz integration can be found under the tpm2-tss project in OSS Fuzz.
The Dockerfile there builds the dependencies. build.sh Runs the compilation
as seen under the fuzzing target of the Dockerfile in this repo, only
--with-fuzzing=ossfuzz.
Currently only fuzz targets for the System API have been implemented.
The fuzzing TCTI is used as a temporary storage location for the Data and
Size arguments of LLVMFuzzerTestOneInput.
For _Complete calls the TCTI uses Data and Size as the response buffer and
response size for TSS2_TCTI_RECEIVE.
Fuzz tests are generated via script/gen_fuzz.py.
Setting GEN_FUZZ=1 when running bootstrap will run script/gen_fuzz.py.
GEN_FUZZ=1 ./bootstrapscript/gen_fuzz.py reads the SAPI header file and generates a fuzz target for
each _Prepare and _Complete call using similar templates.
For _Prepare calls the fuzz_fill function in the fuzzing TCTI will fill each
TPM2 structure used can copy from LLVMFuzzerTestOneInput's Data into it.
This work is licensed under the Creative Commons Attribution 4.0 International License (CC BY 4.0).