Skip to content

Conversation

simon-id
Copy link
Member

@simon-id simon-id commented Jul 11, 2025

What does this PR do?

Add RASP support for Fastify.

This require creating a new system called "block delegation". Instead of blocking responses synchronously in the middle of a request/response cycle with block(). We register a "block delegation" with registerBlockDelegation() that will be picked up when the user/framework call response ending methods (res.writeHead(), res.end(), res.write()), and will then call the normal block() to send our blocking response in lieu of the user's response. A good ol' switcharoo.
This is to allow frameworks to follow their full request life-cycles, instead of us abruptly breaking continuity. For example it allows Fastify to call the onError, onSend and onResponse hooks correctly, which in turns allow more control on the cleanup of the request by the users.

ST PR: DataDog/system-tests#4963

@simon-id simon-id changed the title push repro Fastify RASP Jul 11, 2025
Copy link

github-actions bot commented Jul 16, 2025

Overall package size

Self size: 11.92 MB
Deduped: 111.53 MB
No deduping: 111.87 MB

Dependency sizes | name | version | self size | total size | |------|---------|-----------|------------| | @datadog/libdatadog | 0.7.0 | 35.02 MB | 35.02 MB | | @datadog/native-appsec | 10.1.0 | 20.37 MB | 20.37 MB | | @datadog/native-iast-taint-tracking | 4.0.0 | 11.72 MB | 11.73 MB | | @datadog/pprof | 5.9.0 | 9.77 MB | 10.1 MB | | @opentelemetry/core | 1.30.1 | 908.66 kB | 7.16 MB | | protobufjs | 7.5.4 | 2.95 MB | 5.6 MB | | @datadog/wasm-js-rewriter | 4.0.1 | 2.85 MB | 3.58 MB | | @datadog/native-metrics | 3.1.1 | 1.02 MB | 1.43 MB | | @opentelemetry/api | 1.8.0 | 1.21 MB | 1.21 MB | | jsonpath-plus | 10.3.0 | 617.18 kB | 1.08 MB | | import-in-the-middle | 1.14.2 | 122.36 kB | 850.93 kB | | lru-cache | 10.4.3 | 804.3 kB | 804.3 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | source-map | 0.7.6 | 185.63 kB | 185.63 kB | | pprof-format | 2.1.0 | 111.69 kB | 111.69 kB | | @datadog/sketches-js | 2.1.1 | 109.9 kB | 109.9 kB | | lodash.sortby | 4.7.0 | 75.76 kB | 75.76 kB | | ignore | 7.0.5 | 63.38 kB | 63.38 kB | | istanbul-lib-coverage | 3.2.2 | 34.37 kB | 34.37 kB | | rfdc | 1.4.1 | 27.15 kB | 27.15 kB | | dc-polyfill | 0.1.10 | 26.73 kB | 26.73 kB | | @isaacs/ttlcache | 1.4.1 | 25.2 kB | 25.2 kB | | tlhunter-sorted-set | 0.1.0 | 24.94 kB | 24.94 kB | | shell-quote | 1.8.3 | 23.74 kB | 23.74 kB | | limiter | 1.1.5 | 23.17 kB | 23.17 kB | | retry | 0.13.1 | 18.85 kB | 18.85 kB | | semifies | 1.0.0 | 15.84 kB | 15.84 kB | | jest-docblock | 29.7.0 | 8.99 kB | 12.76 kB | | crypto-randomuuid | 1.0.0 | 11.18 kB | 11.18 kB | | ttl-set | 1.0.0 | 4.61 kB | 9.69 kB | | mutexify | 1.4.0 | 5.71 kB | 8.74 kB | | path-to-regexp | 0.1.12 | 6.6 kB | 6.6 kB | | koalas | 1.0.2 | 6.47 kB | 6.47 kB | | module-details-from-path | 1.0.4 | 3.96 kB | 3.96 kB |

🤖 This report was automatically generated by heaviest-objects-in-the-universe

Copy link

codecov bot commented Jul 16, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 83.80%. Comparing base (9469da8) to head (05f498e).

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #6081      +/-   ##
==========================================
+ Coverage   83.76%   83.80%   +0.03%     
==========================================
  Files         477      477              
  Lines       20060    20078      +18     
==========================================
+ Hits        16804    16827      +23     
+ Misses       3256     3251       -5     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@pr-commenter
Copy link

pr-commenter bot commented Jul 16, 2025

Benchmarks

Benchmark execution time: 2025-08-28 04:06:26

Comparing candidate commit 05f498e in PR branch simon-id/fastify_rasp with baseline commit 9469da8 in branch master.

Found 0 performance improvements and 0 performance regressions! Performance is the same for 1267 metrics, 56 unstable metrics.

@datadog-datadog-prod-us1
Copy link

datadog-datadog-prod-us1 bot commented Aug 6, 2025

✅ Tests

🎉 All green!

❄️ No new flaky tests detected
🧪 All tests passed

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: 05f498e | Docs | Was this helpful? Give us feedback!

@simon-id simon-id changed the title Fastify RASP Fastify RASP support Aug 13, 2025
@simon-id simon-id marked this pull request as ready for review August 13, 2025 08:09
@simon-id simon-id requested a review from a team as a code owner August 13, 2025 08:09
// block() returns a bool, and delegateBlock() returns a promise
// we use Promise.resolve() to handle both cases
Promise.resolve(blocked).then(blocked => {
// TODO: bug: this should probably be called for each match even without block
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This TODO is not precise. We are calling to the method when the operation is not blocked. The bug is that if the operation is blocked but the request is not (for example: try catched blocked operation), we are not updating the metric neither with true nor false

Co-authored-by: Carles Capell <[email protected]>
@simon-id simon-id requested a review from a team as a code owner August 28, 2025 03:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants