forked from TheCoryBarker/jazzer
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathaosp_setup.sh
More file actions
executable file
·256 lines (215 loc) · 8.55 KB
/
aosp_setup.sh
File metadata and controls
executable file
·256 lines (215 loc) · 8.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
#!/bin/bash
set -euo pipefail
CONFIG_FILE="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)/configuration.sh"
show_help() {
echo "Usage:"
echo " source aosp_setup.sh configure --aosp_home <path> --sdk_home <path> --ndk_home <path>"
echo " source aosp_setup.sh setup_r8"
echo " source aosp_setup.sh setup_jazzer_runtime"
echo " source aosp_setup.sh setup"
echo " source aosp_setup.sh help"
echo
echo "Notes:"
echo "- 'configure' writes paths to configuration.sh located next to this script."
echo "- Subsequent commands read that file to set environment variables."
}
require_cmd() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "Error: required command not found: $1" >&2
return 1
fi
}
abs_path() {
cd "$1" >/dev/null 2>&1 && pwd
}
load_config() {
if [ ! -f "$CONFIG_FILE" ]; then
echo "Error: configuration not found at $CONFIG_FILE. Run 'configure' first." >&2
return 1
fi
# shellcheck disable=SC1090
source "$CONFIG_FILE"
}
write_config() {
cat > "$CONFIG_FILE" <<EOF
#!/bin/bash
export AOSP_TOP_INPUT="$AOSP_TOP_INPUT"
export SDK_HOME_INPUT="$SDK_HOME_INPUT"
export NDK_HOME_INPUT="$NDK_HOME_INPUT"
EOF
echo "Wrote configuration to $CONFIG_FILE"
}
configure_cmd() {
local AOSP_TOP_INPUT=""
local SDK_HOME_INPUT=""
local NDK_HOME_INPUT=""
while [[ $# -gt 0 ]]; do
case "$1" in
--aosp_home=*) AOSP_TOP_INPUT="${1#*=}"; shift ;;
--aosp_home) AOSP_TOP_INPUT="$2"; shift 2 ;;
--sdk_home=*) SDK_HOME_INPUT="${1#*=}"; shift ;;
--sdk_home) SDK_HOME_INPUT="$2"; shift 2 ;;
--ndk_home=*) NDK_HOME_INPUT="${1#*=}"; shift ;;
--ndk_home) NDK_HOME_INPUT="$2"; shift 2 ;;
-h|--help) show_help; return 0 ;;
*) echo "Unknown argument: $1"; show_help; return 1 ;;
esac
done
if [ -z "${AOSP_TOP_INPUT:-}" ] || [ -z "${SDK_HOME_INPUT:-}" ] || [ -z "${NDK_HOME_INPUT:-}" ]; then
echo "Error: --aosp_home, --sdk_home, and --ndk_home are required." >&2
show_help
return 1
fi
if [ ! -d "$AOSP_TOP_INPUT" ]; then echo "Error: AOSP path invalid: $AOSP_TOP_INPUT" >&2; return 1; fi
if [ ! -d "$SDK_HOME_INPUT" ]; then echo "Error: SDK path invalid: $SDK_HOME_INPUT" >&2; return 1; fi
if [ ! -d "$NDK_HOME_INPUT" ]; then echo "Error: NDK path invalid: $NDK_HOME_INPUT" >&2; return 1; fi
AOSP_TOP_INPUT="$(abs_path "$AOSP_TOP_INPUT")"
SDK_HOME_INPUT="$(abs_path "$SDK_HOME_INPUT")"
NDK_HOME_INPUT="$(abs_path "$NDK_HOME_INPUT")"
write_config
# Prepare paths for initial r8 copy
local JAZZER_TOP
local AOSP_R8_PATH
local LOCAL_R8_PATH
local JAZZER_R8_PATH
JAZZER_TOP="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
AOSP_R8_PATH="${AOSP_TOP_INPUT}/prebuilts/r8/r8.jar"
LOCAL_R8_PATH="${JAZZER_TOP}/third_party/android/r8.jar"
JAZZER_R8_PATH="$JAZZER_TOP/bazel-bin/src/main/java/com/code_intelligence/jazzer/android/r8_deploy.jar"
# Ensure local r8.jar exists by copying from AOSP if missing
if [ ! -f "$LOCAL_R8_PATH" ] && [ -f "$AOSP_R8_PATH" ]; then
mkdir -p "$(dirname "$LOCAL_R8_PATH")"
cp "$AOSP_R8_PATH" "$LOCAL_R8_PATH"
echo "Copied initial local r8.jar from AOSP to $LOCAL_R8_PATH"
fi
echo "Configuration complete."
}
setup_r8_cmd() {
load_config
export AOSP_TOP="$(abs_path "$AOSP_TOP_INPUT")"
export ANDROID_HOME="$(abs_path "$SDK_HOME_INPUT")"
export ANDROID_NDK_HOME="$(abs_path "$NDK_HOME_INPUT")"
require_cmd bazelisk
local AOSP_R8_PATH="$AOSP_TOP/prebuilts/r8/r8.jar"
local JAZZER_TOP="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
local JAZZER_R8_PATH="$JAZZER_TOP/bazel-bin/src/main/java/com/code_intelligence/jazzer/android/r8_deploy.jar"
# Clean AOSP r8 prebuilts so the build picks up changes
rm -rf "$AOSP_TOP/out/soong/.intermediates/prebuilts/r8" || true
rm -f "$AOSP_TOP/out/host/linux-x86/framework/r8.jar" || true
# Build customized r8
bazelisk build src/main/java/com/code_intelligence/jazzer/android:r8_deploy.jar
# Replace AOSP r8.jar with our build
rm -f "$AOSP_R8_PATH" || true
cp "$JAZZER_R8_PATH" "$AOSP_R8_PATH"
echo "Updated AOSP r8.jar at $AOSP_R8_PATH"
# Ensure default Jazzer instrumentation config exists
local JAZZER_CFG_DIR="$AOSP_TOP/prebuilts/jazzer"
local JAZZER_CFG_FILE="$JAZZER_CFG_DIR/jazzer_instrumentation_config.json"
if [ ! -f "$JAZZER_CFG_FILE" ]; then
mkdir -p "$JAZZER_CFG_DIR"
cat > "$JAZZER_CFG_FILE" <<'EOF'
{
"enabled_hooks": [
"com.code_intelligence.jazzer.sanitizers.IntentRedirection"
],
"instrumentation_includes": [
"com.app.**"
],
"instrumentation_excludes": [
"com.code_intelligence.jazzer.**"
]
}
EOF
echo "Created default Jazzer instrumentation config at $JAZZER_CFG_FILE"
fi
}
setup_jazzer_runtime_cmd() {
load_config
export AOSP_TOP="$(abs_path "$AOSP_TOP_INPUT")"
export ANDROID_HOME="$(abs_path "$SDK_HOME_INPUT")"
export ANDROID_NDK_HOME="$(abs_path "$NDK_HOME_INPUT")"
require_cmd bazelisk
# Clean jazzer runtime related prebuilts
rm -rf "$AOSP_TOP/out/soong/.intermediates/tools/security/fuzzing/jazzer" || true
rm -rf "$AOSP_TOP/out/target/product/generic_arm64/symbols/system/app" || true
# Build jazzer android deploy jar
bazelisk build --config=android_arm //src/main/java/com/code_intelligence/jazzer/android:jazzer_android_deploy.jar
local JAZZER_FOR_ANDROID_OUTPUT="bazel-bin/src/main/java/com/code_intelligence/jazzer/android/jazzer_android_deploy.jar"
if [ -f "$JAZZER_FOR_ANDROID_OUTPUT" ]; then
local JAZZER_EXTRACT_DIR
JAZZER_EXTRACT_DIR="$(mktemp -d 2>/dev/null || mktemp -d -t jazzer_extract)"
if command -v unzip >/dev/null 2>&1; then
unzip -q -o "$JAZZER_FOR_ANDROID_OUTPUT" -d "$JAZZER_EXTRACT_DIR"
elif command -v jar >/dev/null 2>&1; then
(cd "$JAZZER_EXTRACT_DIR" && jar xf "$(pwd -P)/$JAZZER_FOR_ANDROID_OUTPUT")
else
echo "Warning: neither 'unzip' nor 'jar' available to extract $JAZZER_FOR_ANDROID_OUTPUT" >&2
fi
# Inner jazzer.jar path
local JAZZER_JAR_PATH
JAZZER_JAR_PATH="$(find "$JAZZER_EXTRACT_DIR" -type f -path "*/com/code_intelligence/jazzer/jazzer.jar" | head -n1)"
[ -n "$JAZZER_JAR_PATH" ] && export JAZZER_JAR_PATH
# Collect .so files
mapfile -t JAZZER_SO_FILES < <(find "$JAZZER_EXTRACT_DIR" -type f -name "*.so" | sort)
export JAZZER_SO_COUNT="${#JAZZER_SO_FILES[@]}"
export JAZZER_SO_PATHS="${JAZZER_SO_FILES[*]}"
local idx=1
for so in "${JAZZER_SO_FILES[@]}"; do
export "JAZZER_SO_${idx}"="$so"
idx=$((idx+1))
done
echo "JAZZER_JAR_PATH=$JAZZER_JAR_PATH"
echo "JAZZER_SO_COUNT=$JAZZER_SO_COUNT"
echo "JAZZER_SO_PATHS=$JAZZER_SO_PATHS"
# Create / clear the runtime directory
JAZZER_RUNTIME_AOSP_DIRECTORY=$AOSP_TOP/tools/security/fuzzing/jazzer
rm -rf "$JAZZER_RUNTIME_AOSP_DIRECTORY"
# Copy all .so libraries
local NATIVE_LIBS_DIR="$JAZZER_RUNTIME_AOSP_DIRECTORY/jazzer_library/lib/arm64"
mkdir -p "$NATIVE_LIBS_DIR"
for so in "${JAZZER_SO_FILES[@]}"; do
cp -f "$so" "$NATIVE_LIBS_DIR/"
echo "Copied $(basename "$so") to $NATIVE_LIBS_DIR"
done
# Copy jazzer.jar to the runtime directory root
if [ -n "${JAZZER_JAR_PATH:-}" ] && [ -f "$JAZZER_JAR_PATH" ]; then
mkdir -p "$JAZZER_RUNTIME_AOSP_DIRECTORY"
cp -f "$JAZZER_JAR_PATH" "$JAZZER_RUNTIME_AOSP_DIRECTORY/jazzer_library/jazzer.jar"
echo "Copied jazzer.jar to $JAZZER_RUNTIME_AOSP_DIRECTORY"
else
echo "Warning: jazzer.jar not found to copy (JAZZER_JAR_PATH=$JAZZER_JAR_PATH)" >&2
fi
# Copy aosp_files directory tree into the runtime directory, preserving structure
local JAZZER_TOP
JAZZER_TOP="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
local SRC_AOSP_FILES_DIR="$JAZZER_TOP/aosp_files"
if [ -d "$SRC_AOSP_FILES_DIR" ]; then
mkdir -p "$JAZZER_RUNTIME_AOSP_DIRECTORY"
if command -v rsync >/dev/null 2>&1; then
rsync -a "$SRC_AOSP_FILES_DIR/" "$JAZZER_RUNTIME_AOSP_DIRECTORY/"
else
cp -a "$SRC_AOSP_FILES_DIR/." "$JAZZER_RUNTIME_AOSP_DIRECTORY/"
fi
echo "Copied contents of $SRC_AOSP_FILES_DIR to $JAZZER_RUNTIME_AOSP_DIRECTORY (structure preserved)."
else
echo "Warning: aosp_files directory not found at $SRC_AOSP_FILES_DIR" >&2
fi
fi
}
setup_cmd() {
setup_r8_cmd "$@"
setup_jazzer_runtime_cmd "$@"
}
main() {
local cmd="${1:-help}"
shift || true
case "$cmd" in
help|-h|--help) show_help ;;
configure) configure_cmd "$@" ;;
setup_r8) setup_r8_cmd "$@" ;;
setup_jazzer_runtime) setup_jazzer_runtime_cmd "$@" ;;
setup) setup_cmd "$@" ;;
*) echo "Unknown command: $cmd"; show_help; return 1 ;;
esac
}
main "$@"