From f2c630ed267b58fe405d33dfbadc792fd9fcf953 Mon Sep 17 00:00:00 2001 From: Santiago Mola Date: Fri, 25 Apr 2025 08:27:32 +0200 Subject: [PATCH] fix(iast): avoid excessive filtering of stacktrace locations --- ddtrace/appsec/_iast/_stacktrace.c | 247 ++++++++++++------ ddtrace/appsec/_iast/_stacktrace.pyi | 2 +- ddtrace/appsec/_iast/taint_sinks/_base.py | 23 +- ...st-stacktrace-filter-6afd6a9568f36d99.yaml | 4 + .../appsec/iast/taint_sinks/test_weak_hash.py | 4 +- tests/appsec/iast_memcheck/_stacktrace_py.py | 42 --- .../iast_memcheck/fixtures/stacktrace.py | 15 +- .../iast_memcheck/test_iast_mem_check.py | 74 +----- 8 files changed, 201 insertions(+), 210 deletions(-) create mode 100644 releasenotes/notes/fix-iast-stacktrace-filter-6afd6a9568f36d99.yaml delete mode 100644 tests/appsec/iast_memcheck/_stacktrace_py.py diff --git a/ddtrace/appsec/_iast/_stacktrace.c b/ddtrace/appsec/_iast/_stacktrace.c index 893d2c5a076..057e9d5a803 100644 --- a/ddtrace/appsec/_iast/_stacktrace.c +++ b/ddtrace/appsec/_iast/_stacktrace.c @@ -9,6 +9,7 @@ static __thread int in_stacktrace = 0; #include #include #include +#include #ifdef _WIN32 #define DD_TRACE_INSTALLED_PREFIX "\\ddtrace\\" @@ -25,6 +26,7 @@ static __thread int in_stacktrace = 0; #define GET_LINENO(frame) PyFrame_GetLineNumber((PyFrameObject*)frame) #define GET_FRAME(tstate) PyThreadState_GetFrame(tstate) #define GET_PREVIOUS(frame) PyFrame_GetBack(frame) +#define FRAME_INCREF(frame) Py_INCREF((PyObject*)frame) #define FRAME_DECREF(frame) Py_DecRef((PyObject*)frame) #define FRAME_XDECREF(frame) Py_XDECREF((PyObject*)frame) #define FILENAME_DECREF(filename) Py_DecRef(filename) @@ -68,6 +70,7 @@ GET_FUNCTION(PyFrameObject* frame) #define GET_FRAME(tstate) tstate->frame #define GET_PREVIOUS(frame) frame->f_back #define GET_FILENAME(frame) ((PyObject*)(frame->f_code->co_filename)) +#define FRAME_INCREF(frame) #define FRAME_DECREF(frame) #define FRAME_XDECREF(frame) #define FILENAME_DECREF(filename) @@ -88,6 +91,14 @@ GET_FUNCTION(PyFrameObject* frame) #endif #endif +// Python standard library path +static char* STDLIB_PATH = NULL; +static ssize_t STDLIB_PATH_LEN = 0; + +// Python site-packages path +static char* PURELIB_PATH = NULL; +static ssize_t PURELIB_PATH_LEN = 0; + static inline PyObject* SAFE_GET_LOCALS(PyFrameObject* frame) { @@ -121,115 +132,191 @@ GET_CLASS(PyFrameObject* frame) } /** - * get_file_and_line - * - * Get the filename, line number, function name and class name of the original wrapped - * function to report it. - * - * Returns a tuple: - * (filename, line_number, function name, class name) - **/ -static PyObject* -get_file_and_line(PyObject* Py_UNUSED(module), PyObject* cwd_obj) + * Checks if the filename is special. + * For example, a frozen module (``), a template (`