Runtimes
Last updated: Aug 19, 2026
Runtime CVE detection is different from package manager dependency scanning: instead of reporting a vulnerability in one of your project's declared dependencies, it reports a vulnerability in the language or runtime itself (for example, a CVE in the Go toolchain or in the Ruby interpreter). Because of this difference, only a small subset of the ecosystems Fluid Attacks scans for dependencies also get runtime CVE reports.
The criterion
To safely report a runtime CVE, Fluid Attacks needs proof that the version it detects is the version actually running in production, not just a version the project's manifest says it is compatible with. Most manifest fields only declare compatibility, a range the code is expected to work with. They do not guarantee what gets deployed, so treating them as a runtime CVE signal would misreport vulnerabilities that may not apply.
Only two cases currently clear that bar:
- Go: Go compiles to a static binary that embeds its own runtime. The
Go version declared in
go.modis baked into the built artifact itself, so it is a genuine deployment-bound fact, not a guess. - Ruby on Heroku: Heroku's buildpack reads the Gemfile's
rubydirective at build time and installs exactly that version. This is only true under Heroku's build flow, so Fluid Attacks gates it on aProcfilebeing present in the repository, the signal that a project actually deploys that way. Without aProcfile, the same directive is just a compatibility declaration, the same as every other ecosystem below.
Runtime CVE support by ecosystem
| Language / ecosystem | Manifest field | Runtime CVE detection | Why |
|---|---|---|---|
| Go | go.mod Go version directive | Supported | Static binary embeds its own runtime; a deployment-bound fact |
| Ruby (Bundler, on Heroku) | Gemfile/Gemfile.lock ruby directive | Supported, if a Procfile is present | Heroku's buildpack installs that exact version at build time |
| Ruby (Bundler, no Heroku) | Gemfile/Gemfile.lock ruby directive | Not applicable | Compatibility-only declaration without a Heroku deployment signal |
| Ruby (RubyGems) | *.gemspec required_ruby_version | Not applicable | A gem's declared compatibility targets its own consumers, not an application's deployment |
| .NET / NuGet | *.csproj TargetFramework | Not applicable | Compatibility-only declaration; framework-dependent deployment lets the installed runtime diverge |
| Node.js / npm, Bun | package.json engines.node / engines.bun | Not applicable | Compatibility-only declaration, same flaw as .NET |
| Python (Poetry, Pipenv, uv) | requires-python and equivalents | Not applicable | Compatibility-only declaration, same flaw as .NET |
| Swift (SPM) | Package.swift swift-tools-version | Not applicable | Compatibility-only declaration, same flaw as .NET |
| Dart / Flutter (pub) | pubspec.yaml environment.sdk | Not applicable | Compatibility-only declaration, same flaw as .NET |
| PHP (Composer) | composer.json require.php | Not applicable | Compatibility-only declaration, same flaw as .NET |
| Yarn, pnpm | N/A | Not applicable | Lockfile formats have no runtime version field |
| Pip | N/A | Not applicable | requirements.txt has no Python version field |
| CocoaPods | N/A | Not applicable | No standardized Swift/Objective-C runtime version field in the format |
| Gradle, Maven, sbt | N/A | Not available | Scoped and prototyped, but never merged to trunk; no current runtime detection |
Search for vulnerabilities in your apps for free with Fluid Attacks' automated security testing! Start your 21-day free trial and discover the benefits of the Essential plan. If you prefer the Advanced plan, which includes the expertise of Fluid Attacks' pentesting team, fill out this contact form.