Skip to content

Commit 6300ec5

Browse files
committed
Rasp rule can be specified when addresses are pushed
1 parent c11372f commit 6300ec5

15 files changed

+138
-23
lines changed

appsec/src/extension/commands/request_exec.c

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
#include "../commands_helpers.h"
99
#include "../logging.h"
1010
#include "../msgpack_helpers.h"
11+
#include "../ddappsec.h"
1112
#include <php.h>
1213
#include <zend_hash.h>
1314
#include <zend_types.h>
1415

1516
struct ctx {
1617
struct req_info req_info; // dd_command_proc_resp_verd_span_data expect it
17-
bool rasp;
18+
dd_rasp_rule rasp_rule;
1819
zval *nonnull data;
1920
};
2021

@@ -29,15 +30,15 @@ static const dd_command_spec _spec = {
2930
.config_features_cb = dd_command_process_config_features_unexpected,
3031
};
3132

32-
dd_result dd_request_exec(dd_conn *nonnull conn, zval *nonnull data, bool rasp)
33+
dd_result dd_request_exec(dd_conn *nonnull conn, zval *nonnull data, unsigned rasp_rule)
3334
{
3435
if (Z_TYPE_P(data) != IS_ARRAY) {
3536
mlog(dd_log_debug, "Invalid data provided to command request_exec, "
3637
"expected hash table.");
3738
return dd_error;
3839
}
3940

40-
struct ctx ctx = {.rasp = rasp, .data = data};
41+
struct ctx ctx = {.rasp_rule = rasp_rule, .data = data};
4142

4243
return dd_command_exec_req_info(conn, &_spec, &ctx.req_info);
4344
}
@@ -47,7 +48,7 @@ static dd_result _pack_command(mpack_writer_t *nonnull w, void *nonnull _ctx)
4748
assert(_ctx != NULL);
4849
struct ctx *ctx = _ctx;
4950

50-
mpack_write(w, ctx->rasp);
51+
mpack_write(w, ctx->rasp_rule);
5152
dd_mpack_write_zval(w, ctx->data);
5253

5354
return dd_success;

appsec/src/extension/commands/request_exec.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
#include <SAPI.h>
1010
#include <php.h>
1111

12-
dd_result dd_request_exec(dd_conn *nonnull conn, zval *nonnull data, bool rasp);
12+
dd_result dd_request_exec(dd_conn *nonnull conn, zval *nonnull data, unsigned rasp_rule);

appsec/src/extension/ddappsec.c

+20-5
Original file line numberDiff line numberDiff line change
@@ -488,8 +488,8 @@ static PHP_FUNCTION(datadog_appsec_push_addresses)
488488
}
489489

490490
zval *addresses = NULL;
491-
bool rasp = false;
492-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|b", &addresses, &rasp) ==
491+
long rasp_rule = dd_rasp_rule_none;
492+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|l", &addresses, &rasp_rule) ==
493493
FAILURE) {
494494
RETURN_FALSE;
495495
}
@@ -498,7 +498,12 @@ static PHP_FUNCTION(datadog_appsec_push_addresses)
498498
RETURN_FALSE;
499499
}
500500

501-
if (rasp && !get_global_DD_APPSEC_RASP_ENABLED()) {
501+
if (rasp_rule != dd_rasp_rule_lfi && rasp_rule != dd_rasp_rule_ssrf) {
502+
rasp_rule = dd_rasp_rule_none;
503+
}
504+
505+
if (rasp_rule != dd_rasp_rule_none &&
506+
!get_global_DD_APPSEC_RASP_ENABLED()) {
502507
return;
503508
}
504509

@@ -508,9 +513,9 @@ static PHP_FUNCTION(datadog_appsec_push_addresses)
508513
return;
509514
}
510515

511-
dd_result res = dd_request_exec(conn, addresses, rasp);
516+
dd_result res = dd_request_exec(conn, addresses, rasp_rule);
512517

513-
if (rasp) {
518+
if (rasp_rule > dd_rasp_rule_none) {
514519
clock_gettime(CLOCK_MONOTONIC_RAW, &end);
515520
elapsed =
516521
((int64_t)end.tv_sec - (int64_t)start.tv_sec) *
@@ -570,6 +575,16 @@ static void _register_testing_objects()
570575
{
571576
dd_phpobj_reg_funcs(functions);
572577

578+
# define _REG_RASP_CONST(php_name, value) \
579+
do { \
580+
char v[] = "datadog\\appsec\\rasp\\" php_name; \
581+
dd_phpobj_reg_long_const( \
582+
v, sizeof(v) - 1, value, CONST_CS | CONST_PERSISTENT); \
583+
} while (0)
584+
585+
_REG_RASP_CONST("LFI", dd_rasp_rule_lfi);
586+
_REG_RASP_CONST("SSRF", dd_rasp_rule_ssrf);
587+
573588
if (!get_global_DD_APPSEC_TESTING()) {
574589
return;
575590
}

appsec/src/extension/ddappsec.h

+6
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,10 @@ int dd_appsec_rshutdown(bool ignore_verdict);
6767

6868
#define PHP_DDAPPSEC_EXTNAME "ddappsec"
6969

70+
typedef enum {
71+
dd_rasp_rule_none = 0,
72+
dd_rasp_rule_lfi,
73+
dd_rasp_rule_ssrf,
74+
} dd_rasp_rule;
75+
7076
#endif // DDAPPSEC_H

appsec/tests/extension/actions_handling_01.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ array(2) {
3232
[1]=>
3333
array(2) {
3434
[0]=>
35-
bool(false)
35+
int(0)
3636
[1]=>
3737
array(1) {
3838
["server.request.path_params"]=>

appsec/tests/extension/push_params_ok_01.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ array(2) {
3232
[1]=>
3333
array(2) {
3434
[0]=>
35-
bool(false)
35+
int(0)
3636
[1]=>
3737
array(1) {
3838
["server.request.path_params"]=>

appsec/tests/extension/push_params_ok_02.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ array(2) {
3232
[1]=>
3333
array(2) {
3434
[0]=>
35-
bool(false)
35+
int(0)
3636
[1]=>
3737
array(1) {
3838
["server.request.path_params"]=>

appsec/tests/extension/push_params_ok_03.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ array(2) {
3232
[1]=>
3333
array(2) {
3434
[0]=>
35-
bool(false)
35+
int(0)
3636
[1]=>
3737
array(1) {
3838
["server.request.path_params"]=>

appsec/tests/extension/push_params_ok_04.phpt

+2-3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ $helper = Helper::createInitedRun([
1818
]);
1919

2020
var_dump(rinit());
21-
$is_rasp = true;
22-
push_addresses(["server.request.path_params" => 1234], $is_rasp);
21+
push_addresses(["server.request.path_params" => 1234], \datadog\appsec\rasp\LFI);
2322
var_dump(rshutdown());
2423
print_r(root_span_get_metrics());
2524

@@ -41,7 +40,7 @@ array(2) {
4140
[1]=>
4241
array(2) {
4342
[0]=>
44-
bool(true)
43+
int(1)
4544
[1]=>
4645
array(1) {
4746
["server.request.path_params"]=>

appsec/tests/extension/push_params_ok_05.phpt

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ $helper = Helper::createInitedRun([
1818
]);
1919

2020
var_dump(rinit());
21-
$is_rasp = true;
22-
push_addresses(["server.request.path_params" => 1234], $is_rasp);
21+
push_addresses(["server.request.path_params" => 1234], \datadog\appsec\rasp\LFI);
2322
var_dump(rshutdown());
2423
print_r(root_span_get_metrics());
2524

appsec/tests/extension/push_params_ok_06.phpt

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ $helper = Helper::createInitedRun([
1616
]);
1717

1818
var_dump(rinit());
19-
$is_rasp = true;
20-
push_addresses(["server.request.path_params" => 1234], $is_rasp);
19+
push_addresses(["server.request.path_params" => 1234], \datadog\appsec\rasp\LFI);
2120
var_dump(rshutdown());
2221
print_r(root_span_get_metrics());
2322

appsec/tests/extension/push_params_ok_07.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ array(2) {
3232
[1]=>
3333
array(2) {
3434
[0]=>
35-
bool(false)
35+
int(0)
3636
[1]=>
3737
array(2) {
3838
["server.request.path_params"]=>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
--TEST--
2+
LFI Rule can be sent
3+
--INI--
4+
extension=ddtrace.so
5+
datadog.appsec.enabled=1
6+
datadog.appsec.rasp_enabled=1
7+
--FILE--
8+
<?php
9+
use function datadog\appsec\testing\{rinit,rshutdown};
10+
use function datadog\appsec\push_addresses;
11+
12+
include __DIR__ . '/inc/mock_helper.php';
13+
14+
$helper = Helper::createInitedRun([
15+
response_list(response_request_init([[['ok', []]]])),
16+
response_list(response_request_exec([[['ok', []]], [], [], [], false])),
17+
response_list(response_request_shutdown([[['ok', []]], new ArrayObject(), new ArrayObject()]))
18+
]);
19+
20+
var_dump(rinit());
21+
push_addresses(["server.request.path_params" => ["some" => "params", "more" => "parameters"]], \datadog\appsec\rasp\LFI);
22+
var_dump(rshutdown());
23+
24+
var_dump($helper->get_command("request_exec"));
25+
26+
?>
27+
--EXPECTF--
28+
bool(true)
29+
bool(true)
30+
array(2) {
31+
[0]=>
32+
string(12) "request_exec"
33+
[1]=>
34+
array(2) {
35+
[0]=>
36+
int(1)
37+
[1]=>
38+
array(1) {
39+
["server.request.path_params"]=>
40+
array(2) {
41+
["some"]=>
42+
string(6) "params"
43+
["more"]=>
44+
string(10) "parameters"
45+
}
46+
}
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
--TEST--
2+
SSRF Rule can be sent
3+
--INI--
4+
extension=ddtrace.so
5+
datadog.appsec.enabled=1
6+
datadog.appsec.rasp_enabled=1
7+
--FILE--
8+
<?php
9+
use function datadog\appsec\testing\{rinit,rshutdown};
10+
use function datadog\appsec\push_addresses;
11+
12+
include __DIR__ . '/inc/mock_helper.php';
13+
14+
$helper = Helper::createInitedRun([
15+
response_list(response_request_init([[['ok', []]]])),
16+
response_list(response_request_exec([[['ok', []]], [], [], [], false])),
17+
response_list(response_request_shutdown([[['ok', []]], new ArrayObject(), new ArrayObject()]))
18+
]);
19+
20+
var_dump(rinit());
21+
push_addresses(["server.request.path_params" => ["some" => "params", "more" => "parameters"]], \datadog\appsec\rasp\SSRF);
22+
var_dump(rshutdown());
23+
24+
var_dump($helper->get_command("request_exec"));
25+
26+
?>
27+
--EXPECTF--
28+
bool(true)
29+
bool(true)
30+
array(2) {
31+
[0]=>
32+
string(12) "request_exec"
33+
[1]=>
34+
array(2) {
35+
[0]=>
36+
int(2)
37+
[1]=>
38+
array(1) {
39+
["server.request.path_params"]=>
40+
array(2) {
41+
["some"]=>
42+
string(6) "params"
43+
["more"]=>
44+
string(10) "parameters"
45+
}
46+
}
47+
}
48+
}

appsec/tests/extension/request_exec.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ array(2) {
4747
[1]=>
4848
array(2) {
4949
[0]=>
50-
bool(false)
50+
int(0)
5151
[1]=>
5252
array(3) {
5353
["key 01"]=>

0 commit comments

Comments
 (0)