1*08b48e0bSAndroid Build Coastguard Worker#!/bin/bash 2*08b48e0bSAndroid Build Coastguard Worker# written by jhertz 3*08b48e0bSAndroid Build Coastguard Worker# 4*08b48e0bSAndroid Build Coastguard Worker 5*08b48e0bSAndroid Build Coastguard Workertest "$1" = "-h" -o "$1" = "-hh" -o "$1" = "--help" && { 6*08b48e0bSAndroid Build Coastguard Worker echo 'afl-persistent-config' 7*08b48e0bSAndroid Build Coastguard Worker echo 8*08b48e0bSAndroid Build Coastguard Worker echo $0 9*08b48e0bSAndroid Build Coastguard Worker echo 10*08b48e0bSAndroid Build Coastguard Worker echo afl-persistent-config has no command line options 11*08b48e0bSAndroid Build Coastguard Worker echo 12*08b48e0bSAndroid Build Coastguard Worker echo afl-persistent-config permanently reconfigures the system to a high performance fuzzing state. 13*08b48e0bSAndroid Build Coastguard Worker echo "WARNING: this reduces the security of the system!" 14*08b48e0bSAndroid Build Coastguard Worker echo 15*08b48e0bSAndroid Build Coastguard Worker echo Note that there is also afl-system-config which sets additional runtime 16*08b48e0bSAndroid Build Coastguard Worker echo configuration options. 17*08b48e0bSAndroid Build Coastguard Worker exit 0 18*08b48e0bSAndroid Build Coastguard Worker} 19*08b48e0bSAndroid Build Coastguard Worker 20*08b48e0bSAndroid Build Coastguard Workerif [ $# -ne 0 ]; then 21*08b48e0bSAndroid Build Coastguard Worker echo "ERROR: Unknown option(s): $@" 22*08b48e0bSAndroid Build Coastguard Worker exit 1 23*08b48e0bSAndroid Build Coastguard Workerfi 24*08b48e0bSAndroid Build Coastguard Worker 25*08b48e0bSAndroid Build Coastguard Workerecho 26*08b48e0bSAndroid Build Coastguard Workerecho "WARNING: This scripts makes permanent configuration changes to the system to" 27*08b48e0bSAndroid Build Coastguard Workerecho " increase the performance for fuzzing. As a result, the system also" 28*08b48e0bSAndroid Build Coastguard Workerecho " becomes less secure against attacks! If you use this script, setup" 29*08b48e0bSAndroid Build Coastguard Workerecho " strong firewall rules and only make SSH available as a network" 30*08b48e0bSAndroid Build Coastguard Workerecho " service!" 31*08b48e0bSAndroid Build Coastguard Workerecho 32*08b48e0bSAndroid Build Coastguard Workerecho -n "Type \"YES\" to continue: " 33*08b48e0bSAndroid Build Coastguard Workerread ANSWER 34*08b48e0bSAndroid Build Coastguard Workerif [[ "$ANSWER" != "YES" ]]; then 35*08b48e0bSAndroid Build Coastguard Worker echo Input was not YES, aborting ... 36*08b48e0bSAndroid Build Coastguard Worker exit 1 37*08b48e0bSAndroid Build Coastguard Workerfi 38*08b48e0bSAndroid Build Coastguard Worker 39*08b48e0bSAndroid Build Coastguard Workerecho 40*08b48e0bSAndroid Build Coastguard WorkerPLATFORM=`uname -s` 41*08b48e0bSAndroid Build Coastguard WorkerARCH=`uname -m` 42*08b48e0bSAndroid Build Coastguard Worker 43*08b48e0bSAndroid Build Coastguard Worker# check that we're on Mac 44*08b48e0bSAndroid Build Coastguard Workerif [[ "$PLATFORM" = "Darwin" ]] ; then 45*08b48e0bSAndroid Build Coastguard Worker 46*08b48e0bSAndroid Build Coastguard Worker # check if UID == 0 47*08b48e0bSAndroid Build Coastguard Worker if [[ "$EUID" -ne 0 ]]; then 48*08b48e0bSAndroid Build Coastguard Worker echo "You need to be root to do this. E.g. use \"sudo\"" 49*08b48e0bSAndroid Build Coastguard Worker exit 1 50*08b48e0bSAndroid Build Coastguard Worker fi 51*08b48e0bSAndroid Build Coastguard Worker 52*08b48e0bSAndroid Build Coastguard Worker # check if SIP is disabled 53*08b48e0bSAndroid Build Coastguard Worker if [[ ! $(csrutil status | grep "disabled") ]]; then 54*08b48e0bSAndroid Build Coastguard Worker echo "SIP needs to be disabled. Restart and press Command-R at reboot, Utilities => Terminal => enter \"csrutil disable\"" 55*08b48e0bSAndroid Build Coastguard Worker exit 1 56*08b48e0bSAndroid Build Coastguard Worker fi 57*08b48e0bSAndroid Build Coastguard Worker 58*08b48e0bSAndroid Build Coastguard Worker echo "Checks passed." 59*08b48e0bSAndroid Build Coastguard Worker 60*08b48e0bSAndroid Build Coastguard Worker echo "Installing /Library/LaunchDaemons/shm_setup.plist" 61*08b48e0bSAndroid Build Coastguard Worker 62*08b48e0bSAndroid Build Coastguard Worker cat << EOF > /Library/LaunchDaemons/shm_setup.plist 63*08b48e0bSAndroid Build Coastguard Worker<?xml version="1.0" encoding="UTF-8"?> 64*08b48e0bSAndroid Build Coastguard Worker<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 65*08b48e0bSAndroid Build Coastguard Worker<plist version="1.0"> 66*08b48e0bSAndroid Build Coastguard Worker <dict> 67*08b48e0bSAndroid Build Coastguard Worker <key>Label</key> 68*08b48e0bSAndroid Build Coastguard Worker <string>shmemsetup</string> 69*08b48e0bSAndroid Build Coastguard Worker <key>UserName</key> 70*08b48e0bSAndroid Build Coastguard Worker <string>root</string> 71*08b48e0bSAndroid Build Coastguard Worker <key>GroupName</key> 72*08b48e0bSAndroid Build Coastguard Worker <string>wheel</string> 73*08b48e0bSAndroid Build Coastguard Worker <key>ProgramArguments</key> 74*08b48e0bSAndroid Build Coastguard Worker <array> 75*08b48e0bSAndroid Build Coastguard Worker <string>/usr/sbin/sysctl</string> 76*08b48e0bSAndroid Build Coastguard Worker <string>-w</string> 77*08b48e0bSAndroid Build Coastguard Worker <string>kern.sysv.shmmax=524288000</string> 78*08b48e0bSAndroid Build Coastguard Worker <string>kern.sysv.shmmin=1</string> 79*08b48e0bSAndroid Build Coastguard Worker <string>kern.sysv.shmmni=128</string> 80*08b48e0bSAndroid Build Coastguard Worker <string>kern.sysv.shmseg=48</string> 81*08b48e0bSAndroid Build Coastguard Worker <string>kern.sysv.shmall=131072000</string> 82*08b48e0bSAndroid Build Coastguard Worker </array> 83*08b48e0bSAndroid Build Coastguard Worker <key>KeepAlive</key> 84*08b48e0bSAndroid Build Coastguard Worker <false/> 85*08b48e0bSAndroid Build Coastguard Worker <key>RunAtLoad</key> 86*08b48e0bSAndroid Build Coastguard Worker <true/> 87*08b48e0bSAndroid Build Coastguard Worker </dict> 88*08b48e0bSAndroid Build Coastguard Worker</plist> 89*08b48e0bSAndroid Build Coastguard WorkerEOF 90*08b48e0bSAndroid Build Coastguard Worker 91*08b48e0bSAndroid Build Coastguard Worker if [[ "$ARCH" = "x86_64" ]]; then 92*08b48e0bSAndroid Build Coastguard Worker echo "Disabling ASLR system wide" 93*08b48e0bSAndroid Build Coastguard Worker nvram boot-args="no_aslr=1" 94*08b48e0bSAndroid Build Coastguard Worker else 95*08b48e0bSAndroid Build Coastguard Worker echo NOTICE: on ARM64 we do not know currently how to disable system wide ASLR, please report if you know how. 96*08b48e0bSAndroid Build Coastguard Worker fi 97*08b48e0bSAndroid Build Coastguard Worker 98*08b48e0bSAndroid Build Coastguard Worker echo 99*08b48e0bSAndroid Build Coastguard Worker echo "Reboot and enjoy your fuzzing" 100*08b48e0bSAndroid Build Coastguard Worker exit 0 101*08b48e0bSAndroid Build Coastguard Workerfi 102*08b48e0bSAndroid Build Coastguard Worker 103*08b48e0bSAndroid Build Coastguard Workerif [[ "$PLATFORM" = "Linux" ]] ; then 104*08b48e0bSAndroid Build Coastguard Worker 105*08b48e0bSAndroid Build Coastguard Worker # check if UID == 0 106*08b48e0bSAndroid Build Coastguard Worker if [[ "$EUID" -ne 0 ]]; then 107*08b48e0bSAndroid Build Coastguard Worker echo "You need to be root to do this. E.g. use \"sudo\"" 108*08b48e0bSAndroid Build Coastguard Worker exit 1 109*08b48e0bSAndroid Build Coastguard Worker fi 110*08b48e0bSAndroid Build Coastguard Worker 111*08b48e0bSAndroid Build Coastguard Worker echo "Checks passed." 112*08b48e0bSAndroid Build Coastguard Worker 113*08b48e0bSAndroid Build Coastguard Worker test -d /etc/sysctl.d || echo Error: /etc/sysctl.d directory not found, cannot install shmem config 114*08b48e0bSAndroid Build Coastguard Worker test -d /etc/sysctl.d -a '!' -e /etc/sysctl.d/99-fuzzing.conf && { 115*08b48e0bSAndroid Build Coastguard Worker echo "Installing /etc/sysctl.d/99-fuzzing.conf" 116*08b48e0bSAndroid Build Coastguard Worker cat << EOF > /etc/sysctl.d/99-fuzzing.conf 117*08b48e0bSAndroid Build Coastguard Workerkernel.core_uses_pid=0 118*08b48e0bSAndroid Build Coastguard Workerkernel.core_pattern=core 119*08b48e0bSAndroid Build Coastguard Workerkernel.randomize_va_space=0 120*08b48e0bSAndroid Build Coastguard Workerkernel.sched_child_runs_first=1 121*08b48e0bSAndroid Build Coastguard Workerkernel.sched_autogroup_enabled=1 122*08b48e0bSAndroid Build Coastguard Workerkernel.sched_migration_cost_ns=50000000 123*08b48e0bSAndroid Build Coastguard Workerkernel.sched_latency_ns=250000000 124*08b48e0bSAndroid Build Coastguard WorkerEOF 125*08b48e0bSAndroid Build Coastguard Worker } 126*08b48e0bSAndroid Build Coastguard Worker 127*08b48e0bSAndroid Build Coastguard Worker grep -E -q '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub 2>/dev/null || echo Error: /etc/default/grub with GRUB_CMDLINE_LINUX_DEFAULT is not present, cannot set boot options 128*08b48e0bSAndroid Build Coastguard Worker grep -E -q '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub 2>/dev/null && { 129*08b48e0bSAndroid Build Coastguard Worker grep -E '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub | grep -E -q 'noibrs pcid nopti' || { 130*08b48e0bSAndroid Build Coastguard Worker echo "Configuring performance boot options" 131*08b48e0bSAndroid Build Coastguard Worker LINE=`grep -E '^GRUB_CMDLINE_LINUX_DEFAULT=' /etc/default/grub | sed 's/^GRUB_CMDLINE_LINUX_DEFAULT=//' | tr -d '"'` 132*08b48e0bSAndroid Build Coastguard Worker OPTIONS="$LINE ibpb=off ibrs=off kpti=off l1tf=off mds=off mitigations=off no_stf_barrier noibpb noibrs pcid nopti nospec_store_bypass_disable nospectre_v1 nospectre_v2 pcid=on pti=off spec_store_bypass_disable=off spectre_v2=off stf_barrier=off srbds=off noexec=off noexec32=off tsx=on tsx=on tsx_async_abort=off mitigations=off audit=0 hardened_usercopy=off ssbd=force-off" 133*08b48e0bSAndroid Build Coastguard Worker echo Setting boot options in /etc/default/grub to GRUB_CMDLINE_LINUX_DEFAULT=\"$OPTIONS\" 134*08b48e0bSAndroid Build Coastguard Worker sed -i "s|^GRUB_CMDLINE_LINUX_DEFAULT=.*|GRUB_CMDLINE_LINUX_DEFAULT=\"$OPTIONS\"|" /etc/default/grub 135*08b48e0bSAndroid Build Coastguard Worker } 136*08b48e0bSAndroid Build Coastguard Worker } 137*08b48e0bSAndroid Build Coastguard Worker 138*08b48e0bSAndroid Build Coastguard Worker echo 139*08b48e0bSAndroid Build Coastguard Worker echo "Reboot and enjoy your fuzzing" 140*08b48e0bSAndroid Build Coastguard Worker exit 0 141*08b48e0bSAndroid Build Coastguard Workerfi 142*08b48e0bSAndroid Build Coastguard Worker 143*08b48e0bSAndroid Build Coastguard Worker 144*08b48e0bSAndroid Build Coastguard Worker 145*08b48e0bSAndroid Build Coastguard Workerecho "Error: Unknown platform \"$PLATFORM\", currently supported are Linux and MacOS." 146*08b48e0bSAndroid Build Coastguard Workerexit 1 147