-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
147 lines (130 loc) · 6.22 KB
/
Copy pathDockerfile
File metadata and controls
147 lines (130 loc) · 6.22 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
# LAAF Fuzzing Environment
# Based on Ubuntu 24.04 with full fuzzing toolchain
#
# Build:
# docker build -t laaf-fuzz -f Dockerfile .
#
# Run:
# docker run -it --privileged -v $(pwd):/workspace laaf-fuzz
FROM oss-fuzz-claude:24.04
# ================================================================
# 1. Base toolchain
# ================================================================
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
# Compilers & build tools
clang-18 clang-tools-18 lld-18 llvm-18-dev \
cmake make ninja-build pkg-config \
build-essential gdb git curl wget ca-certificates \
# Dynamic libc++ (key: makes AFL fork server work!)
libc++-18-dev libc++abi-18-dev \
# Python for seed generation
python3 python3-pip python3-venv \
# Common libs
libssl-dev zlib1g-dev \
&& rm -rf /var/lib/apt/lists/*
# Clang symlinks
RUN update-alternatives --install /usr/bin/clang clang /usr/bin/clang-18 100 \
&& update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-18 100 \
&& update-alternatives --install /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-18 100 \
&& update-alternatives --install /usr/bin/llvm-profdata llvm-profdata /usr/bin/llvm-profdata-18 100 \
&& update-alternatives --install /usr/bin/llvm-symbolizer llvm-symbolizer /usr/bin/llvm-symbolizer-18 100
# ================================================================
# 2. Fuzzing engines
# ================================================================
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
# AFL++ (Ubuntu 24.04 has afl++ 4.x)
afl++ afl++-clang afl++-doc \
# Honggfuzz
honggfuzz \
# Radamsa (test-case generator)
radamsa \
&& rm -rf /var/lib/apt/lists/*
# libFuzzer is built into clang-18, no separate install needed.
# Verify:
RUN clang --version | head -1 && \
echo "libFuzzer: $(clang -fsanitize=fuzzer -x c /dev/null -o /dev/null 2>&1 || echo 'available')" && \
afl-fuzz --version 2>&1 | head -1 && \
honggfuzz --help 2>&1 | head -1
# ================================================================
# 3. LAAF project dependencies
# ================================================================
# --- RE2 + Abseil ---
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
libre2-dev libabsl-dev \
&& rm -rf /var/lib/apt/lists/*
# --- json-c ---
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
libjson-c-dev \
&& rm -rf /var/lib/apt/lists/*
# --- PCRE2 (for diff fuzzer) ---
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
libpcre2-dev libpcre2-8-0 \
&& rm -rf /var/lib/apt/lists/*
# ================================================================
# 4. Sanitizers (all from clang-18)
# ================================================================
RUN echo "=== Available sanitizers ===" \
&& echo "ASAN: $(clang -fsanitize=address -x c /dev/null -o /dev/null 2>&1 || echo 'OK')" \
&& echo "UBSAN: $(clang -fsanitize=undefined -x c /dev/null -o /dev/null 2>&1 || echo 'OK')" \
&& echo "MSAN: $(clang -fsanitize=memory -x c /dev/null -o /dev/null 2>&1 || echo 'needs libc++ msan')" \
&& echo "TSAN: $(clang -fsanitize=thread -x c /dev/null -o /dev/null 2>&1 || echo 'OK')"
# ================================================================
# 5. Coverage tools
# ================================================================
RUN pip3 install --break-system-packages gcovr 2>/dev/null || true
# ================================================================
# 6. Environment setup
# ================================================================
ENV CC=clang
ENV CXX=clang++
ENV AFL_CC=clang
ENV AFL_CXX=clang++
ENV AFL_SKIP_CPUFREQ=1
# Default ASAN options
ENV ASAN_OPTIONS="detect_leaks=0:abort_on_error=1:symbolize=0"
# libc++ paths (dynamic linking — no more fork server OOM!)
ENV LIBCXX_INCLUDE=/usr/include/c++/v1
ENV LIBCXX_LIB=/usr/lib/$(clang -print-multiarch 2>/dev/null || echo x86_64-linux-gnu)
# ================================================================
# 7. Build flags reference (documenting, not setting)
# ================================================================
# Standard LAAF build:
# clang++ -std=c++17 -O2 -g \
# -fsanitize=fuzzer,address,undefined \
# -fno-omit-frame-pointer \
# -stdlib=libc++ \
# I<includes> ... \
# -lc++ -lc++abi
#
# AFL++ build:
# afl-clang-fast++ -std=c++17 -O2 -g \
# -stdlib=libc++ \
# I<includes> ... \
# -lc++ -lc++abi
#
# Coverage build:
# clang++ -std=c++17 -O1 -g \
# -fprofile-instr-generate -fcoverage-mapping \
# -stdlib=libc++ \
# I<includes> ...
# ================================================================
# 8. Working directory
# ================================================================
WORKDIR /workspace
# Print environment summary
RUN echo "" \
&& echo "╔══════════════════════════════════════════╗" \
&& echo "║ LAAF Fuzzing Environment Ready ║" \
&& echo "╠══════════════════════════════════════════╣" \
&& echo "║ OS: $(. /etc/os-release && echo $NAME $VERSION)" \
&& echo "║ Clang: $(clang --version | head -1)" \
&& echo "║ libc++: $(dpkg -l | grep libc++-18-dev | awk '{print $3}')" \
&& echo "║ AFL++: $(afl-fuzz --version 2>&1 | head -1 | cut -c1-40)" \
&& echo "║ libFuzzer: built into clang" \
&& echo "║ Honggfuzz: $(honggfuzz --help 2>&1 | grep Version | head -1 || echo 'installed')" \
&& echo "║ RE2: $(dpkg -l | grep libre2-dev | awk '{print $3}')" \
&& echo "║ json-c: $(dpkg -l | grep libjson-c-dev | awk '{print $3}')" \
&& echo "║ PCRE2: $(dpkg -l | grep libpcre2-dev | awk '{print $3}')" \
&& echo "║ abseil: $(dpkg -l | grep libabsl-dev | awk '{print $3}')" \
&& echo "║ libc++: DYNAMIC ($(ls $LIBCXX_LIB/libc++.so* 2>/dev/null | head -1))" \
&& echo "╚══════════════════════════════════════════╝"