xref: /aosp_15_r20/system/nfc/src/fuzzers/fuzz.sh (revision 7eba2f3b06c51ae21384f6a4f14577b668a869b3)
1*7eba2f3bSAndroid Build Coastguard Worker#!/bin/bash
2*7eba2f3bSAndroid Build Coastguard Worker
3*7eba2f3bSAndroid Build Coastguard Worker# Due to the complexity to android buile environment this script is created for
4*7eba2f3bSAndroid Build Coastguard Worker# development purpose to build, run and debug the fuzzers. It's not needed or
5*7eba2f3bSAndroid Build Coastguard Worker# required for official build and fuzzing.
6*7eba2f3bSAndroid Build Coastguard Worker
7*7eba2f3bSAndroid Build Coastguard Workerfunction init() {
8*7eba2f3bSAndroid Build Coastguard Worker  if [ -z "$ANDROID_BUILD_TOP" ];
9*7eba2f3bSAndroid Build Coastguard Worker  then
10*7eba2f3bSAndroid Build Coastguard Worker    echo "Did you forget lunch?"
11*7eba2f3bSAndroid Build Coastguard Worker    exit 1
12*7eba2f3bSAndroid Build Coastguard Worker  fi
13*7eba2f3bSAndroid Build Coastguard Worker  source $ANDROID_BUILD_TOP/build/envsetup.sh
14*7eba2f3bSAndroid Build Coastguard Worker
15*7eba2f3bSAndroid Build Coastguard Worker  PROJ=$(basename $PWD)
16*7eba2f3bSAndroid Build Coastguard Worker  FUZZER_NAME=nfc_${PROJ}_fuzzer
17*7eba2f3bSAndroid Build Coastguard Worker  FUZZ_DIR=data/fuzz/$(get_build_var TARGET_ARCH)/$FUZZER_NAME
18*7eba2f3bSAndroid Build Coastguard Worker  FUZZ_OPTIONS="$FUZZ_OPTIONS -close_fd_mask=3 -max_len=512 -artifact_prefix=/$FUZZ_DIR/crashes/"
19*7eba2f3bSAndroid Build Coastguard Worker}
20*7eba2f3bSAndroid Build Coastguard Worker
21*7eba2f3bSAndroid Build Coastguard Workerfunction run_once() {
22*7eba2f3bSAndroid Build Coastguard Worker  if [ "$1" == "-c" ];
23*7eba2f3bSAndroid Build Coastguard Worker  then
24*7eba2f3bSAndroid Build Coastguard Worker    adb shell rm -rf /$FUZZ_DIR/corpus /$FUZZ_DIR/crashes /$FUZZ_DIR/gcov
25*7eba2f3bSAndroid Build Coastguard Worker    adb shell mkdir -p /$FUZZ_DIR/corpus /$FUZZ_DIR/crashes /$FUZZ_DIR/gcov
26*7eba2f3bSAndroid Build Coastguard Worker    adb push ./corpus/* /$FUZZ_DIR/corpus/  >/dev/null 2>&1
27*7eba2f3bSAndroid Build Coastguard Worker    rm -rf ./logs ./coverage
28*7eba2f3bSAndroid Build Coastguard Worker
29*7eba2f3bSAndroid Build Coastguard Worker    shift
30*7eba2f3bSAndroid Build Coastguard Worker  fi
31*7eba2f3bSAndroid Build Coastguard Worker
32*7eba2f3bSAndroid Build Coastguard Worker  adb logcat -c
33*7eba2f3bSAndroid Build Coastguard Worker  if [ -z "$1" ];
34*7eba2f3bSAndroid Build Coastguard Worker  then
35*7eba2f3bSAndroid Build Coastguard Worker    PAYLOAD=/$FUZZ_DIR/corpus
36*7eba2f3bSAndroid Build Coastguard Worker    echo "Fuzzing with corpus from $PAYLOAD..."
37*7eba2f3bSAndroid Build Coastguard Worker  else
38*7eba2f3bSAndroid Build Coastguard Worker    PAYLOAD=$1
39*7eba2f3bSAndroid Build Coastguard Worker    echo "Verifying payload $PAYLOAD..."
40*7eba2f3bSAndroid Build Coastguard Worker  fi
41*7eba2f3bSAndroid Build Coastguard Worker
42*7eba2f3bSAndroid Build Coastguard Worker  adb shell mkdir -p /$FUZZ_DIR/corpus /$FUZZ_DIR/crashes /$FUZZ_DIR/gcov
43*7eba2f3bSAndroid Build Coastguard Worker  adb shell LD_LIBRARY_PATH=/system/lib64/vndk-29 GCOV_PREFIX=/$FUZZ_DIR/gcov GCOV_PREFIX_STRIP=3 /$FUZZ_DIR/$FUZZER_NAME $FUZZ_OPTIONS $PAYLOAD
44*7eba2f3bSAndroid Build Coastguard Worker
45*7eba2f3bSAndroid Build Coastguard Worker  echo "==========================================================================================="
46*7eba2f3bSAndroid Build Coastguard Worker  adb logcat -d| $ANDROID_BUILD_TOP/external/compiler-rt/lib/asan/scripts/symbolize.py
47*7eba2f3bSAndroid Build Coastguard Worker}
48*7eba2f3bSAndroid Build Coastguard Worker
49*7eba2f3bSAndroid Build Coastguard Workerfunction run_fuzz() {
50*7eba2f3bSAndroid Build Coastguard Worker  if [ "$1" == "-c" ];
51*7eba2f3bSAndroid Build Coastguard Worker  then
52*7eba2f3bSAndroid Build Coastguard Worker    adb shell rm -rf /$FUZZ_DIR/corpus /$FUZZ_DIR/crashes /$FUZZ_DIR/gcov
53*7eba2f3bSAndroid Build Coastguard Worker    adb shell mkdir -p /$FUZZ_DIR/corpus /$FUZZ_DIR/crashes /$FUZZ_DIR/gcov
54*7eba2f3bSAndroid Build Coastguard Worker    adb push ./corpus/* /$FUZZ_DIR/corpus/  >/dev/null 2>&1
55*7eba2f3bSAndroid Build Coastguard Worker    rm -rf ./logs ./coverage
56*7eba2f3bSAndroid Build Coastguard Worker  fi
57*7eba2f3bSAndroid Build Coastguard Worker
58*7eba2f3bSAndroid Build Coastguard Worker  mkdir -p ./logs/ERROR ./logs/UNKNOWN ./coverage
59*7eba2f3bSAndroid Build Coastguard Worker  while true
60*7eba2f3bSAndroid Build Coastguard Worker  do
61*7eba2f3bSAndroid Build Coastguard Worker    echo "Running ..."
62*7eba2f3bSAndroid Build Coastguard Worker    TS=`date +"%m-%d-%Y-%H-%M-%S"`
63*7eba2f3bSAndroid Build Coastguard Worker    run_once >./logs/fuzz.log 2>&1
64*7eba2f3bSAndroid Build Coastguard Worker
65*7eba2f3bSAndroid Build Coastguard Worker    echo "Fuzzer crashed, looking for crash input ..."
66*7eba2f3bSAndroid Build Coastguard Worker    CRASH=$(grep -aoP "Test unit written to \K\S+" ./logs/fuzz.log)
67*7eba2f3bSAndroid Build Coastguard Worker    if [ -z "$CRASH" ];
68*7eba2f3bSAndroid Build Coastguard Worker    then
69*7eba2f3bSAndroid Build Coastguard Worker      echo "Error, crash not found!"
70*7eba2f3bSAndroid Build Coastguard Worker      mv ./logs/fuzz.log ./logs/ERROR/run_$TS.log
71*7eba2f3bSAndroid Build Coastguard Worker      continue
72*7eba2f3bSAndroid Build Coastguard Worker    fi
73*7eba2f3bSAndroid Build Coastguard Worker
74*7eba2f3bSAndroid Build Coastguard Worker    echo "Verifying crash ..."
75*7eba2f3bSAndroid Build Coastguard Worker    run_once $CRASH >./logs/verify.log 2>&1
76*7eba2f3bSAndroid Build Coastguard Worker    SIG=$(grep -m 1 -aoP "#?? \S+ in \K\S+ system/nfc/src\S+:\S+" ./logs/verify.log)
77*7eba2f3bSAndroid Build Coastguard Worker    if [ -z "$SIG" ];
78*7eba2f3bSAndroid Build Coastguard Worker    then
79*7eba2f3bSAndroid Build Coastguard Worker      SIG='UNKNOWN'
80*7eba2f3bSAndroid Build Coastguard Worker      cat ./logs/verify.log>>./logs/fuzz.log
81*7eba2f3bSAndroid Build Coastguard Worker    else
82*7eba2f3bSAndroid Build Coastguard Worker      cp ./logs/verify.log ./logs/fuzz.log
83*7eba2f3bSAndroid Build Coastguard Worker    fi
84*7eba2f3bSAndroid Build Coastguard Worker
85*7eba2f3bSAndroid Build Coastguard Worker    SIG_DIR=$(echo $SIG | tr " /:" '#@#')
86*7eba2f3bSAndroid Build Coastguard Worker    if [ ! -d "./logs/$SIG_DIR" ];
87*7eba2f3bSAndroid Build Coastguard Worker    then
88*7eba2f3bSAndroid Build Coastguard Worker      echo "New crash category found: $SIG"
89*7eba2f3bSAndroid Build Coastguard Worker      mkdir -p ./logs/$SIG_DIR
90*7eba2f3bSAndroid Build Coastguard Worker    else
91*7eba2f3bSAndroid Build Coastguard Worker      echo "Known crash: $SIG"
92*7eba2f3bSAndroid Build Coastguard Worker    fi
93*7eba2f3bSAndroid Build Coastguard Worker
94*7eba2f3bSAndroid Build Coastguard Worker    mv ./logs/fuzz.log ./logs/$SIG_DIR/run_$TS.log
95*7eba2f3bSAndroid Build Coastguard Worker    adb pull $CRASH ./logs/$SIG_DIR/crash_$TS.bin >/dev/null 2>&1
96*7eba2f3bSAndroid Build Coastguard Worker    adb rm $CRASH >/dev/null 2>&1
97*7eba2f3bSAndroid Build Coastguard Worker  done
98*7eba2f3bSAndroid Build Coastguard Worker}
99*7eba2f3bSAndroid Build Coastguard Worker
100*7eba2f3bSAndroid Build Coastguard Workerfunction build() {
101*7eba2f3bSAndroid Build Coastguard Worker  pushd $ANDROID_BUILD_TOP
102*7eba2f3bSAndroid Build Coastguard Worker  SANITIZE_HOST="address" \
103*7eba2f3bSAndroid Build Coastguard Worker    SANITIZE_TARGET="hwaddress fuzzer" \
104*7eba2f3bSAndroid Build Coastguard Worker    NATIVE_COVERAGE="true" \
105*7eba2f3bSAndroid Build Coastguard Worker    NATIVE_COVERAGE_PATHS="system/nfc/src" \
106*7eba2f3bSAndroid Build Coastguard Worker    make -j $FUZZER_NAME
107*7eba2f3bSAndroid Build Coastguard Worker  popd
108*7eba2f3bSAndroid Build Coastguard Worker  adb shell mkdir -p /$FUZZ_DIR
109*7eba2f3bSAndroid Build Coastguard Worker  adb push $OUT/symbols/$FUZZ_DIR/$FUZZER_NAME /$FUZZ_DIR/
110*7eba2f3bSAndroid Build Coastguard Worker}
111*7eba2f3bSAndroid Build Coastguard Worker
112*7eba2f3bSAndroid Build Coastguard Workerfunction run() {
113*7eba2f3bSAndroid Build Coastguard Worker  if [ "$1" == "--once" ];
114*7eba2f3bSAndroid Build Coastguard Worker  then
115*7eba2f3bSAndroid Build Coastguard Worker    shift
116*7eba2f3bSAndroid Build Coastguard Worker    run_once $@
117*7eba2f3bSAndroid Build Coastguard Worker  else
118*7eba2f3bSAndroid Build Coastguard Worker    echo "fuzzing..."
119*7eba2f3bSAndroid Build Coastguard Worker    run_fuzz $@
120*7eba2f3bSAndroid Build Coastguard Worker  fi
121*7eba2f3bSAndroid Build Coastguard Worker}
122*7eba2f3bSAndroid Build Coastguard Worker
123*7eba2f3bSAndroid Build Coastguard Workerfunction debug() {
124*7eba2f3bSAndroid Build Coastguard Worker  if [ -z "$1" ];
125*7eba2f3bSAndroid Build Coastguard Worker  then
126*7eba2f3bSAndroid Build Coastguard Worker    echo "Which payload?"
127*7eba2f3bSAndroid Build Coastguard Worker    exit
128*7eba2f3bSAndroid Build Coastguard Worker  fi
129*7eba2f3bSAndroid Build Coastguard Worker
130*7eba2f3bSAndroid Build Coastguard Worker  FUZZ_PAYLOAD=$1
131*7eba2f3bSAndroid Build Coastguard Worker
132*7eba2f3bSAndroid Build Coastguard Worker  adb forward tcp:5039 tcp:5039
133*7eba2f3bSAndroid Build Coastguard Worker  adb shell LD_LIBRARY_PATH=/system/lib64/vndk-29 gdbserver64 remote:5039 /$FUZZ_DIR/$FUZZER_NAME $FUZZ_OPTIONS $FUZZ_PAYLOAD 2>&1 >/dev/null&
134*7eba2f3bSAndroid Build Coastguard Worker  sleep 5
135*7eba2f3bSAndroid Build Coastguard Worker  $ANDROID_BUILD_TOP/prebuilts/gdb/linux-x86/bin/gdb --directory=$ANDROID_BUILD_TOP -ex "target remote:5039"
136*7eba2f3bSAndroid Build Coastguard Worker}
137*7eba2f3bSAndroid Build Coastguard Worker
138*7eba2f3bSAndroid Build Coastguard Workerfunction get_cov() {
139*7eba2f3bSAndroid Build Coastguard Worker  mkdir -p ./coverage && adb pull /$FUZZ_DIR/gcov/0/out/soong ./coverage
140*7eba2f3bSAndroid Build Coastguard Worker  unzip -o $OUT/coverage/$FUZZ_DIR/$FUZZER_NAME.zip -d ./coverage
141*7eba2f3bSAndroid Build Coastguard Worker  lcov --directory ./coverage --base-directory $ANDROID_BUILD_TOP --gcov-tool $(pwd)/../llvm-gcov --capture -o ./coverage/cov.info
142*7eba2f3bSAndroid Build Coastguard Worker  TS=`date +"%m-%d-%Y-%H-%M-%S"`
143*7eba2f3bSAndroid Build Coastguard Worker  genhtml ./coverage/cov.info -o ./coverage/report_$TS
144*7eba2f3bSAndroid Build Coastguard Worker  xdg-open ./coverage/report_$TS/index.html
145*7eba2f3bSAndroid Build Coastguard Worker}
146*7eba2f3bSAndroid Build Coastguard Worker
147*7eba2f3bSAndroid Build Coastguard Workerfunction fuzz() {
148*7eba2f3bSAndroid Build Coastguard Worker  init
149*7eba2f3bSAndroid Build Coastguard Worker  action=$1
150*7eba2f3bSAndroid Build Coastguard Worker  shift
151*7eba2f3bSAndroid Build Coastguard Worker
152*7eba2f3bSAndroid Build Coastguard Worker  case "$action" in
153*7eba2f3bSAndroid Build Coastguard Worker    run)
154*7eba2f3bSAndroid Build Coastguard Worker      run $@
155*7eba2f3bSAndroid Build Coastguard Worker      ;;
156*7eba2f3bSAndroid Build Coastguard Worker    build)
157*7eba2f3bSAndroid Build Coastguard Worker      build $@
158*7eba2f3bSAndroid Build Coastguard Worker      ;;
159*7eba2f3bSAndroid Build Coastguard Worker    debug)
160*7eba2f3bSAndroid Build Coastguard Worker      debug $@
161*7eba2f3bSAndroid Build Coastguard Worker      ;;
162*7eba2f3bSAndroid Build Coastguard Worker    gcov)
163*7eba2f3bSAndroid Build Coastguard Worker      get_cov $@
164*7eba2f3bSAndroid Build Coastguard Worker      ;;
165*7eba2f3bSAndroid Build Coastguard Worker    *)
166*7eba2f3bSAndroid Build Coastguard Worker      echo "Usage: $0 {run|build|debug|gcov}"
167*7eba2f3bSAndroid Build Coastguard Worker      exit 1
168*7eba2f3bSAndroid Build Coastguard Worker  esac
169*7eba2f3bSAndroid Build Coastguard Worker}
170*7eba2f3bSAndroid Build Coastguard Worker
171*7eba2f3bSAndroid Build Coastguard Workerif [ "$0" == "${BASH_SOURCE[0]}" ];
172*7eba2f3bSAndroid Build Coastguard Workerthen
173*7eba2f3bSAndroid Build Coastguard Worker  fuzz $@
174*7eba2f3bSAndroid Build Coastguard Workerfi
175*7eba2f3bSAndroid Build Coastguard Worker
176