Skip to content

Commit d6358aa

Browse files
Merge branch 'master' into codeigniter-http-route
2 parents 6ebff7b + eec2fcc commit d6358aa

File tree

16 files changed

+747
-99
lines changed

16 files changed

+747
-99
lines changed

.circleci/continue_config.yml

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,6 +1250,89 @@ jobs:
12501250
make -C appsec/build -j $(nproc) ddappsec_helper_test
12511251
./appsec/build/tests/helper/ddappsec_helper_test
12521252
1253+
fuzz_appsec_helper:
1254+
parameters:
1255+
resource_class:
1256+
type: string
1257+
default: medium
1258+
working_directory: ~/datadog
1259+
<<: *BARE_DOCKER_MACHINE
1260+
steps:
1261+
- <<: *STEP_CHECKOUT
1262+
- <<: *STEP_ATTACH_WORKSPACE
1263+
- restore_cache:
1264+
name: "Restore Cache"
1265+
keys:
1266+
- hunter-cache-ubuntu-<< parameters.resource_class >>-
1267+
- setup_docker:
1268+
docker_image: ubuntu:23.10
1269+
- run:
1270+
name: Install dependencies
1271+
command: |
1272+
export DEBIAN_FRONTEND=noninteractive
1273+
apt update
1274+
apt install -y wget llvm-17 clang-17 cmake make curl libcurl4-gnutls-dev git
1275+
ln -s /usr/bin/clang-17 /usr/bin/clang
1276+
ln -s /usr/bin/clang++-17 /usr/bin/clang++
1277+
- run: git config --global --add safe.directory /home/circleci/datadog/appsec/third_party/libddwaf
1278+
- run:
1279+
name: CMake
1280+
command: |
1281+
export CC=/usr/bin/clang-17
1282+
export CXX=/usr/bin/clang++-17
1283+
mkdir -p appsec/build ; cd appsec/build
1284+
cmake .. -DCMAKE_BUILD_TYPE=Debug -DDD_APPSEC_BUILD_EXTENSION=OFF \
1285+
-DHUNTER_ROOT=/home/circleci/datadog/hunter-cache
1286+
- run:
1287+
name: Build
1288+
command: make -C appsec/build -j $(nproc) ddappsec_helper_fuzzer corpus_generator
1289+
- run: mkdir -p appsec/tests/fuzzer/{corpus,results,logs}
1290+
- run:
1291+
name: Generate Corpus
1292+
command: |
1293+
cd appsec
1294+
rm -f tests/fuzzer/corpus/*
1295+
./build/tests/fuzzer/corpus_generator tests/fuzzer/corpus 500
1296+
- run:
1297+
name: Run fuzzer in nop mode
1298+
command: |
1299+
export LLVM_PROFILE_FILE=off.profraw
1300+
cd appsec
1301+
./build/tests/fuzzer/ddappsec_helper_fuzzer --log_level=off --fuzz-mode=off -max_total_time=60 -rss_limit_mb=4096 -artifact_prefix=tests/fuzzer/results/ tests/fuzzer/corpus/
1302+
- run:
1303+
name: Generate Corpus
1304+
command: |
1305+
cd appsec
1306+
rm -f tests/fuzzer/corpus/*
1307+
./build/tests/fuzzer/corpus_generator tests/fuzzer/corpus 500
1308+
- run:
1309+
name: Run fuzzer in raw mode
1310+
command: |
1311+
export LLVM_PROFILE_FILE=raw.profraw
1312+
cd appsec
1313+
./build/tests/fuzzer/ddappsec_helper_fuzzer --log_level=off --fuzz-mode=raw -max_total_time=60 -rss_limit_mb=4096 -artifact_prefix=tests/fuzzer/results/ tests/fuzzer/corpus/
1314+
- run:
1315+
name: Generate Corpus
1316+
command: |
1317+
cd appsec
1318+
rm -f tests/fuzzer/corpus/*
1319+
./build/tests/fuzzer/corpus_generator tests/fuzzer/corpus 500
1320+
- run:
1321+
name: Run fuzzer in body mode
1322+
command: |
1323+
export LLVM_PROFILE_FILE=body.profraw
1324+
cd appsec
1325+
./build/tests/fuzzer/ddappsec_helper_fuzzer --log_level=off --fuzz-mode=body -max_total_time=60 -rss_limit_mb=4096 -artifact_prefix=tests/fuzzer/results/ tests/fuzzer/corpus/
1326+
- run:
1327+
name: Generate coverage
1328+
command: |
1329+
cd appsec
1330+
llvm-profdata-17 merge -sparse *.profraw -o default.profdata
1331+
llvm-cov-17 show build/tests/fuzzer/ddappsec_helper_fuzzer -instr-profile=default.profdata -ignore-filename-regex="(tests|third_party|build)" -format=html > fuzzer-coverage.html
1332+
llvm-cov-17 report -instr-profile default.profdata build/tests/fuzzer/ddappsec_helper_fuzzer -ignore-filename-regex="(tests|third_party|build)" -show-region-summary=false
1333+
- store_artifacts:
1334+
path: appsec/fuzzer-coverage.html
1335+
12531336
integration_snapshots:
12541337
working_directory: ~/datadog
12551338
parameters:
@@ -4360,6 +4443,14 @@ workflows:
43604443
- medium
43614444
- arm.medium
43624445

4446+
- fuzz_appsec_helper:
4447+
requires: [ hunter_cache_ubuntu ]
4448+
matrix:
4449+
parameters:
4450+
resource_class:
4451+
- medium
4452+
- arm.medium
4453+
43634454
profiling_tests:
43644455
when: << pipeline.parameters.profiling >>
43654456
jobs:

appsec/cmake/helper.cmake

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
hunter_add_package(Boost COMPONENTS system)
22
find_package(Boost CONFIG REQUIRED COMPONENTS system)
33

4+
hunter_add_package(RapidJSON)
5+
find_package(RapidJSON CONFIG REQUIRED)
6+
set_target_properties(RapidJSON::rapidjson PROPERTIES INTERFACE_COMPILE_DEFINITIONS "RAPIDJSON_HAS_STDSTRING=1")
7+
48
configure_file(src/helper/version.hpp.in ${CMAKE_CURRENT_SOURCE_DIR}/src/helper/version.hpp)
59

610
set(HELPER_SOURCE_DIR src/helper)
@@ -14,7 +18,7 @@ set_target_properties(helper_objects PROPERTIES
1418
POSITION_INDEPENDENT_CODE 1)
1519
target_include_directories(helper_objects PUBLIC ${HELPER_INCLUDE_DIR})
1620
target_compile_definitions(helper_objects PUBLIC SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE)
17-
target_link_libraries(helper_objects PUBLIC libddwaf_objects pthread spdlog cpp-base64 msgpack_c lib_rapidjson Boost::system)
21+
target_link_libraries(helper_objects PUBLIC libddwaf_objects pthread spdlog cpp-base64 msgpack_c RapidJSON::rapidjson Boost::system)
1822

1923
add_executable(ddappsec-helper src/helper/main.cpp
2024
$<TARGET_OBJECTS:helper_objects>
@@ -49,7 +53,7 @@ if(DD_APPSEC_TESTING)
4953
# Testing and examples
5054
add_subdirectory(tests/helper EXCLUDE_FROM_ALL)
5155
#add_subdirectory(tests/bench_helper EXCLUDE_FROM_ALL)
52-
#add_subdirectory(tests/fuzzer EXCLUDE_FROM_ALL)
56+
add_subdirectory(tests/fuzzer EXCLUDE_FROM_ALL)
5357

5458
if(DD_APPSEC_ENABLE_COVERAGE)
5559
target_compile_options(helper_objects PRIVATE --coverage)

appsec/src/helper/client.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@
33
//
44
// This product includes software developed at Datadog
55
// (https://www.datadoghq.com/). Copyright 2021 Datadog, Inc.
6-
#include "client.hpp"
7-
#include "exception.hpp"
8-
#include "network/broker.hpp"
9-
#include "network/proto.hpp"
10-
#include "std_logging.hpp"
116
#include <chrono>
127
#include <spdlog/spdlog.h>
138
#include <stdexcept>
149
#include <string>
1510
#include <thread>
1611

12+
#include "client.hpp"
13+
#include "exception.hpp"
14+
#include "network/broker.hpp"
15+
#include "network/proto.hpp"
16+
#include "std_logging.hpp"
17+
1718
using namespace std::chrono_literals;
1819

1920
namespace dds {
@@ -28,7 +29,7 @@ bool maybe_exec_cmd_M(client &client, network::request &msg)
2829
if constexpr (sizeof...(Mrest) == 0) {
2930
SPDLOG_WARN(
3031
"a message of type {} ({}) was not expected at this point",
31-
msg.id, msg.method);
32+
static_cast<unsigned>(msg.id), msg.method);
3233
throw unexpected_command(msg.method);
3334
} else {
3435
return maybe_exec_cmd_M<Mrest...>(client, msg);

appsec/src/helper/engine.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,14 +203,14 @@ engine::action_map engine::parse_actions(
203203
const auto &actions_array = it->value;
204204
if (actions_array.GetType() != rapidjson::kArrayType) {
205205
SPDLOG_ERROR("unexpected 'actions' type {}, expected array",
206-
actions_array.GetType());
206+
static_cast<unsigned>(actions_array.GetType()));
207207
return actions;
208208
}
209209

210210
for (auto &action_object : actions_array.GetArray()) {
211211
if (action_object.GetType() != rapidjson::kObjectType) {
212212
SPDLOG_ERROR("unexpected action item type {}, expected object",
213-
action_object.GetType());
213+
static_cast<unsigned>(action_object.GetType()));
214214
continue;
215215
}
216216

appsec/src/helper/subscriber/waf.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ std::optional<subscriber::event> instance::listener::call(
177177
ddwaf_result res;
178178
DDWAF_RET_CODE code;
179179
auto run_waf = [&]() {
180-
code = ddwaf_run(handle_, data, &res, waf_timeout_.count());
180+
code = ddwaf_run(handle_, data, nullptr, &res, waf_timeout_.count());
181181
};
182182

183183
if (spdlog::should_log(spdlog::level::debug)) {
@@ -254,7 +254,7 @@ instance::instance(parameter &rule,
254254
}
255255

256256
uint32_t size;
257-
const auto *addrs = ddwaf_required_addresses(handle_, &size);
257+
const auto *addrs = ddwaf_known_addresses(handle_, &size);
258258

259259
addresses_.clear();
260260
for (uint32_t i = 0; i < size; i++) { addresses_.emplace(addrs[i]); }
@@ -302,7 +302,7 @@ instance::instance(
302302
ruleset_version_(std::move(version))
303303
{
304304
uint32_t size;
305-
const auto *addrs = ddwaf_required_addresses(handle_, &size);
305+
const auto *addrs = ddwaf_known_addresses(handle_, &size);
306306

307307
addresses_.clear();
308308
for (uint32_t i = 0; i < size; i++) { addresses_.emplace(addrs[i]); }

appsec/tests/fuzzer/CMakeLists.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0.0)
2+
add_executable(ddappsec_helper_fuzzer ${HELPER_SOURCE} main.cpp mutators.cpp)
3+
set_target_properties(ddappsec_helper_fuzzer PROPERTIES COMPILE_FLAGS "-fsanitize=fuzzer-no-link,address,leak -fprofile-instr-generate -fcoverage-mapping")
4+
set_target_properties(ddappsec_helper_fuzzer PROPERTIES LINK_FLAGS "-fsanitize=fuzzer-no-link,address,leak -fprofile-instr-generate -fcoverage-mapping")
5+
target_include_directories(ddappsec_helper_fuzzer PRIVATE ${HELPER_INCLUDE_DIR})
6+
7+
execute_process(
8+
COMMAND ${CMAKE_CXX_COMPILER} -print-runtime-dir
9+
OUTPUT_VARIABLE LLVM_RUNTIME_DIR
10+
OUTPUT_STRIP_TRAILING_WHITESPACE
11+
)
12+
13+
execute_process(COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE ARCHITECTURE)
14+
15+
target_link_directories(ddappsec_helper_fuzzer PRIVATE ${LLVM_RUNTIME_DIR})
16+
target_link_libraries(ddappsec_helper_fuzzer
17+
PRIVATE libddwaf_objects pthread spdlog cpp-base64 msgpack_c lib_rapidjson Boost::system libclang_rt.fuzzer_no_main-${ARCHITECTURE}.a)
18+
19+
add_executable(corpus_generator corpus_generator.cpp)
20+
target_link_libraries(corpus_generator PRIVATE helper_objects libddwaf_objects pthread spdlog)
21+
endif()

0 commit comments

Comments
 (0)