Skip to content

Commit 22aca69

Browse files
authored
Merge branch 'main' into munir/update-suitspec-contrib
2 parents 52cdad3 + 122caa6 commit 22aca69

File tree

78 files changed

+468
-2075
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+468
-2075
lines changed

Diff for: .riot/requirements/1761702.txt

-23
This file was deleted.

Diff for: .riot/requirements/1cc7b0e.txt

-25
This file was deleted.

Diff for: .riot/requirements/1f1e9b4.txt

-25
This file was deleted.

Diff for: .riot/requirements/9b8251b.txt

-25
This file was deleted.

Diff for: .riot/requirements/fda8aa6.txt

-25
This file was deleted.

Diff for: ddtrace/_monkey.py

-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@
9393
"pyodbc": True,
9494
"fastapi": True,
9595
"dogpile_cache": True,
96-
"yaaredis": True,
9796
"asyncpg": True,
9897
"aws_lambda": True, # patch only in AWS Lambda environments
9998
"azure_functions": True,

Diff for: ddtrace/appsec/__init__.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
# this module must not load any other unsafe appsec module directly
2+
13
from ddtrace.internal import core
2-
from ddtrace.settings.asm import config as asm_config
34

45

56
_APPSEC_TO_BE_LOADED = True
@@ -28,7 +29,9 @@ def load_iast():
2829

2930
def load_common_appsec_modules():
3031
"""Lazily load the common module patches."""
31-
if (asm_config._ep_enabled and asm_config._asm_enabled) or asm_config._iast_enabled:
32+
from ddtrace.settings.asm import config as asm_config
33+
34+
if asm_config._load_modules:
3235
from ddtrace.appsec._common_module_patches import patch_common_modules
3336

3437
patch_common_modules()

Diff for: ddtrace/appsec/_asm_request_context.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
from ddtrace.appsec._constants import APPSEC
1616
from ddtrace.appsec._constants import EXPLOIT_PREVENTION
1717
from ddtrace.appsec._constants import SPAN_DATA_NAMES
18-
from ddtrace.appsec._iast._iast_request_context import is_iast_request_enabled
19-
from ddtrace.appsec._iast._taint_tracking import OriginType
20-
from ddtrace.appsec._iast._taint_tracking._taint_objects import taint_pyobject
2118
from ddtrace.appsec._utils import add_context_log
2219
from ddtrace.appsec._utils import get_triggers
2320
from ddtrace.internal import core
@@ -28,6 +25,16 @@
2825
from ddtrace.trace import Span
2926

3027

28+
if asm_config._iast_enabled:
29+
from ddtrace.appsec._iast._iast_request_context import is_iast_request_enabled
30+
from ddtrace.appsec._iast._taint_tracking import OriginType
31+
from ddtrace.appsec._iast._taint_tracking._taint_objects import taint_pyobject
32+
else:
33+
34+
def is_iast_request_enabled() -> bool:
35+
return False
36+
37+
3138
if TYPE_CHECKING:
3239
from ddtrace.appsec._ddwaf import DDWaf_info
3340
from ddtrace.appsec._ddwaf import DDWaf_result

Diff for: ddtrace/appsec/_common_module_patches.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ def is_iast_request_enabled() -> bool:
4444

4545
def patch_common_modules():
4646
global _is_patched
47+
# ensure that the subprocess patch is applied even after one click activation
48+
subprocess_patch.patch()
49+
subprocess_patch.add_str_callback(_RASP_SYSTEM, wrapped_system_5542593D237084A7)
50+
subprocess_patch.add_lst_callback(_RASP_POPEN, popen_FD233052260D8B4D)
4751
if _is_patched:
4852
return
4953
# for testing purposes, we need to update is_iast_request_enabled
@@ -60,10 +64,6 @@ def is_iast_request_enabled() -> bool:
6064
try_wrap_function_wrapper("urllib.request", "OpenerDirector.open", wrapped_open_ED4CF71136E15EBF)
6165
try_wrap_function_wrapper("_io", "BytesIO.read", wrapped_read_F3E51D71B4EC16EF)
6266
try_wrap_function_wrapper("_io", "StringIO.read", wrapped_read_F3E51D71B4EC16EF)
63-
# ensure that the subprocess patch is applied even after one click activation
64-
subprocess_patch.patch()
65-
subprocess_patch.add_str_callback(_RASP_SYSTEM, wrapped_system_5542593D237084A7)
66-
subprocess_patch.add_lst_callback(_RASP_POPEN, popen_FD233052260D8B4D)
6767
core.on("asm.block.dbapi.execute", execute_4C9BAC8E228EB347)
6868
if asm_config._iast_enabled:
6969
from ddtrace.appsec._iast._metrics import _set_metric_iast_instrumented_sink

Diff for: ddtrace/appsec/_constants.py

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# this module must not load any other unsafe appsec module directly
2+
13
import os
24
from re import Match
35
import sys

Diff for: ddtrace/appsec/_iast/taint_sinks/xss.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,15 @@ def patch():
6464
)
6565

6666
_set_metric_iast_instrumented_sink(VULN_XSS)
67-
_set_metric_iast_instrumented_sink(VULN_XSS)
67+
# Even when starting the application with `ddtrace-run ddtrace-run`, `jinja2.FILTERS` is created before this patch
68+
# function executes. Therefore, we update the in-memory object with the newly patched version.
69+
try:
70+
from jinja2.filters import FILTERS
71+
from jinja2.filters import do_mark_safe
72+
73+
FILTERS["safe"] = do_mark_safe
74+
except (ImportError, KeyError):
75+
pass
6876

6977

7078
def unpatch():

Diff for: ddtrace/appsec/_utils.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
# this module must not load any other unsafe appsec module directly
2+
13
import logging
24
import sys
35
from typing import Any
46
import uuid
57

68
from ddtrace.appsec._constants import API_SECURITY
79
from ddtrace.appsec._constants import APPSEC
10+
from ddtrace.appsec._constants import SPAN_DATA_NAMES
811
from ddtrace.internal._unpatched import unpatched_json_loads
912
from ddtrace.internal.compat import to_unicode
1013
from ddtrace.internal.logger import get_logger
@@ -21,7 +24,6 @@ def parse_response_body(raw_body):
2124
import xmltodict
2225

2326
from ddtrace.appsec import _asm_request_context
24-
from ddtrace.appsec._constants import SPAN_DATA_NAMES
2527
from ddtrace.contrib.internal.trace_utils import _get_header_value_case_insensitive
2628

2729
if not raw_body:

Diff for: ddtrace/contrib/_yaaredis.py

-67
This file was deleted.

Diff for: ddtrace/contrib/internal/httplib/patch.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import wrapt
66

77
from ddtrace import config
8-
from ddtrace.appsec._common_module_patches import wrapped_request_D8CB81E472AF98A2 as _wrap_request_asm
98
from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY
109
from ddtrace.constants import SPAN_KIND
1110
from ddtrace.contrib import trace_utils
@@ -77,12 +76,14 @@ def _wrap_getresponse(func, instance, args, kwargs):
7776

7877

7978
def _call_asm_wrap(func, instance, *args, **kwargs):
79+
from ddtrace.appsec._common_module_patches import wrapped_request_D8CB81E472AF98A2 as _wrap_request_asm
80+
8081
_wrap_request_asm(func, instance, args, kwargs)
8182

8283

8384
def _wrap_request(func, instance, args, kwargs):
8485
# Use any attached tracer if available, otherwise use the global tracer
85-
if asm_config._iast_enabled or asm_config._asm_enabled:
86+
if asm_config._iast_enabled or (asm_config._asm_enabled and asm_config._ep_enabled):
8687
func_to_call = functools.partial(_call_asm_wrap, func, instance)
8788
else:
8889
func_to_call = func

Diff for: ddtrace/contrib/internal/langchain/patch.py

-23
Original file line numberDiff line numberDiff line change
@@ -1090,29 +1090,6 @@ def unpatch():
10901090
delattr(langchain, "_datadog_integration")
10911091

10921092

1093-
def taint_outputs(instance, inputs, outputs):
1094-
from ddtrace.appsec._iast._metrics import _set_iast_error_metric
1095-
from ddtrace.appsec._iast._taint_tracking._taint_objects import get_tainted_ranges
1096-
from ddtrace.appsec._iast._taint_tracking._taint_objects import taint_pyobject
1097-
1098-
try:
1099-
ranges = None
1100-
for key in filter(lambda x: x in inputs, instance.input_keys):
1101-
input_val = inputs.get(key)
1102-
if input_val:
1103-
ranges = get_tainted_ranges(input_val)
1104-
if ranges:
1105-
break
1106-
1107-
if ranges:
1108-
source = ranges[0].source
1109-
for key in filter(lambda x: x in outputs, instance.output_keys):
1110-
output_value = outputs[key]
1111-
outputs[key] = taint_pyobject(output_value, source.name, source.value, source.origin)
1112-
except Exception as e:
1113-
_set_iast_error_metric("IAST propagation error. langchain taint_outputs. {}".format(e))
1114-
1115-
11161093
def taint_parser_output(func, instance, args, kwargs):
11171094
from ddtrace.appsec._iast._metrics import _set_iast_error_metric
11181095
from ddtrace.appsec._iast._taint_tracking._taint_objects import get_tainted_ranges

Diff for: ddtrace/contrib/internal/mysql/patch.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import wrapt
55

66
from ddtrace import config
7-
from ddtrace.appsec._iast._metrics import _set_metric_iast_instrumented_sink
8-
from ddtrace.appsec._iast.constants import VULN_SQL_INJECTION
97
from ddtrace.contrib.dbapi import TracedConnection
108
from ddtrace.contrib.internal.trace_utils import _convert_to_string
119
from ddtrace.ext import db
@@ -51,6 +49,9 @@ def patch():
5149
mysql.connector.Connect = mysql.connector.connect
5250

5351
if asm_config._iast_enabled:
52+
from ddtrace.appsec._iast._metrics import _set_metric_iast_instrumented_sink
53+
from ddtrace.appsec._iast.constants import VULN_SQL_INJECTION
54+
5455
_set_metric_iast_instrumented_sink(VULN_SQL_INJECTION)
5556
mysql.connector._datadog_patch = True
5657

0 commit comments

Comments
 (0)