Skip to content

Commit da45a93

Browse files
Migrate to Generic Fuzzer
1 parent 9501be7 commit da45a93

25 files changed

+692
-982
lines changed

.clusterfuzzlite/Dockerfile

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
FROM ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest AS LITE_BUILDER
1+
FROM ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest AS app-builder
22

33
# Base image with clang toolchain
44
FROM gcr.io/oss-fuzz-base/base-builder:v1
55

6+
# Install additional package dependencies.
7+
RUN pip3 install --break-system-packages --no-cache-dir pillow>=3.4.0
8+
RUN apt update && apt install -y ninja-build zip libbsd-dev pkg-config
9+
610
# Copy the project's source code.
7-
COPY . $SRC/app-ethereum
8-
COPY --from=LITE_BUILDER /opt/ledger-secure-sdk $SRC/app-ethereum/BOLOS_SDK
11+
COPY . /app
12+
COPY --from=app-builder /opt/flex-secure-sdk /ledger-secure-sdk
913

1014
# Add the ethereum-plugin-sdk submodule
11-
RUN git clone https://github.com/LedgerHQ/ethereum-plugin-sdk.git $SRC/app-ethereum/ethereum-plugin-sdk
15+
RUN git clone https://github.com/LedgerHQ/ethereum-plugin-sdk.git /app/ethereum-plugin-sdk
1216

1317
# Working directory for build.sh
14-
WORKDIR $SRC/app-ethereum
18+
WORKDIR /app
1519

1620
# Copy build.sh into $SRC dir.
1721
COPY ./.clusterfuzzlite/build.sh $SRC/

.clusterfuzzlite/build.sh

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,26 @@
11
#!/bin/bash -eu
22

3-
# build fuzzers
3+
export BOLOS_SDK=/ledger-secure-sdk
44

5+
# build fuzzers using the docker images.
56
pushd tests/fuzzing
6-
cmake -DBOLOS_SDK=$(pwd)/../../BOLOS_SDK -B build -S .
7+
cmake -S . -B build -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=Debug \
8+
-G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=On \
9+
-DBOLOS_SDK="${BOLOS_SDK}" -DTARGET=flex \
10+
-DAPP_BUILD_PATH=/app
11+
12+
# Generates .zip for initial corpus in clusterFuzz
13+
for dir in harness/*; do
14+
if [ -d "${dir}" ]; then
15+
fuzzer_name=$(basename "${dir}")
16+
zip_name="${fuzzer_name}_seed_corpus.zip"
17+
echo "Zipping corpus from ${dir} into ${zip_name}"
18+
19+
(cd "${dir}" && zip -q -r "${zip_name}" .)
20+
21+
mv "${dir}/${zip_name}" "${OUT}"
22+
fi
23+
done
724
cmake --build build
8-
mv ./build/fuzzer "${OUT}"
25+
mv ./build/fuzz_* "${OUT}"
926
popd

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ __version__.py
2323
tests/fuzzing/corpus/
2424
tests/fuzzing/out/
2525
tests/fuzzing/CMakeFiles/
26+
tests/fuzzing/macros/generated/
27+
2628
default.profraw
2729
default.profdata
2830
fuzz-*.log

tests/fuzzing/CMakeLists.txt

Lines changed: 80 additions & 218 deletions
Original file line numberDiff line numberDiff line change
@@ -1,239 +1,101 @@
11
cmake_minimum_required(VERSION 3.14)
22

3+
if(${CMAKE_VERSION} VERSION_LESS 3.14)
4+
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
5+
endif()
6+
37
# project information
48
project(EthereumAppFuzzer
59
VERSION 1.0
6-
DESCRIPTION "Eth Fuzzer"
10+
DESCRIPTION "App Ethereum Fuzzer"
711
LANGUAGES C)
812

9-
if (NOT CMAKE_C_COMPILER_ID MATCHES "Clang")
10-
message(FATAL_ERROR "Fuzzer needs to be built with Clang")
13+
if(NOT DEFINED BOLOS_SDK)
14+
message(FATAL_ERROR "BOLOS_SDK must be defined, CMake will exit.")
15+
return()
1116
endif()
1217

13-
# guard against bad build-type strings
14-
if (NOT CMAKE_BUILD_TYPE)
15-
set(CMAKE_BUILD_TYPE "Debug")
16-
endif()
18+
add_subdirectory(${BOLOS_SDK}/fuzzing ${CMAKE_CURRENT_BINARY_DIR}/ledger-secure-sdk EXCLUDE_FROM_ALL)
1719

18-
# default fuzz device target
19-
if (NOT TARGET_DEVICE)
20-
set(TARGET_DEVICE "flex")
21-
endif()
20+
set(DEFINES FUZZ)
2221

23-
if (NOT DEFINED BOLOS_SDK)
24-
set(BOLOS_SDK /opt/${TARGET_DEVICE}-secure-sdk)
25-
endif()
22+
set(APP_SRC ${CMAKE_SOURCE_DIR}/../../src)
23+
set(PLUGIN_SRC ${CMAKE_SOURCE_DIR}/../../ethereum-plugin-sdk/src)
24+
25+
file(GLOB_RECURSE C_SOURCES
26+
${APP_SRC}/*.c
27+
${PLUGIN_SRC}/*.c
28+
${CMAKE_SOURCE_DIR}/mock/*.c
29+
${CMAKE_SOURCE_DIR}/src/fuzz_utils.c
30+
)
31+
list(REMOVE_ITEM C_SOURCES
32+
${APP_SRC}/main.c
33+
${PLUGIN_SRC}/main.c
34+
)
35+
36+
add_library(code_lib ${C_SOURCES})
37+
38+
target_include_directories(
39+
code_lib
40+
PUBLIC ${CMAKE_SOURCE_DIR}/src
41+
${CMAKE_SOURCE_DIR}/mock
42+
${APP_SRC}
43+
${APP_SRC}/features/generic_tx_parser
44+
${APP_SRC}/features/getPublicKey
45+
${APP_SRC}/features/provide_enum_value
46+
${APP_SRC}/features/provide_network_info
47+
${APP_SRC}/features/signTx
48+
${APP_SRC}/features/provide_trusted_name
49+
${APP_SRC}/features/getChallenge
50+
${APP_SRC}/features/signMessageEIP712
51+
${APP_SRC}/features/provide_proxy_info
52+
${APP_SRC}/features/provide_tx_simulation
53+
${APP_SRC}/features/signAuthorizationEIP7702
54+
${APP_SRC}/features/provide_safe_account
55+
${APP_SRC}/features/signMessageEIP712_common
56+
${APP_SRC}/features/signMessageEIP712
57+
${APP_SRC}/features/setPlugin
58+
${APP_SRC}/nbgl
59+
${PLUGIN_SRC}
60+
)
61+
62+
target_link_libraries(code_lib PUBLIC secure_sdk)
63+
target_compile_definitions(code_lib PUBLIC ${DEFINES} FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1)
64+
65+
# Find and add libbsd
66+
find_package(PkgConfig REQUIRED)
67+
pkg_check_modules(LIBBSD REQUIRED libbsd)
2668

27-
# some flags to mimic the embedded build (such as packed enums)
28-
set(CUSTOM_C_FLAGS -fdata-sections -ffunction-sections -funsigned-char -fshort-enums)
29-
30-
# compatible with ClusterFuzzLite
31-
if (NOT DEFINED ENV{LIB_FUZZING_ENGINE})
32-
set(COMPILATION_FLAGS ${CUSTOM_C_FLAGS} -g -O0 -Wall -Wextra -fprofile-instr-generate -fcoverage-mapping)
33-
if (SANITIZER MATCHES "address")
34-
set(COMPILATION_FLAGS ${COMPILATION_FLAGS} -fsanitize=fuzzer,address,undefined)
35-
elseif (SANITIZER MATCHES "memory")
36-
set(COMPILATION_FLAGS ${COMPILATION_FLAGS} -fsanitize=fuzzer,memory,undefined -fsanitize-memory-track-origins -fsanitize=fuzzer-no-link)
37-
else()
38-
message(FATAL_ERROR "Unknown sanitizer type. It must be set to `address` or `memory`.")
39-
endif()
69+
# Try to find the static libbsd library, because the final run image doesn't have dynamic library
70+
# Keep both options to fallback to dynamic if static is not found
71+
find_library(LIBBSD_STATIC_LIB lib${LIBBSD_STATIC_LIBRARIES}.a HINTS ${LIBBSD_LIBRARY_DIRS})
72+
73+
if(LIBBSD_STATIC_LIB)
74+
message(STATUS "Using static libbsd")
75+
target_link_libraries(code_lib PUBLIC ${LIBBSD_STATIC_LIB})
4076
else()
41-
set(COMPILATION_FLAGS "$ENV{LIB_FUZZING_ENGINE} $ENV{CFLAGS} ${CUSTOM_C_FLAGS}")
42-
separate_arguments(COMPILATION_FLAGS)
77+
message(STATUS "Using dynamic libbsd")
78+
target_link_libraries(code_lib PUBLIC ${LIBBSD_LIBRARIES})
4379
endif()
4480

45-
# guard against in-source builds
46-
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
47-
message(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt. ")
48-
endif()
81+
target_include_directories(code_lib PUBLIC ${LIBBSD_INCLUDE_DIRS})
82+
target_compile_options(code_lib PUBLIC ${LIBBSD_CFLAGS_OTHER})
4983

50-
set(DEFINES
51-
gcc
52-
APPNAME=\"Fuzzing\"
53-
API_LEVEL=21
54-
TARGET=\"flex\"
55-
TARGET_NAME=\"TARGET_FUZZ\"
56-
APPVERSION=\"1.1.0\"
57-
SDK_NAME=\"ledger-secure-sdk\"
58-
SDK_VERSION=\"v21.3.3\"
59-
SDK_HASH=\"d88d4db3c93665f52b5b1f45099d9d36dfaa06ba\"
60-
gcc
61-
__IO=volatile
62-
NDEBUG
63-
HAVE_BAGL_FONT_INTER_REGULAR_28PX
64-
HAVE_BAGL_FONT_INTER_SEMIBOLD_28PX
65-
HAVE_BAGL_FONT_INTER_MEDIUM_36PX
66-
HAVE_INAPP_BLE_PAIRING
67-
HAVE_NBGL
68-
HAVE_PIEZO_SOUND
69-
HAVE_SE_TOUCH
70-
HAVE_SE_EINK_DISPLAY
71-
NBGL_PAGE
72-
NBGL_USE_CASE
73-
SCREEN_SIZE_WALLET
74-
HAVE_FAST_HOLD_TO_APPROVE
75-
HAVE_LEDGER_PKI
76-
HAVE_NES_CRYPT
77-
HAVE_ST_AES
78-
NATIVE_LITTLE_ENDIAN
79-
HAVE_CRC
80-
HAVE_HASH
81-
HAVE_RIPEMD160
82-
HAVE_SHA224
83-
HAVE_SHA256
84-
HAVE_SHA3
85-
HAVE_SHA384
86-
HAVE_SHA512
87-
HAVE_SHA512_WITH_BLOCK_ALT_METHOD
88-
HAVE_SHA512_WITH_BLOCK_ALT_METHOD_M0
89-
HAVE_BLAKE2
90-
HAVE_HMAC
91-
HAVE_PBKDF2
92-
HAVE_AES
93-
HAVE_MATH
94-
HAVE_RNG
95-
HAVE_RNG_RFC6979
96-
HAVE_RNG_SP800_90A
97-
HAVE_ECC
98-
HAVE_ECC_WEIERSTRASS
99-
HAVE_ECC_TWISTED_EDWARDS
100-
HAVE_ECC_MONTGOMERY
101-
HAVE_SECP256K1_CURVE
102-
HAVE_SECP256R1_CURVE
103-
HAVE_SECP384R1_CURVE
104-
HAVE_SECP521R1_CURVE
105-
HAVE_FR256V1_CURVE
106-
HAVE_STARK256_CURVE
107-
HAVE_BRAINPOOL_P256R1_CURVE
108-
HAVE_BRAINPOOL_P256T1_CURVE
109-
HAVE_BRAINPOOL_P320R1_CURVE
110-
HAVE_BRAINPOOL_P320T1_CURVE
111-
HAVE_BRAINPOOL_P384R1_CURVE
112-
HAVE_BRAINPOOL_P384T1_CURVE
113-
HAVE_BRAINPOOL_P512R1_CURVE
114-
HAVE_BRAINPOOL_P512T1_CURVE
115-
HAVE_BLS12_381_G1_CURVE
116-
HAVE_CV25519_CURVE
117-
HAVE_CV448_CURVE
118-
HAVE_ED25519_CURVE
119-
HAVE_ED448_CURVE
120-
HAVE_ECDH
121-
HAVE_ECDSA
122-
HAVE_EDDSA
123-
HAVE_ECSCHNORR
124-
HAVE_X25519
125-
HAVE_X448
126-
HAVE_AES_GCM
127-
HAVE_CMAC
128-
HAVE_AES_SIV
129-
COIN_VARIANT=1
130-
HAVE_BOLOS_APP_STACK_CANARY
131-
IO_SEPROXYHAL_BUFFER_SIZE_B=300
132-
HAVE_BLE
133-
BLE_COMMAND_TIMEOUT_MS=2000
134-
HAVE_BLE_APDU
135-
BLE_SEGMENT_SIZE=32
136-
HAVE_DEBUG_THROWS
137-
NBGL_QRCODE
138-
MAJOR_VERSION=1
139-
MINOR_VERSION=1
140-
PATCH_VERSION=0
141-
IO_HID_EP_LENGTH=64
142-
HAVE_SPRINTF
143-
HAVE_SNPRINTF_FORMAT_U
144-
HAVE_IO_USB
145-
HAVE_L4_USBLIB
146-
IO_USB_MAX_ENDPOINTS=4
147-
HAVE_USB_APDU
148-
USB_SEGMENT_SIZE=64
149-
HAVE_WEBUSB
150-
WEBUSB_URL_SIZE_B=0
151-
WEBUSB_URL=
152-
OS_IO_SEPROXYHAL
153-
OS_IO_SEPH_BUFFER_SIZE=259
154-
STANDARD_APP_SYNC_RAPDU
155-
HAVE_SWAP
156-
HAVE_TRANSACTION_CHECKS
157-
HAVE_SAFE_ACCOUNT
158-
explicit_bzero=bzero # Fix for https://github.com/google/sanitizers/issues/1507
159-
)
84+
# Create the different fuzzing targets automatically
85+
file(GLOB FUZZ_HARNESSES "${CMAKE_SOURCE_DIR}/harness/fuzz_*.c")
16086

161-
add_compile_definitions(${DEFINES})
87+
foreach(HARNESS_FILE ${FUZZ_HARNESSES})
88+
# Extract the base name of the file without extension
89+
get_filename_component(HARNESS_NAME ${HARNESS_FILE} NAME_WE)
16290

163-
FILE(
164-
GLOB_RECURSE SDK_STD_SOURCES
165-
${BOLOS_SDK}/lib_standard_app/*.c
166-
${CMAKE_SOURCE_DIR}/../../ethereum-plugin-sdk/src/*.c
167-
./src/mock.c
168-
)
169-
list(
170-
REMOVE_ITEM SDK_STD_SOURCES
171-
${BOLOS_SDK}/lib_standard_app/io.c
172-
${CMAKE_SOURCE_DIR}/../../ethereum-plugin-sdk/src/main.c
173-
${BOLOS_SDK}/lib_standard_app/main.c
174-
${BOLOS_SDK}/lib_standard_app/crypto_helpers.c
175-
)
91+
# Create the executable target
92+
add_executable(${HARNESS_NAME} ${HARNESS_FILE})
17693

177-
include_directories(
178-
${CMAKE_SOURCE_DIR}/../../ethereum-plugin-sdk/src/
179-
${CMAKE_SOURCE_DIR}/../../src
180-
${CMAKE_SOURCE_DIR}/../../src/features/generic_tx_parser/
181-
${CMAKE_SOURCE_DIR}/../../src/features/getPublicKey/
182-
${CMAKE_SOURCE_DIR}/../../src/features/provide_enum_value/
183-
${CMAKE_SOURCE_DIR}/../../src/features/provide_network_info/
184-
${CMAKE_SOURCE_DIR}/../../src/features/signTx/
185-
${CMAKE_SOURCE_DIR}/../../src/features/provide_trusted_name/
186-
${CMAKE_SOURCE_DIR}/../../src/features/getChallenge/
187-
${CMAKE_SOURCE_DIR}/../../src/features/signMessageEIP712/
188-
${CMAKE_SOURCE_DIR}/../../src/features/provide_proxy_info/
189-
${CMAKE_SOURCE_DIR}/../../src/features/provide_tx_simulation/
190-
${CMAKE_SOURCE_DIR}/../../src/features/signAuthorizationEIP7702/
191-
${CMAKE_SOURCE_DIR}/../../src/features/provide_safe_account/
192-
${CMAKE_SOURCE_DIR}/../../src/features/signMessageEIP712_common/
193-
${CMAKE_SOURCE_DIR}/../../src/features/signMessageEIP712/
194-
${CMAKE_SOURCE_DIR}/../../src/nbgl/
195-
${BOLOS_SDK}/include
196-
${BOLOS_SDK}/target/${TARGET_DEVICE}/include
197-
${BOLOS_SDK}/io/include
198-
${BOLOS_SDK}/io_legacy/include
199-
${BOLOS_SDK}/lib_cxng/include
200-
${BOLOS_SDK}/lib_cxng/src
201-
${BOLOS_SDK}/lib_ux_nbgl
202-
${BOLOS_SDK}/lib_nbgl/include
203-
${BOLOS_SDK}/lib_standard_app/
204-
${BOLOS_SDK}/lib_alloc/
205-
${CMAKE_SOURCE_DIR}/src/
206-
)
94+
# Define the compilation options
95+
target_compile_definitions(${HARNESS_NAME} PUBLIC macros FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1)
20796

208-
FILE(GLOB_RECURSE SOURCES
209-
${CMAKE_SOURCE_DIR}/../../src/features/generic_tx_parser/*.c
210-
${CMAKE_SOURCE_DIR}/../../src/features/provide_trusted_name/*.c
211-
${CMAKE_SOURCE_DIR}/../../src/features/getChallenge/*.c
212-
${CMAKE_SOURCE_DIR}/../../src/features/provide_enum_value/*.c
213-
${CMAKE_SOURCE_DIR}/../../src/features/provide_network_info/*.c
214-
${CMAKE_SOURCE_DIR}/../../src/features/provideNFTInformation/*.c
215-
${CMAKE_SOURCE_DIR}/../../src/features/provide_proxy_info/*.c
216-
${CMAKE_SOURCE_DIR}/../../src/features/provide_tx_simulation/*.c
217-
${CMAKE_SOURCE_DIR}/../../src/features/signAuthorizationEIP7702/*.c
218-
${CMAKE_SOURCE_DIR}/../../src/features/provide_safe_account/*.c
219-
${CMAKE_SOURCE_DIR}/../../src/features/signMessageEIP712/*.c
220-
${CMAKE_SOURCE_DIR}/../../src/features/signMessageEIP712_common/*.c
221-
${CMAKE_SOURCE_DIR}/../../src/list.c
222-
${CMAKE_SOURCE_DIR}/../../src/nbgl/ui_utils.c
223-
${CMAKE_SOURCE_DIR}/../../src/mem.c
224-
${CMAKE_SOURCE_DIR}/../../src/mem_utils.c
225-
${CMAKE_SOURCE_DIR}/../../src/network.c
226-
${CMAKE_SOURCE_DIR}/../../src/tlv.c
227-
${CMAKE_SOURCE_DIR}/../../src/tlv_apdu.c
228-
${CMAKE_SOURCE_DIR}/../../src/uint128.c
229-
${CMAKE_SOURCE_DIR}/../../src/uint256.c
230-
${CMAKE_SOURCE_DIR}/../../src/time_format.c
231-
${CMAKE_SOURCE_DIR}/../../src/uint_common.c
232-
${CMAKE_SOURCE_DIR}/../../src/utils.c
233-
${CMAKE_SOURCE_DIR}/../../src/manage_asset_info.c
234-
${CMAKE_SOURCE_DIR}/../../src/hash_bytes.c
235-
)
97+
# Link against the secure_sdk and code_lib libraries
98+
target_link_libraries(${HARNESS_NAME} PUBLIC secure_sdk code_lib)
23699

237-
add_executable(fuzzer src/fuzzer.c ${SDK_STD_SOURCES} ${SOURCES})
238-
target_compile_options(fuzzer PRIVATE ${COMPILATION_FLAGS})
239-
target_link_options(fuzzer PRIVATE ${COMPILATION_FLAGS})
100+
message(STATUS "Creating fuzzer target: ${HARNESS_NAME}")
101+
endforeach()

0 commit comments

Comments
 (0)