|
1 | 1 | cmake_minimum_required(VERSION 3.14) |
2 | 2 |
|
| 3 | +if(${CMAKE_VERSION} VERSION_LESS 3.14) |
| 4 | + cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) |
| 5 | +endif() |
| 6 | + |
3 | 7 | # project information |
4 | 8 | project(EthereumAppFuzzer |
5 | 9 | VERSION 1.0 |
6 | | - DESCRIPTION "Eth Fuzzer" |
| 10 | + DESCRIPTION "App Ethereum Fuzzer" |
7 | 11 | LANGUAGES C) |
8 | 12 |
|
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() |
11 | 16 | endif() |
12 | 17 |
|
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) |
17 | 19 |
|
18 | | -# default fuzz device target |
19 | | -if (NOT TARGET_DEVICE) |
20 | | - set(TARGET_DEVICE "flex") |
21 | | -endif() |
| 20 | +set(DEFINES FUZZ) |
22 | 21 |
|
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) |
26 | 68 |
|
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}) |
40 | 76 | 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}) |
43 | 79 | endif() |
44 | 80 |
|
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}) |
49 | 83 |
|
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") |
160 | 86 |
|
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) |
162 | 90 |
|
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}) |
176 | 93 |
|
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) |
207 | 96 |
|
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) |
236 | 99 |
|
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