Skip to content

Commit 94529f6

Browse files
add api10 test for redirection with status code analysis (#5831)
1 parent 359c5b6 commit 94529f6

File tree

12 files changed

+93
-9
lines changed

12 files changed

+93
-9
lines changed

manifests/dotnet.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ tests/:
206206
Test_API10_downstream_request_tag: missing_feature
207207
Test_API10_downstream_ssrf_telemetry: missing_feature
208208
Test_API10_redirect: missing_feature
209+
Test_API10_redirect_status: missing_feature
209210
Test_API10_request_body: missing_feature
210211
Test_API10_request_headers: missing_feature
211212
Test_API10_request_method: missing_feature

manifests/golang.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ tests/:
217217
Test_API10_downstream_request_tag: v2.5.0-dev
218218
Test_API10_downstream_ssrf_telemetry: v2.4.0
219219
Test_API10_redirect: missing_feature
220+
Test_API10_redirect_status: missing_feature
220221
Test_API10_request_body: v2.4.0
221222
Test_API10_request_headers: v2.4.0
222223
Test_API10_request_method: v2.4.0

manifests/java.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,7 @@ tests/:
784784
vertx3: v1.54.0
785785
Test_API10_downstream_ssrf_telemetry: missing_feature
786786
Test_API10_redirect: missing_feature
787+
Test_API10_redirect_status: missing_feature
787788
Test_API10_request_body:
788789
'*': missing_feature
789790
vertx3: v1.54.0

manifests/nodejs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ tests/:
526526
Test_API10_downstream_request_tag: missing_feature
527527
Test_API10_downstream_ssrf_telemetry: missing_feature
528528
Test_API10_redirect: missing_feature
529+
Test_API10_redirect_status: missing_feature
529530
Test_API10_request_body: missing_feature
530531
Test_API10_request_headers: missing_feature
531532
Test_API10_request_method: missing_feature

manifests/php.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ tests/:
216216
Test_API10_downstream_request_tag: missing_feature
217217
Test_API10_downstream_ssrf_telemetry: missing_feature
218218
Test_API10_redirect: missing_feature
219+
Test_API10_redirect_status: missing_feature
219220
Test_API10_request_body: missing_feature
220221
Test_API10_request_headers: missing_feature
221222
Test_API10_request_method: missing_feature

manifests/python.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ tests/:
308308
Test_API10_redirect:
309309
'*': v3.18.0 (with urllib support)
310310
'fastapi': v4.1.0 (with requests/urllib3 support)
311+
Test_API10_redirect_status: v4.1.0
311312
Test_API10_request_body:
312313
'*': v3.14.0.rc
313314
'fastapi': v3.15.0.dev (with requests support)

manifests/python_lambda.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ tests/:
5656
rasp/:
5757
test_api10.py:
5858
Test_API10_all: v8.117.0.dev
59+
Test_API10_downstream_request_tag: missing_feature
60+
Test_API10_downstream_ssrf_telemetry: missing_feature
61+
Test_API10_redirect: missing_feature
62+
Test_API10_redirect_status: missing_feature
5963
Test_API10_request_body: v8.117.0.dev
6064
Test_API10_request_headers: v8.117.0.dev
6165
Test_API10_request_method: v8.117.0.dev

manifests/ruby.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ tests/:
226226
Test_API10_downstream_request_tag: missing_feature
227227
Test_API10_downstream_ssrf_telemetry: missing_feature
228228
Test_API10_redirect: missing_feature
229+
Test_API10_redirect_status: missing_feature
229230
Test_API10_request_body: missing_feature
230231
Test_API10_request_headers: missing_feature
231232
Test_API10_request_method: missing_feature

tests/appsec/rasp/rasp_non_blocking_ruleset.json

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
"stack_trace"
3434
]
3535
},
36-
3736
{
3837
"id": "rasp-930-100",
3938
"name": "Local file inclusion exploit",
@@ -277,6 +276,46 @@
277276
"on_match": [
278277
"stack_trace"
279278
]
280-
}
279+
},
280+
{
281+
"id": "api-010-100",
282+
"name": "Monitor redirections to GET targets",
283+
"enabled": true,
284+
"tags": {
285+
"type": "api10",
286+
"category": "api_security",
287+
"confidence": "0",
288+
"module": "business-logic"
289+
},
290+
"conditions": [
291+
{
292+
"parameters": {
293+
"inputs": [
294+
{
295+
"address": "server.io.net.response.status"
296+
}
297+
],
298+
"list": [
299+
"301",
300+
"302"
301+
]
302+
},
303+
"operator": "exact_match"
304+
}
305+
],
306+
"transformers": [],
307+
"output": {
308+
"event": false,
309+
"keep": true,
310+
"attributes": {
311+
"appsec.api.redirection.move_target": {
312+
"address": "server.io.net.response.headers",
313+
"key_path": [
314+
"location"
315+
]
316+
}
317+
}
318+
}
319+
}
281320
]
282321
}

tests/appsec/rasp/test_api10.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,3 +375,32 @@ def test_api10_redirect(self):
375375
assert self.r.status_code == 200
376376
interfaces.library.validate_one_span(self.r, validator=self.validate)
377377
interfaces.library.validate_one_span(self.r, validator=self.validate_metric)
378+
379+
380+
@rfc("https://docs.google.com/document/d/1gCXU3LvTH9en3Bww0AC2coSJWz1m7HcavZjvMLuDCWg/edit#heading=h.giijrtyn1fdx")
381+
@features.api10
382+
@scenarios.appsec_rasp_non_blocking
383+
class Test_API10_redirect_status(API10):
384+
"""API 10 for multiple redirect responses. Check status code analysis."""
385+
386+
TAGS_EXPECTED = [
387+
("_dd.appsec.trace.req_headers", "TAG_API10_REQ_HEADERS"),
388+
]
389+
390+
TAGS_EXPECTED_METRIC = [
391+
("_dd.appsec.downstream_request", "5"),
392+
]
393+
394+
PARAMS = {"Witness": "pwq3ojtropiw3hjtowir", "totalRedirects": "3"}
395+
396+
def setup_api10_redirect(self):
397+
self.r = weblog.get("/external_request/redirect", params=self.PARAMS)
398+
399+
def test_api10_redirect(self):
400+
assert self.r.status_code == 200
401+
# interfaces.library.validate_one_span(self.r, validator=self.validate)
402+
interfaces.library.validate_one_span(self.r, validator=self.validate_metric)
403+
for _, _trace, span in interfaces.library.get_spans(request=self.r):
404+
meta = span.get("meta", {})
405+
assert isinstance(meta.get("appsec.api.redirection.move_target", None), str), f"missing tag in {meta}"
406+
assert "/redirect?totalRedirects=2" in meta["appsec.api.redirection.move_target"]

0 commit comments

Comments
 (0)