Skip to content

Commit

Permalink
Merge pull request #2443 from DataDog/glopes/roadrunner
Browse files Browse the repository at this point in the history
Roadrunner appsec support
  • Loading branch information
cataphract committed Jan 23, 2024
2 parents e16b2d0 + 5fa4475 commit c510ee1
Show file tree
Hide file tree
Showing 299 changed files with 19,603 additions and 864 deletions.
28 changes: 28 additions & 0 deletions .circleci/continue_config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1085,6 +1085,24 @@ jobs:
name: Test
command: make -C appsec/build -j $(nproc) xtest

test_appsec_integration:
parameters:
resource_class:
type: string
default: large
targets:
type: string
working_directory: ~/datadog
<<: *BARE_DOCKER_MACHINE
steps:
- <<: *STEP_CHECKOUT
- <<: *STEP_ATTACH_WORKSPACE
- run:
name: Integration tests
command: |
cd appsec/tests/integration && \
TERM=dumb ./gradlew loadCaches << parameters.targets >> --info -Pbuildscan --scan
hunter_cache_ubuntu:
parameters:
resource_class:
Expand Down Expand Up @@ -4524,6 +4542,16 @@ workflows:
switch_php_version:
- debug-zts-asan

- test_appsec_integration:
matrix:
parameters:
resource_class:
- large
targets:
- test7.0-release test7.0-release-zts test7.1-release test7.1-release-zts test7.2-release test7.2-release-zts
- test7.3-release test7.3-release-zts test7.4-release test7.4-release-zts test8.0-release test8.0-release-zts
- test8.1-release test8.1-release-zts test8.2-release test8.2-release-zts test8.3-release test8.3-release-zts

- coverage_appsec:
requires: [ hunter_cache_ubuntu ]
matrix:
Expand Down
7 changes: 5 additions & 2 deletions appsec/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
cmake_minimum_required(VERSION 3.14)


list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../cmake/Modules")

option(HUNTER_STATUS_DEBUG "Print Hunter debug info" OFF)

include("cmake/HunterGate.cmake")
HunterGate(
URL "https://github.com/cpp-pm/hunter/archive/v0.23.314.tar.gz"
SHA1 "95c47c92f68edb091b5d6d18924baabe02a6962a")
URL "https://github.com/cpp-pm/hunter/archive/v0.25.3.tar.gz"
SHA1 "0dfbc2cb5c4cf7e83533733bdfd2125ff96680cb")

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/hunter-cache.id.in ${CMAKE_CURRENT_SOURCE_DIR}/hunter-cache.id)

Expand All @@ -30,6 +31,8 @@ option(DD_APPSEC_TESTING "Whether to enable testing" ON)

add_subdirectory(third_party EXCLUDE_FROM_ALL)

include("cmake/patchelf.cmake")

if (DD_APPSEC_BUILD_EXTENSION)
include("cmake/extension.cmake")
endif()
Expand Down
5 changes: 3 additions & 2 deletions appsec/cmake/extension.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ if(COMPILER_HAS_NO_GNU_UNIQUE)
target_compile_options(extension PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-gnu-unique>)
endif()
target_compile_options(extension PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-rtti -fno-exceptions>)
target_compile_options(extension PRIVATE -Wall -Wextra -Wno-unused-parameter)
target_compile_options(extension PRIVATE -Wall -Wextra -Werror)
# our thread local variables are only used by ourselves
target_compile_options(extension PRIVATE -ftls-model=local-dynamic)

Expand All @@ -54,9 +54,10 @@ target_linker_flag_conditional(extension -Wl,--as-needed)
target_linker_flag_conditional(extension "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/ddappsec.version")

# Mac OS
target_linker_flag_conditional(extension -flat_namespace -undefined suppress)
target_linker_flag_conditional(extension -flat_namespace "-undefined suppress")
target_linker_flag_conditional(extension -Wl,-exported_symbol -Wl,_get_module)

patch_away_libc(extension)

if(DD_APPSEC_TESTING)
if(DD_APPSEC_ENABLE_COVERAGE)
Expand Down
17 changes: 17 additions & 0 deletions appsec/cmake/patchelf.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
function(patch_away_libc target)
if (NOT ${DD_APPSEC_ENABLE_PATCHELF_LIBC})
return()
endif()

if (CMAKE_SYSTEM_NAME STREQUAL Darwin)
return()
endif()

find_program(PATCHELF patchelf)
if (PATCHELF STREQUAL "PATCHELF-NOTFOUND")
message(WARNING "Patchelf not found. Can't build glibc + musl binaries")
else()
add_custom_command(TARGET ${target} POST_BUILD
COMMAND patchelf --remove-needed libc.so $<TARGET_FILE:${target}> ${SYMBOL_FILE})
endif()
endfunction()
3 changes: 2 additions & 1 deletion appsec/cmake/run-tests-wrapper.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export DD_TRACE_ENABLED=true
export DD_TRACE_GENERATE_ROOT_SPAN=true
export DD_TRACE_CLI_ENABLED=true
export DD_TRACE_AGENT_PORT=18126
export PHPRC=

CMAKE_BINARY_DIR="$1"
MOCK_HELPER_BINARY="$2"
Expand Down Expand Up @@ -44,7 +45,7 @@ function link_extensions {
if [[ -L $ddtrace && $(readlink "$ddtrace") != $TRACER_EXT_FILE ]]; then
rm -v "$ddtrace"
fi
if [[ ! -f $ddtrace ]]; then
if [[ ! -L $ddtrace ]]; then
ln -s -v "$TRACER_EXT_FILE" $ddtrace
fi
fi
Expand Down
5 changes: 3 additions & 2 deletions appsec/cmake/run_tests.cmake
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
set(DD_APPSEC_TRACER_EXT_FILE ${CMAKE_SOURCE_DIR}/../tmp/build_extension/modules/ddtrace.so)
get_filename_component(DD_APPSEC_TRACER_EXT_FILE "${CMAKE_SOURCE_DIR}/../tmp/build_extension/modules/ddtrace.so" REALPATH)

add_custom_target(ddtrace
COMMAND make
COMMAND ${CMAKE_COMMAND} -E env "PATH=${PhpConfig_ROOT_DIR}/bin:$ENV{PATH}" PHPRC=
make "${DD_APPSEC_TRACER_EXT_FILE}"
BYPRODUCTS ${DD_APPSEC_TRACER_EXT_FILE}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/../)

Expand Down
6 changes: 3 additions & 3 deletions appsec/run-tests-internal.php
Original file line number Diff line number Diff line change
Expand Up @@ -2842,10 +2842,10 @@ function run_test($php, $file, array $env)
gdb --args {$cmd}
;;
"valgrind")
USE_ZEND_ALLOC=0 valgrind $2 ${cmd}
USE_ZEND_ALLOC=0 valgrind $2 {$cmd}
;;
"rr")
rr record $2 ${cmd}
rr record $2 {$cmd}
;;
*)
{$cmd}
Expand Down Expand Up @@ -3773,7 +3773,7 @@ public function __construct(array $environment, $tool = 'memcheck')
public function wrapCommand($cmd, $memcheck_filename, $check_all)
{
$supp_file = INIT_DIR . "/valgrind.supp";
$vcmd = "valgrind -q --tool={$this->tool} --trace-children=no --child-silent-after-fork=yes --leak-check=full " .
$vcmd = "valgrind --gen-suppressions=all -q --tool={$this->tool} --trace-children=no --child-silent-after-fork=yes --leak-check=full " .
"--num-callers=16 --run-libc-freeres=no";
if (file_exists($supp_file)) {
$vcmd .= " --suppressions='$supp_file'";
Expand Down
29 changes: 18 additions & 11 deletions appsec/src/extension/commands/client_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ static const unsigned int MAX_TCP_PORT_ALLOWED = UINT16_MAX;

static dd_result _pack_command(mpack_writer_t *nonnull w, void *nullable ctx);
static dd_result _process_response(mpack_node_t root, void *nullable ctx);
static void _process_meta_and_metrics(mpack_node_t root);
static void _process_meta_and_metrics(
mpack_node_t root, struct req_info *nonnull ctx);
static void _pack_agent_details(mpack_writer_t *nonnull w);

static const dd_command_spec _spec = {
Expand Down Expand Up @@ -78,24 +79,22 @@ static void _pack_agent_details(mpack_writer_t *nonnull w)
}
}

dd_result dd_client_init(dd_conn *nonnull conn)
dd_result dd_client_init(dd_conn *nonnull conn, struct req_info *nonnull ctx)
{
return dd_command_exec_cred(conn, &_spec, NULL);
return dd_command_exec_cred(conn, &_spec, ctx);
}

static dd_result _pack_command(
mpack_writer_t *nonnull w, ATTR_UNUSED void *nullable ctx)
{
// unsigned pid, string client_version, runtime_version, rules_file
mpack_write(w, (uint32_t)getpid());
dd_mpack_write_lstr(w, PHP_DDAPPSEC_VERSION);
dd_mpack_write_lstr(w, PHP_VERSION);

enabled_configuration configuration = DDAPPSEC_G(enabled_by_configuration);
if (configuration == NOT_CONFIGURED) {
if (DDAPPSEC_G(enabled) == APPSEC_ENABLED_VIA_REMCFG) {
mpack_write_nil(w);
} else {
mpack_write_bool(w, configuration == ENABLED ? true : false);
mpack_write_bool(w, DDAPPSEC_G(active));
}

// Service details
Expand Down Expand Up @@ -206,7 +205,7 @@ static dd_result _process_response(
mpack_node_t root, ATTR_UNUSED void *nullable ctx)
{
// Add any tags and metrics provided by the helper
_process_meta_and_metrics(root);
_process_meta_and_metrics(root, ctx);

// check verdict
mpack_node_t verdict = mpack_node_array_at(root, 0);
Expand Down Expand Up @@ -246,15 +245,23 @@ static dd_result _process_response(
return dd_error;
}

static void _process_meta_and_metrics(mpack_node_t root)
static void _process_meta_and_metrics(
mpack_node_t root, struct req_info *nonnull ctx)
{
zend_object *span = ctx->root_span;
if (!span) {
mlog(
dd_log_debug, "Meta/metrics in client_init ignored (no root span)");
return;
}

mpack_node_t meta = mpack_node_array_at(root, 3);
if (mpack_node_map_count(meta) > 0) {
dd_command_process_meta(meta);
dd_command_process_meta(meta, span);
}

mpack_node_t metrics = mpack_node_array_at(root, 4);
dd_command_process_metrics(metrics);
dd_command_process_metrics(metrics, span);
}

static dd_result _check_helper_version(mpack_node_t root)
Expand Down
3 changes: 2 additions & 1 deletion appsec/src/extension/commands/client_init.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@
#pragma once

#include "../network.h"
#include "../commands_ctx.h"

dd_result dd_client_init(dd_conn *nonnull conn);
dd_result dd_client_init(dd_conn *nonnull conn, struct req_info *nonnull ctx);
21 changes: 14 additions & 7 deletions appsec/src/extension/commands/request_exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@
#include <zend_hash.h>
#include <zend_types.h>

static dd_result _pack_command(
mpack_writer_t *nonnull w, ATTR_UNUSED void *nullable ctx);
struct ctx {
struct req_info req_info; // dd_command_proc_resp_verd_span_data expect it
zval *nonnull data;
};

static dd_result _pack_command(mpack_writer_t *nonnull w, void *nonnull ctx);

static const dd_command_spec _spec = {
.name = "request_exec",
Expand All @@ -32,14 +36,17 @@ dd_result dd_request_exec(dd_conn *nonnull conn, zval *nonnull data)
return dd_error;
}

return dd_command_exec(conn, &_spec, (void *)data);
struct ctx ctx = {.data = data};

return dd_command_exec(conn, &_spec, &ctx);
}

static dd_result _pack_command(
mpack_writer_t *nonnull w, ATTR_UNUSED void *nullable ctx)
static dd_result _pack_command(mpack_writer_t *nonnull w, void *nonnull _ctx)
{
zval *data = (zval *)ctx;
dd_mpack_write_zval(w, data);
assert(_ctx != NULL);
struct ctx *ctx = _ctx;

dd_mpack_write_zval(w, ctx->data);

return dd_success;
}
Loading

0 comments on commit c510ee1

Please sign in to comment.