-
Notifications
You must be signed in to change notification settings - Fork 469
fix(iast): wrong memory address in subprocess in mcp servers #15514
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
|
Bootstrap import analysisComparison of import times between this PR and base. SummaryThe average import time from this PR is: 246 ± 2 ms. The average import time from base is: 249 ± 2 ms. The import time difference between this PR and base is: -2.66 ± 0.08 ms. Import time breakdownThe following import paths have shrunk:
|
Performance SLOsComparing candidate avara1986/APPSEC-60135_iast_potencial_error (f396595) with baseline main (874de50) 📈 Performance Regressions (3 suites)📈 iastaspects - 118/118 (1 unstable)✅ add_aspectTime: ✅ 0.327µs (SLO: <10.000µs 📉 -96.7%) vs baseline: 📉 -18.2% Memory: ✅ 38.260MB (SLO: <41.500MB -7.8%) vs baseline: -0.3% ✅ add_inplace_aspectTime: ✅ 0.333µs (SLO: <10.000µs 📉 -96.7%) vs baseline: 📉 -17.6% Memory: ✅ 38.398MB (SLO: <41.500MB -7.5%) vs baseline: ~same ✅ add_inplace_noaspectTime: ✅ 0.318µs (SLO: <10.000µs 📉 -96.8%) vs baseline: +1.1% Memory: ✅ 38.339MB (SLO: <41.500MB -7.6%) vs baseline: -0.1% ✅ add_noaspectTime: ✅ 0.276µs (SLO: <10.000µs 📉 -97.2%) vs baseline: -1.1% Memory: ✅ 38.299MB (SLO: <41.500MB -7.7%) vs baseline: -0.5% ✅ bytearray_aspectTime: ✅ 1.310µs (SLO: <10.000µs 📉 -86.9%) vs baseline: -2.9% Memory: ✅ 38.201MB (SLO: <41.500MB -7.9%) vs baseline: -0.9% ✅ bytearray_extend_aspectTime: ✅ 1.459µs (SLO: <10.000µs 📉 -85.4%) vs baseline: -3.3% Memory: ✅ 38.358MB (SLO: <41.500MB -7.6%) vs baseline: -0.4% ✅ bytearray_extend_noaspectTime: ✅ 0.618µs (SLO: <10.000µs 📉 -93.8%) vs baseline: +0.9% Memory: ✅ 38.260MB (SLO: <41.500MB -7.8%) vs baseline: -0.2% ✅ bytearray_noaspectTime: ✅ 0.481µs (SLO: <10.000µs 📉 -95.2%) vs baseline: -0.4% Memory: ✅ 38.260MB (SLO: <41.500MB -7.8%) vs baseline: -0.2% ✅ bytes_aspectTime: ✅ 1.271µs (SLO: <10.000µs 📉 -87.3%) vs baseline: -0.2% Memory: ✅ 38.122MB (SLO: <41.500MB -8.1%) vs baseline: -0.6% ✅ bytes_noaspectTime: ✅ 0.491µs (SLO: <10.000µs 📉 -95.1%) vs baseline: -0.8% Memory: ✅ 38.378MB (SLO: <41.500MB -7.5%) vs baseline: ~same ✅ bytesio_aspectTime: ✅ 1.310µs (SLO: <10.000µs 📉 -86.9%) vs baseline: -1.0% Memory: ✅ 38.398MB (SLO: <41.500MB -7.5%) vs baseline: -0.3% ✅ bytesio_noaspectTime: ✅ 0.501µs (SLO: <10.000µs 📉 -95.0%) vs baseline: +2.0% Memory: ✅ 38.339MB (SLO: <41.500MB -7.6%) vs baseline: -0.1% ✅ capitalize_aspectTime: ✅ 0.734µs (SLO: <10.000µs 📉 -92.7%) vs baseline: -0.9% Memory: ✅ 38.280MB (SLO: <41.500MB -7.8%) vs baseline: -0.2% ✅ capitalize_noaspectTime: ✅ 0.434µs (SLO: <10.000µs 📉 -95.7%) vs baseline: +0.4% Memory: ✅ 38.201MB (SLO: <41.500MB -7.9%) vs baseline: -0.6% ✅ casefold_aspectTime: ✅ 0.731µs (SLO: <10.000µs 📉 -92.7%) vs baseline: -1.4% Memory: ✅ 38.201MB (SLO: <41.500MB -7.9%) vs baseline: -0.8% ✅ casefold_noaspectTime: ✅ 0.368µs (SLO: <10.000µs 📉 -96.3%) vs baseline: +0.3% Memory: ✅ 38.280MB (SLO: <41.500MB -7.8%) vs baseline: -0.3% ✅ decode_aspectTime: ✅ 0.719µs (SLO: <10.000µs 📉 -92.8%) vs baseline: -1.0% Memory: ✅ 38.240MB (SLO: <41.500MB -7.9%) vs baseline: -0.5% ✅ decode_noaspectTime: ✅ 0.420µs (SLO: <10.000µs 📉 -95.8%) vs baseline: -0.8% Memory: ✅ 38.319MB (SLO: <41.500MB -7.7%) vs baseline: -0.4% ✅ encode_aspectTime: ✅ 0.710µs (SLO: <10.000µs 📉 -92.9%) vs baseline: -0.1% Memory: ✅ 38.260MB (SLO: <41.500MB -7.8%) vs baseline: -0.6% ✅ encode_noaspectTime: ✅ 0.400µs (SLO: <10.000µs 📉 -96.0%) vs baseline: -0.7% Memory: ✅ 38.280MB (SLO: <41.500MB -7.8%) vs baseline: -0.4% ✅ format_aspectTime: ✅ 3.369µs (SLO: <10.000µs 📉 -66.3%) vs baseline: -1.5% Memory: ✅ 38.319MB (SLO: <41.500MB -7.7%) vs baseline: -1.1% ✅ format_map_aspectTime: ✅ 3.649µs (SLO: <10.000µs 📉 -63.5%) vs baseline: +1.6% Memory: ✅ 38.299MB (SLO: <41.500MB -7.7%) vs baseline: -0.2% ✅ format_map_noaspectTime: ✅ 0.774µs (SLO: <10.000µs 📉 -92.3%) vs baseline: ~same Memory: ✅ 38.476MB (SLO: <41.500MB -7.3%) vs baseline: +0.2% ✅ format_noaspectTime: ✅ 0.598µs (SLO: <10.000µs 📉 -94.0%) vs baseline: -0.2% Memory: ✅ 38.280MB (SLO: <41.500MB -7.8%) vs baseline: -0.2% ✅ index_aspectTime: ✅ 0.343µs (SLO: <10.000µs 📉 -96.6%) vs baseline: -3.4% Memory: ✅ 38.201MB (SLO: <41.500MB -7.9%) vs baseline: -0.5% ✅ index_noaspectTime: ✅ 0.280µs (SLO: <10.000µs 📉 -97.2%) vs baseline: +0.8% Memory: ✅ 38.358MB (SLO: <41.500MB -7.6%) vs baseline: -0.3% ✅ join_aspectTime: ✅ 1.245µs (SLO: <10.000µs 📉 -87.5%) vs baseline: -6.6% Memory: ✅ 38.260MB (SLO: <41.500MB -7.8%) vs baseline: -0.3% ✅ join_noaspectTime: ✅ 0.488µs (SLO: <10.000µs 📉 -95.1%) vs baseline: -0.1% Memory: ✅ 38.378MB (SLO: <41.500MB -7.5%) vs baseline: ~same ✅ ljust_aspectTime: ✅ 2.588µs (SLO: <20.000µs 📉 -87.1%) vs baseline: +0.7% Memory: ✅ 38.240MB (SLO: <41.500MB -7.9%) vs baseline: -0.3% ✅ ljust_noaspectTime: ✅ 0.405µs (SLO: <10.000µs 📉 -95.9%) vs baseline: +0.6% Memory: ✅ 38.260MB (SLO: <41.500MB -7.8%) vs baseline: -0.5% ✅ lower_aspectTime: ✅ 2.277µs (SLO: <10.000µs 📉 -77.2%) vs baseline: +2.4% Memory: ✅ 38.339MB (SLO: <41.500MB -7.6%) vs baseline: ~same ✅ lower_noaspectTime: ✅ 0.367µs (SLO: <10.000µs 📉 -96.3%) vs baseline: +0.3% Memory: ✅ 38.280MB (SLO: <41.500MB -7.8%) vs baseline: -0.3% ✅ lstrip_aspectTime: ✅ 2.220µs (SLO: <20.000µs 📉 -88.9%) vs baseline: -1.2% Memory: ✅ 38.240MB (SLO: <41.500MB -7.9%) vs baseline: -0.6% ✅ lstrip_noaspectTime: ✅ 0.386µs (SLO: <10.000µs 📉 -96.1%) vs baseline: +2.1% Memory: ✅ 38.299MB (SLO: <41.500MB -7.7%) vs baseline: -0.4% ✅ modulo_aspectTime: ✅ 0.928µs (SLO: <10.000µs 📉 -90.7%) vs baseline: -8.0% Memory: ✅ 38.240MB (SLO: <41.500MB -7.9%) vs baseline: -0.4% ✅ modulo_aspect_for_bytearray_bytearrayTime: ✅ 1.416µs (SLO: <10.000µs 📉 -85.8%) vs baseline: -9.0% Memory: ✅ 38.299MB (SLO: <41.500MB -7.7%) vs baseline: -0.4% ✅ modulo_aspect_for_bytesTime: ✅ 0.910µs (SLO: <10.000µs 📉 -90.9%) vs baseline: -6.8% Memory: ✅ 38.221MB (SLO: <41.500MB -7.9%) vs baseline: -0.1% ✅ modulo_aspect_for_bytes_bytearrayTime: ✅ 1.125µs (SLO: <10.000µs 📉 -88.8%) vs baseline: -8.4% Memory: ✅ 38.221MB (SLO: <41.500MB -7.9%) vs baseline: -0.6% ✅ modulo_noaspectTime: ✅ 0.623µs (SLO: <10.000µs 📉 -93.8%) vs baseline: -0.3% Memory: ✅ 38.260MB (SLO: <41.500MB -7.8%) vs baseline: -0.5% ✅ replace_aspectTime: ✅ 4.932µs (SLO: <10.000µs 📉 -50.7%) vs baseline: +0.7% Memory: ✅ 38.201MB (SLO: <41.500MB -7.9%) vs baseline: -0.5% ✅ replace_noaspectTime: ✅ 0.462µs (SLO: <10.000µs 📉 -95.4%) vs baseline: ~same Memory: ✅ 38.280MB (SLO: <41.500MB -7.8%) vs baseline: ~same ✅ repr_aspectTime: ✅ 0.904µs (SLO: <10.000µs 📉 -91.0%) vs baseline: -0.7% Memory: ✅ 38.240MB (SLO: <41.500MB -7.9%) vs baseline: -0.2% ✅ repr_noaspectTime: ✅ 0.424µs (SLO: <10.000µs 📉 -95.8%) vs baseline: +1.7% Memory: ✅ 38.516MB (SLO: <41.500MB -7.2%) vs baseline: +0.6% ✅ rstrip_aspectTime: ✅ 1.904µs (SLO: <20.000µs 📉 -90.5%) vs baseline: -0.3% Memory: ✅ 38.398MB (SLO: <41.500MB -7.5%) vs baseline: -0.5% ✅ rstrip_noaspectTime: ✅ 0.379µs (SLO: <10.000µs 📉 -96.2%) vs baseline: -0.2% Memory: ✅ 38.260MB (SLO: <41.500MB -7.8%) vs baseline: -0.4%
|
e676dc2 to
05a9d46
Compare
IAST-enabled applications using Gunicorn/Uvicorn workers were experiencing segmentation faults (~33% crash rate on MCP streaming requests) due to memory corruption when processes fork.
Root Cause
taint_engine_context,initializer) initialized at module loadSolution
pthread_atforkhandler that automatically resets C++ global state in child processes after every fork:ASAN Verification
AddressSanitizer (ASAN) is a fast memory error detector that catches use-after-free, buffer overflows, and other memory corruption bugs at runtime.
1. Runtime Environment (No Recompilation Required)
The simplest way to test is using LD_PRELOAD with the system's libasan:
ASAN_OPTIONS explained:
detect_leaks=0- Disable leak detection (Python has many false positives)symbolize=1- Show human-readable stack tracesabort_on_error=0- Continue after first error (collect all errors)2. Build with ASAN (Optional, for deeper analysis)
For more thorough testing, compile the native extension with ASAN:
Minimal Reproduction Test
This script demonstrates the fork safety fix and can be used to verify ASAN finds no errors:
Run with ASAN:
Expected output (success):
What ASAN would report WITHOUT this fix: