Skip to content

Commit c73bb45

Browse files
cataphractbwoebi
authored andcommitted
ddtrace cmake build. Adjust reported headers. Fix out-of-data test inddtrace
1 parent 3ee91bd commit c73bb45

12 files changed

+195
-113
lines changed

appsec/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ option(DD_APPSEC_BUILD_HELPER "Whether to builder the helper" ON)
2828
option(DD_APPSEC_BUILD_EXTENSION "Whether to builder the extension" ON)
2929
option(DD_APPSEC_ENABLE_COVERAGE "Whether to enable coverage calculation" OFF)
3030
option(DD_APPSEC_TESTING "Whether to enable testing" ON)
31+
option(DD_APPSEC_DDTRACE_ALT "Whether to build appsec with cmake" OFF)
3132

3233
add_subdirectory(third_party EXCLUDE_FROM_ALL)
3334

appsec/cmake/ddtrace.cmake

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
include(ExternalProject)
2+
3+
set(CARGO_BUILD_CMD "cargo build")
4+
set(CARGO_BUILD_ENV "") # Initialize to empty
5+
6+
7+
if(CMAKE_BUILD_TYPE STREQUAL "Release")
8+
set(CARGO_BUILD_CMD "${CARGO_BUILD_CMD} --release")
9+
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
10+
set(CARGO_BUILD_CMD "${CARGO_BUILD_CMD} --release")
11+
set(CARGO_BUILD_ENV "RUSTFLAGS='-C debuginfo=2'")
12+
endif()
13+
14+
set(LIBDATADOG_DIR "${CMAKE_SOURCE_DIR}/../libdatadog")
15+
set(LIBDATADOG_STAMP_FILE "${CMAKE_BINARY_DIR}/libdatadog.stamp")
16+
add_custom_target(libdatadog_stamp
17+
COMMAND ${CMAKE_COMMAND} -E touch ${LIBDATADOG_STAMP_FILE} #XXX: use a script to find modifications
18+
BYPRODUCT ${LIBDATADOG_STAMP_FILE}
19+
)
20+
21+
set(EXPORTS_FILE "${CMAKE_BINARY_DIR}/exports.version")
22+
add_custom_target(ddtrace_exports
23+
COMMAND bash -c "{ echo -e '{\\nglobal:'; sed 's/$/;/' '${CMAKE_SOURCE_DIR}'/../ddtrace.sym; echo -e 'local:\\n*;\\n};'; } > '${EXPORTS_FILE}'"
24+
BYPRODUCT ${EXPORTS_FILE}
25+
DEPENDS ${CMAKE_SOURCE_DIR}/../ddtrace.sym
26+
VERBATIM
27+
)
28+
29+
ExternalProject_Add(components_rs_proj
30+
PREFIX ${CMAKE_BINARY_DIR}/components_rs
31+
SOURCE_DIR ${CMAKE_SOURCE_DIR}/../components-rs
32+
CONFIGURE_COMMAND ""
33+
BUILD_COMMAND RUSTC_BOOTSTRAP=1 ${CARGO_BUILD_ENV} cargo build --target-dir=${CMAKE_BINARY_DIR}/components_rs
34+
INSTALL_COMMAND ""
35+
DEPENDS libdatadog_stamp
36+
BUILD_IN_SOURCE TRUE
37+
)
38+
39+
add_library(components_rs STATIC IMPORTED)
40+
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
41+
set(CARGO_BUILD_LOCATION ${CMAKE_BINARY_DIR}/components_rs/debug)
42+
else()
43+
set(CARGO_BUILD_LOCATION ${CMAKE_BINARY_DIR}/components_rs/release)
44+
endif()
45+
set_property(TARGET components_rs PROPERTY IMPORTED_LOCATION ${CARGO_BUILD_LOCATION}/libddtrace_php.a)
46+
add_dependencies(components_rs components_rs_proj)
47+
48+
49+
execute_process(
50+
COMMAND ${PhpConfig_EXECUTABLE} --vernum
51+
RESULT_VARIABLE PhpConfig_VERNUM_RESULT
52+
OUTPUT_VARIABLE PhpConfig_VERNUM
53+
OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ERROR_IS_FATAL ANY)
54+
55+
file(GLOB_RECURSE FILES_DDTRACE
56+
CONFIGURE_DEPENDS
57+
"${CMAKE_SOURCE_DIR}/../ext/*.c"
58+
"${CMAKE_SOURCE_DIR}/../ext/**/*.c"
59+
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/*.c"
60+
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/**/*.c"
61+
)
62+
63+
list(APPEND FILES_DDTRACE
64+
"${CMAKE_SOURCE_DIR}/../src/dogstatsd/client.c"
65+
"${CMAKE_SOURCE_DIR}/../components/container_id/container_id.c"
66+
"${CMAKE_SOURCE_DIR}/../components/log/log.c"
67+
"${CMAKE_SOURCE_DIR}/../components/sapi/sapi.c"
68+
"${CMAKE_SOURCE_DIR}/../components/string_view/string_view.c"
69+
)
70+
if (PhpConfig_VERNUM GREATER_EQUAL 80000)
71+
list(REMOVE_ITEM FILES_DDTRACE "${CMAKE_SOURCE_DIR}/../ext/handlers_curl_php7.c"
72+
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/interceptor/php7/interceptor.c"
73+
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/interceptor/php7/resolver.c"
74+
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/sandbox/php7/sandbox.c")
75+
else() # PHP 7
76+
list(REMOVE_ITEM FILES_DDTRACE "${CMAKE_SOURCE_DIR}/../ext/handlers_curl.c"
77+
"${CMAKE_SOURCE_DIR}/../ext/hook/uhook_attributes.c"
78+
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/interceptor/php8/interceptor.c"
79+
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/interceptor/php8/resolver.c"
80+
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/interceptor/php8/resolver_pre-8_2.c"
81+
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/jit_utils/jit_blacklist.c"
82+
"${CMAKE_SOURCE_DIR}/../zend_abstract_interface/sandbox/php8/sandbox.c")
83+
endif()
84+
if (PhpConfig_VERNUM LESS 80200)
85+
list(REMOVE_ITEM FILES_DDTRACE "${CMAKE_SOURCE_DIR}/../ext/weakrefs.c")
86+
list(REMOVE_ITEM FILES_DDTRACE "${CMAKE_SOURCE_DIR}/../zend_abstract_interface/interceptor/php8/resolver.c")
87+
else() # PHP 8.2+
88+
list(REMOVE_ITEM FILES_DDTRACE "${CMAKE_SOURCE_DIR}/../zend_abstract_interface/interceptor/php8/resolver_pre-8_2.c")
89+
endif()
90+
if (PhpConfig_VERNUM LESS 80100)
91+
list(REMOVE_ITEM FILES_DDTRACE "${CMAKE_SOURCE_DIR}/../ext/handlers_fiber.c")
92+
endif()
93+
94+
find_package(CURL REQUIRED)
95+
96+
add_library(ddtrace SHARED ${FILES_DDTRACE})
97+
set_target_properties(ddtrace PROPERTIES
98+
C_VISIBILITY_PRESET hidden
99+
OUTPUT_NAME ddtrace
100+
DEBUG_POSTFIX ""
101+
PREFIX "")
102+
target_compile_options(ddtrace PRIVATE -fms-extensions)
103+
target_link_options(ddtrace PRIVATE "-Wl,--version-script=${EXPORTS_FILE}")
104+
target_link_libraries(ddtrace PRIVATE PhpConfig components_rs ${CURL_LIBRARIES})
105+
if(CURL_DEFINITIONS)
106+
target_compile_definitions(ddtrace PRIVATE ${CURL_DEFINITIONS})
107+
endif()
108+
target_compile_definitions(ddtrace PRIVATE ZEND_ENABLE_STATIC_TSRMLS_CACHE=1 COMPILE_DL_DDTRACE=1)
109+
target_include_directories(ddtrace PRIVATE
110+
${CURL_INCLUDE_DIRS}
111+
${CMAKE_SOURCE_DIR}/..
112+
${CMAKE_SOURCE_DIR}/../src/dogstatsd
113+
${CMAKE_SOURCE_DIR}/../zend_abstract_interface
114+
${CMAKE_SOURCE_DIR}/../ext
115+
${CMAKE_SOURCE_DIR}/../ext/vendor
116+
${CMAKE_SOURCE_DIR}/../ext/vendor/mt19937
117+
)
118+
add_dependencies(ddtrace ddtrace_exports)
119+
120+
patch_away_libc(ddtrace)

appsec/cmake/run_tests.cmake

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
get_filename_component(DD_APPSEC_TRACER_EXT_FILE "${CMAKE_SOURCE_DIR}/../tmp/build_extension/modules/ddtrace.so" REALPATH)
2-
3-
add_custom_target(ddtrace
4-
COMMAND ${CMAKE_COMMAND} -E env "PATH=${PhpConfig_ROOT_DIR}/bin:$ENV{PATH}" PHPRC=
5-
make "${DD_APPSEC_TRACER_EXT_FILE}"
6-
BYPRODUCTS ${DD_APPSEC_TRACER_EXT_FILE}
7-
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/../)
1+
if(DD_APPSEC_DDTRACE_ALT)
2+
include(cmake/ddtrace.cmake)
3+
set(DD_APPSEC_TRACER_EXT_FILE $<TARGET_FILE:ddtrace>)
4+
else()
5+
get_filename_component(DD_APPSEC_TRACER_EXT_FILE "${CMAKE_SOURCE_DIR}/../tmp/build_extension/modules/ddtrace.so" REALPATH)
6+
add_custom_target(ddtrace
7+
COMMAND ${CMAKE_COMMAND} -E env "PATH=${PhpConfig_ROOT_DIR}/bin:$ENV{PATH}" PHPRC=
8+
make "${DD_APPSEC_TRACER_EXT_FILE}"
9+
BYPRODUCTS ${DD_APPSEC_TRACER_EXT_FILE}
10+
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/../)
11+
endif()
812

913
add_custom_target(xtest-prepare
1014
COMMAND mkdir -p /tmp/appsec-ext-test)

appsec/src/extension/ddtrace.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ static void (*nullable _ddtrace_set_priority_sampling_on_span_zobj)(
4242
static bool (*nullable _ddtrace_user_req_add_listeners)(
4343
ddtrace_user_req_listeners *listeners);
4444

45+
static zend_string *(*_ddtrace_ip_extraction_find)(zval *server);
46+
4547
static void dd_trace_load_symbols(void)
4648
{
4749
bool testing = get_global_DD_APPSEC_TESTING();
@@ -89,6 +91,12 @@ static void dd_trace_load_symbols(void)
8991
dlerror()); // NOLINT(concurrency-mt-unsafe)
9092
}
9193

94+
_ddtrace_ip_extraction_find = dlsym(handle, "ddtrace_ip_extraction_find");
95+
if (_ddtrace_ip_extraction_find == NULL && !testing) {
96+
mlog(dd_log_error, "Failed to load ddtrace_ip_extraction_find: %s",
97+
dlerror()); // NOLINT(concurrency-mt-unsafe)
98+
}
99+
92100
dlclose(handle);
93101
}
94102

@@ -334,6 +342,14 @@ zend_object *nullable dd_trace_get_active_root_span()
334342
return _ddtrace_get_root_span();
335343
}
336344

345+
zend_string *nullable dd_ip_extraction_find(zval *nonnull server)
346+
{
347+
if (!_ddtrace_ip_extraction_find) {
348+
return NULL;
349+
}
350+
return _ddtrace_ip_extraction_find(server);
351+
}
352+
337353
static PHP_FUNCTION(datadog_appsec_testing_ddtrace_rshutdown)
338354
{
339355
if (zend_parse_parameters_none() == FAILURE) {

appsec/src/extension/ddtrace.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,5 @@ struct _ddtrace_user_req_listeners {
7676
};
7777
bool dd_trace_user_req_add_listeners(
7878
ddtrace_user_req_listeners *nonnull listeners);
79+
80+
zend_string *nullable dd_ip_extraction_find(zval *nonnull server);

appsec/src/extension/ip_extraction.c

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,13 @@
66

77
#include "ip_extraction.h"
88
#include "configuration.h"
9+
#include "ddtrace.h"
910
#include "logging.h"
1011
#include "php_objects.h"
1112

12-
static zend_string *(*_ddtrace_ip_extraction_find)(zval *server);
1313
static void _register_testing_objects(void);
1414

15-
void dd_ip_extraction_startup()
16-
{
17-
_register_testing_objects();
18-
19-
bool testing = get_global_DD_APPSEC_TESTING();
20-
void *handle = dlopen(NULL, RTLD_NOW | RTLD_GLOBAL);
21-
if (handle == NULL) {
22-
if (!testing) {
23-
// NOLINTNEXTLINE(concurrency-mt-unsafe)
24-
mlog(dd_log_error, "Failed load process symbols: %s", dlerror());
25-
}
26-
return;
27-
}
28-
29-
_ddtrace_ip_extraction_find = dlsym(handle, "ddtrace_ip_extraction_find");
30-
if (_ddtrace_ip_extraction_find == NULL && !testing) {
31-
mlog(dd_log_error, "Failed to load ddtrace_ip_extraction_find: %s",
32-
dlerror()); // NOLINT(concurrency-mt-unsafe)
33-
}
34-
35-
dlclose(handle);
36-
}
37-
38-
zend_string *nullable dd_ip_extraction_find(zval *nonnull server)
39-
{
40-
if (!_ddtrace_ip_extraction_find) {
41-
return NULL;
42-
}
43-
return _ddtrace_ip_extraction_find(server);
44-
}
15+
void dd_ip_extraction_startup() { _register_testing_objects(); }
4516

4617
static PHP_FUNCTION(datadog_appsec_testing_extract_ip_addr)
4718
{

appsec/src/extension/ip_extraction.h

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,4 @@
66

77
#pragma once
88

9-
#ifndef _GNU_SOURCE
10-
# define _GNU_SOURCE
11-
#endif
12-
13-
#include "attributes.h"
14-
#include "zai_string/string.h"
15-
#include <php.h>
16-
179
void dd_ip_extraction_startup(void);
18-
19-
// Since the headers looked at can in principle be forged, it's very much
20-
// recommended that a datadog.appsec.ipheader is set to a header that the server
21-
// guarantees cannot be forged
22-
zend_string *nullable dd_ip_extraction_find(zval *nonnull server);
23-
bool dd_parse_client_ip_header_config(
24-
zai_str value, zval *nonnull decoded_value, bool persistent);

appsec/src/extension/tags.c

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
#define DD_TAG_HTTP_RH_CONTENT_LANGUAGE "http.response.headers.content-language"
4343
#define DD_TAG_HTTP_CLIENT_IP "http.client_ip"
4444
#define DD_TAG_USER_ID "usr.id"
45-
#define DD_MULTIPLE_BASIC_HEADERS "_dd.multiple-ip-headers"
4645
#define DD_METRIC_ENABLED "_dd.appsec.enabled"
4746
#define DD_APPSEC_EVENTS_PREFIX "appsec.events."
4847
#define DD_SIGNUP_EVENT DD_APPSEC_EVENTS_PREFIX "users.signup"
@@ -87,7 +86,6 @@ static zend_string *_dd_tag_rh_content_type; // response
8786
static zend_string *_dd_tag_rh_content_encoding; // response
8887
static zend_string *_dd_tag_rh_content_language; // response
8988
static zend_string *_dd_tag_user_id;
90-
static zend_string *_dd_multiple_ip_headers;
9189
static zend_string *_dd_metric_enabled;
9290
static zend_string *_dd_signup_event;
9391
static zend_string *_dd_login_success_event;
@@ -171,8 +169,6 @@ void dd_tags_startup()
171169
zend_string_init_interned(LSTRARG(DD_TAG_HTTP_RH_CONTENT_LANGUAGE), 1);
172170
_dd_tag_user_id = zend_string_init_interned(LSTRARG(DD_TAG_USER_ID), 1);
173171

174-
_dd_multiple_ip_headers =
175-
zend_string_init_interned(LSTRARG(DD_MULTIPLE_BASIC_HEADERS), 1);
176172
_dd_metric_enabled =
177173
zend_string_init_interned(LSTRARG(DD_METRIC_ENABLED), 1);
178174

@@ -246,20 +242,20 @@ static void _init_relevant_headers()
246242
&_relevant_basic_headers, str "", sizeof(str) - 1, &nullzv); \
247243
ADD_RELEVANT_HEADER(str)
248244

249-
ADD_RELEVANT_BASIC_HEADER("x-forwarded-for");
250-
ADD_RELEVANT_BASIC_HEADER("x-client-ip");
251-
ADD_RELEVANT_BASIC_HEADER("x-real-ip");
252-
ADD_RELEVANT_BASIC_HEADER("x-forwarded");
253-
ADD_RELEVANT_BASIC_HEADER("x-cluster-client-ip");
254-
ADD_RELEVANT_BASIC_HEADER("forwarded-for");
255-
ADD_RELEVANT_BASIC_HEADER("forwarded");
256-
ADD_RELEVANT_BASIC_HEADER("via");
257-
ADD_RELEVANT_BASIC_HEADER("true-client-ip");
258-
ADD_RELEVANT_BASIC_HEADER("fastly-client-ip");
259-
ADD_RELEVANT_BASIC_HEADER("cf-connecting-ip");
260-
ADD_RELEVANT_BASIC_HEADER("cf-connecting-ipv6");
261245
ADD_RELEVANT_BASIC_HEADER("x-amzn-trace-id");
262246

247+
ADD_RELEVANT_HEADER("x-forwarded-for");
248+
ADD_RELEVANT_HEADER("x-client-ip");
249+
ADD_RELEVANT_HEADER("x-real-ip");
250+
ADD_RELEVANT_HEADER("x-forwarded");
251+
ADD_RELEVANT_HEADER("x-cluster-client-ip");
252+
ADD_RELEVANT_HEADER("forwarded-for");
253+
ADD_RELEVANT_HEADER("forwarded");
254+
ADD_RELEVANT_HEADER("via");
255+
ADD_RELEVANT_HEADER("true-client-ip");
256+
ADD_RELEVANT_HEADER("fastly-client-ip");
257+
ADD_RELEVANT_HEADER("cf-connecting-ip");
258+
ADD_RELEVANT_HEADER("cf-connecting-ipv6");
263259
ADD_RELEVANT_HEADER("content-length");
264260
ADD_RELEVANT_HEADER("content-type");
265261
ADD_RELEVANT_HEADER("content-encoding");
@@ -649,8 +645,7 @@ static void _dd_http_network_client_ip(
649645

650646
static void _dd_http_client_ip(zend_array *meta_ht)
651647
{
652-
if (zend_hash_exists(meta_ht, _dd_tag_http_client_ip_zstr) ||
653-
zend_hash_exists(meta_ht, _dd_multiple_ip_headers)) {
648+
if (zend_hash_exists(meta_ht, _dd_tag_http_client_ip_zstr)) {
654649
return;
655650
}
656651
zend_string *client_ip = dd_req_lifecycle_get_client_ip();

appsec/tests/extension/ancillary_tags.phpt

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,5 @@ Array
101101
Array
102102
(
103103
[http.client_ip] => 7.7.7.6
104-
[http.request.headers.forwarded] => for="foo"
105-
[http.request.headers.forwarded-for] => 7.7.7.10,10.0.0.1
106-
[http.request.headers.true-client-ip] => 7.7.7.11
107-
[http.request.headers.via] => HTTP/1.1 GWA
108104
[http.request.headers.x-amzn-trace-id] => amazontraceid
109-
[http.request.headers.x-client-ip] => 7.7.7.7
110-
[http.request.headers.x-cluster-client-ip] => 7.7.7.9
111-
[http.request.headers.x-forwarded] => for="foo"
112-
[http.request.headers.x-forwarded-for] => 7.7.7.6,10.0.0.1
113-
[http.request.headers.x-real-ip] => 7.7.7.8
114105
)

appsec/tests/extension/ddtrace_disabled.phpt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,4 @@ DD_APPSEC_ENABLED=1
1111
var_dump(\datadog\appsec\is_enabled());
1212
?>
1313
--EXPECTF--
14-
Warning: PHP Startup: [ddappsec] Failed to load ddtrace_ip_extraction_find: %s undefined symbol: ddtrace_ip_extraction_find in Unknown on line %d
15-
bool(false)
14+
bool(false)

0 commit comments

Comments
 (0)