140 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
#!/bin/bash -eu
 | 
						|
# Copyright 2019 Google Inc.
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#      http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
#
 | 
						|
################################################################################
 | 
						|
 | 
						|
# build dependencies statically
 | 
						|
(
 | 
						|
tar -xvzf pcre2-10.36.tar.gz
 | 
						|
cd pcre2-10.36
 | 
						|
./configure --disable-shared
 | 
						|
make -j$(nproc) clean
 | 
						|
make -j$(nproc) all
 | 
						|
make -j$(nproc) install
 | 
						|
)
 | 
						|
 | 
						|
tar -xvzf lz4-1.9.2.tar.gz
 | 
						|
cd lz4-1.9.2
 | 
						|
make liblz4.a
 | 
						|
cp lib/liblz4.a /usr/local/lib/
 | 
						|
cp lib/lz4*.h /usr/local/include/
 | 
						|
cd ..
 | 
						|
 | 
						|
tar -xvzf jansson-2.12.tar.gz
 | 
						|
cd jansson-2.12
 | 
						|
./configure --disable-shared
 | 
						|
make -j$(nproc)
 | 
						|
make install
 | 
						|
cd ..
 | 
						|
 | 
						|
tar -xvzf libpcap-1.9.1.tar.gz
 | 
						|
cd libpcap-1.9.1
 | 
						|
./configure --disable-shared
 | 
						|
make -j$(nproc)
 | 
						|
make install
 | 
						|
cd ..
 | 
						|
 | 
						|
cd fuzzpcap
 | 
						|
mkdir build
 | 
						|
cd build
 | 
						|
cmake ..
 | 
						|
make install
 | 
						|
cd ../..
 | 
						|
 | 
						|
cd libyaml
 | 
						|
./bootstrap
 | 
						|
./configure --disable-shared
 | 
						|
make -j$(nproc)
 | 
						|
make install
 | 
						|
cd ..
 | 
						|
 | 
						|
export CARGO_BUILD_TARGET="x86_64-unknown-linux-gnu"
 | 
						|
# cf https://github.com/google/sanitizers/issues/1389
 | 
						|
export MSAN_OPTIONS=strict_memcmp=false
 | 
						|
 | 
						|
#we did not put libhtp there before so that cifuzz does not remove it
 | 
						|
mv libhtp suricata/
 | 
						|
# build project
 | 
						|
cd suricata
 | 
						|
sh autogen.sh
 | 
						|
#run configure with right options
 | 
						|
if [ "$SANITIZER" = "address" ]
 | 
						|
then
 | 
						|
    export RUSTFLAGS="$RUSTFLAGS -Cpasses=sancov-module -Cllvm-args=-sanitizer-coverage-level=4 -Cllvm-args=-sanitizer-coverage-trace-compares -Cllvm-args=-sanitizer-coverage-inline-8bit-counters -Cllvm-args=-sanitizer-coverage-pc-table -Clink-dead-code -Cllvm-args=-sanitizer-coverage-stack-depth -Ccodegen-units=1"
 | 
						|
fi
 | 
						|
./src/tests/fuzz/oss-fuzz-configure.sh
 | 
						|
make -j$(nproc)
 | 
						|
 | 
						|
./src/suricata --list-app-layer-protos | tail -n +2 | while read i; do cp src/fuzz_applayerparserparse $OUT/fuzz_applayerparserparse_$i; done
 | 
						|
 | 
						|
cp src/fuzz_* $OUT/
 | 
						|
 | 
						|
# dictionaries
 | 
						|
./src/suricata --list-keywords | grep "\- " | sed 's/- //' | awk '{print "\""$0"\""}' > $OUT/fuzz_siginit.dict
 | 
						|
 | 
						|
echo \"SMB\" > $OUT/fuzz_applayerparserparse_smb.dict
 | 
						|
 | 
						|
# build corpuses
 | 
						|
# default configuration file
 | 
						|
zip -r $OUT/fuzz_confyamlloadstring_seed_corpus.zip suricata.yaml
 | 
						|
# rebuilds rules corpus with only one rule by file
 | 
						|
unzip ../emerging.rules.zip
 | 
						|
cd rules
 | 
						|
cat *.rules > $OUT/fuzz.rules
 | 
						|
i=0
 | 
						|
mkdir corpus
 | 
						|
# quiet output for commands
 | 
						|
set +x
 | 
						|
cat *.rules | while read l; do echo $l > corpus/$i.rule; i=$((i+1)); done
 | 
						|
set -x
 | 
						|
zip -q -r $OUT/fuzz_siginit_seed_corpus.zip corpus
 | 
						|
cd ../../suricata-verify
 | 
						|
 | 
						|
# corpus with single files
 | 
						|
find . -name "*.pcap" | xargs zip -r $OUT/fuzz_decodepcapfile_seed_corpus.zip
 | 
						|
find . -name "*.yaml" | xargs zip -r $OUT/fuzz_confyamlloadstring_seed_corpus.zip
 | 
						|
find . -name "*.rules" | xargs zip -r $OUT/fuzz_siginit_seed_corpus.zip
 | 
						|
 | 
						|
# corpus using both rule and pcap as in suricata-verify
 | 
						|
cd tests
 | 
						|
i=0
 | 
						|
mkdir corpus
 | 
						|
set +x
 | 
						|
ls | grep -v corpus | while read t; do
 | 
						|
cat $t/*.rules > corpus/$i || true; echo -ne '\0' >> corpus/$i; cat $t/*.pcap >> corpus/$i || true; i=$((i+1));
 | 
						|
done
 | 
						|
set -x
 | 
						|
zip -q -r $OUT/fuzz_sigpcap_seed_corpus.zip corpus
 | 
						|
rm -Rf corpus
 | 
						|
mkdir corpus
 | 
						|
set +x
 | 
						|
ls | grep -v corpus | while read t; do
 | 
						|
grep -v "#" $t/*.rules | head -1 | cut -d "(" -f2 | cut -d ")" -f1 > corpus/$i || true; echo -ne '\0' >> corpus/$i; fpc_bin $t/*.pcap >> corpus/$i || rm corpus/$i; i=$((i+1));
 | 
						|
echo -ne '\0' >> corpus/$i; python3 $SRC/fuzzpcap/tcptofpc.py $t/*.pcap >> corpus/$i || rm corpus/$i; i=$((i+1));
 | 
						|
done
 | 
						|
set -x
 | 
						|
zip -q -r $OUT/fuzz_sigpcap_aware_seed_corpus.zip corpus
 | 
						|
echo "\"FPC0\"" > $OUT/fuzz_sigpcap_aware.dict
 | 
						|
rm -Rf corpus
 | 
						|
mkdir corpus
 | 
						|
set +x
 | 
						|
ls | grep -v corpus | while read t; do
 | 
						|
fpc_bin $t/*.pcap >> corpus/$i || rm corpus/$i; i=$((i+1));
 | 
						|
python3 $SRC/fuzzpcap/tcptofpc.py $t/*.pcap >> corpus/$i || rm corpus/$i; i=$((i+1));
 | 
						|
done
 | 
						|
set -x
 | 
						|
zip -q -r $OUT/fuzz_predefpcap_aware_seed_corpus.zip corpus
 | 
						|
echo "\"FPC0\"" > $OUT/fuzz_predefpcap_aware.dict
 |