Mostly safe — a couple of notes worth reading.
Scanned 5/3/2026, 7:27:27 PM·Cached result·Fast Scan·45 rules·How we decide ↗
AIVSS Score
Low
Severity Breakdown
0
critical
0
high
67
medium
15
low
MCP Server Information
Findings
This package scores 70/100 with a B grade but carries significant readiness and resource exhaustion concerns across 67 medium-severity findings, suggesting it may not be production-ready and could be vulnerable to denial-of-service attacks. The 15 low-severity issues and server configuration gaps add additional operational risk. Installation should be preceded by thorough testing in a controlled environment and evaluation of whether these resource management weaknesses are acceptable for your use case.
No known CVEs found for this package or its dependencies.
Scan Details
Want deeper analysis?
Fast scan found 82 findings using rule-based analysis. Upgrade for LLM consensus across 5 judges, AI-generated remediation, and cross-file taint analysis.
Building your own MCP server?
Same rules, same LLM judges, same grade. Private scans stay isolated to your account and never appear in the public registry. Required for code your team hasn’t shipped yet.
Showing 1–30 of 82 findings
82 findings
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 234 | /// `handlerPath + "/" + path`, and [url] becomes relative to that. For |
| 235 | /// example: |
| 236 | /// |
| 237 | /// print(request.handlerPath); // => /static/ |
| 238 | /// print(request.url); // => dir/file.html |
| 239 | /// |
| 240 | /// request = request.change(path: "dir"); |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 239 | /// |
| 240 | /// request = request.change(path: "dir"); |
| 241 | /// print(request.handlerPath); // => /static/dir/ |
| 242 | /// print(request.url); // => file.html |
| 243 | @override |
| 244 | Request change({ |
| 245 | Map<String, /* String | List<String> */ Object?>? headers, |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 238 | /// print(request.url); // => dir/file.html |
| 239 | /// |
| 240 | /// request = request.change(path: "dir"); |
| 241 | /// print(request.handlerPath); // => /static/dir/ |
| 242 | /// print(request.url); // => file.html |
| 243 | @override |
| 244 | Request change({ |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 235 | /// example: |
| 236 | /// |
| 237 | /// print(request.handlerPath); // => /static/ |
| 238 | /// print(request.url); // => dir/file.html |
| 239 | /// |
| 240 | /// request = request.change(path: "dir"); |
| 241 | /// print(request.handlerPath); // => /static/dir/ |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
User-controlled value printed to terminal without ANSI escape sanitization. Malicious input can inject cursor-control sequences, rewrite earlier output, or hide shell commands from the operator.
Evidence
| 16 | {"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01DUYWFBpVUDBHGg9uK1SzUH","type":"tool_result","content":[{"type":"text","text":"Found 8 results:\n\n<result:file filename=\"pkgs/shelf/CHANGELOG.md\">\n <result:chunk line-start=\"47\" line-end=\"59\" symbol=\"1.1.3+1.1.2\" kind=\"section\" score=\"0.79\">\n## 1.1.3\n\n* Automatically remove `content-length` header from a `Response.notModified`.\n Restores some of the safety around malformed requests that was removed in\ |
Remediation
Strip C0/C1 control codes before printing user-controlled values. Python: re.sub(r"[\x00-\x08\x0b-\x1f\x7f]", "", s). Prefer a structured logger (json/logfmt) over raw print to stdout.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 616 | end |
| 617 | |
| 618 | ordered = names.index_with do |name| |
| 619 | reads.fetch(name) { writes[name] = yield(name) } |
| 620 | end |
| 621 | writes.compact! if options[:skip_nil] |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 33 | {"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_014VMsdALsBKZwyY3HEcrk6s","type":"tool_result","content":"cat: illegal option -- A\nusage: cat [-belnstuv] [file ...]","is_error":false}]},"parent_tool_use_id":null,"session_id":"81df990f-cf73-441d-88a1-43c49f009aa1","uuid":"869e9199-4bf7-4969-8397-0f565f65ed3c","timestamp":"2026-04-17T02:14:13.245Z","tool_use_result":{"stdout":"cat: illegal option -- A\nusage: cat [-belnstuv] [file ...]","stderr":"","interrupted":false,"is |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 344 | # return value will be returned. |
| 345 | # |
| 346 | # cache.write('today', 'Monday') |
| 347 | # cache.fetch('today') # => "Monday" |
| 348 | # |
| 349 | # cache.fetch('city') # => nil |
| 350 | # cache.fetch('city') do |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 18 | {"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01XbrLSFqzcHpwqdkAiKvpM5","type":"tool_result","content":[{"type":"text","text":"Found 8 results:\n\n<result:file filename=\"src/lib/components/chat/FileDropzone.svelte\">\n <result:chunk line-start=\"5\" line-end=\"11\" symbol=\"Props\" kind=\"interface\" score=\"0.48\">\n\tinterface Props {\n\t\t// import EosIconsLoading from \"~icons/eos-icons/loading\";\n\t\tfiles: File[];\n\t\tmimeTypes?: string[];\n\t\tonDrag?: boole |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 449 | # token |
| 450 | # end |
| 451 | # |
| 452 | def fetch(name, options = nil, &block) |
| 453 | if block_given? |
| 454 | options = merged_options(options) |
| 455 | key = normalize_key(name, options) |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 16 | {"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01WinaBKvEzkcHfLnFZG4fBg","type":"tool_result","content":"1\t<script lang=\"ts\">\n2\t\timport type { Message, MessageFile } from \"$lib/types/Message\";\n3\t\timport { onDestroy } from \"svelte\";\n4\t\n5\t\timport IconOmni from \"$lib/components/icons/IconOmni.svelte\";\n6\t\timport CarbonCaretDown from \"~icons/carbon/caret-down\";\n7\t\timport CarbonDirectionRight from \"~icons/carbon/direction-right-01\";\n8\t\timport |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 21 | {"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01P5deCuX3A9Zw7swX3A34wi","type":"tool_result","content":" 1→# frozen_string_literal: true\n 2→\n 3→module Grape\n 4→ module Util\n 5→ class MediaType\n 6→ attr_reader :type, :subtype, :vendor, :version, :format\n 7→\n 8→ # based on the HTTP Accept header with the pattern:\n 9→ # application/vnd.:vendor-:version+:format\n 10→ VENDOR_VERSION_HEADER_REGEX = /\\Avn |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 419 | # # but before generating the new value |
| 420 | # sleep 0.1 |
| 421 | # |
| 422 | # val_2 = cache.fetch("foo", race_condition_ttl: 2) do |
| 423 | # # This block won't be executed because t1 extended the expiry |
| 424 | # "new value 2" |
| 425 | # end |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 955 | # If a value has been previously cached for key then it is |
| 956 | # returned. Otherwise, block is yielded to and its return value |
| 957 | # which may be nil, is cached under key and returned. |
| 958 | def fetch(*key) |
| 959 | @cache.fetch(key) do |
| 960 | @cache[key] = yield |
| 961 | end |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 553 | # |
| 554 | # Examples: |
| 555 | # |
| 556 | # Rails.app.envs.require(:db_password) # ENV,fetch("DB_PASSWORD") |
| 557 | # Rails.app.envs.require(:aws, :access_key_id) # ENV.fetch("AWS__ACCESS_KEY_ID") |
| 558 | # Rails.app.envs.option(:cache_host) # ENV["CACHE_HOST"] |
| 559 | # Rails.app.envs.option(:cache_host, default: "cache-host-1") # ENV.fetch("CACHE_HOST", "cache-host-1") |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 373 | # * <tt>skip_nil: true</tt> - Prevents caching a nil result: |
| 374 | # |
| 375 | # cache.fetch('foo') { nil } |
| 376 | # cache.fetch('bar', skip_nil: true) { nil } |
| 377 | # cache.exist?('foo') # => true |
| 378 | # cache.exist?('bar') # => false |
| 379 | # |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 372 | # |
| 373 | # * <tt>skip_nil: true</tt> - Prevents caching a nil result: |
| 374 | # |
| 375 | # cache.fetch('foo') { nil } |
| 376 | # cache.fetch('bar', skip_nil: true) { nil } |
| 377 | # cache.exist?('foo') # => true |
| 378 | # cache.exist?('bar') # => false |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 130 | {"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01GXC4Y6Hq15hy1Nf2LJ3Evw","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Now I understand the issue. In `format_from_header`, when the Accept header is `*/*`, `Rack::Utils.best_q_match` returns the first available MIME type instead of `nil`. This causes the wildcard to be treated as a preference for the first registered type, rather than falling back to the default format.\n\nThe fix: When the acc |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 278 | /** |
| 279 | * Returns a URI to use in contexts where the browser is responsible |
| 280 | * for loading (e.g. fetch()) or when used within the DOM. |
| 281 | * |
| 282 | * **Note:** use `dom.ts#asCSSUrl` whenever the URL is to be used in CSS context. |
| 283 | */ |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 350 | # cache.fetch('city') do |
| 351 | # 'Duckburgh' |
| 352 | # end |
| 353 | # cache.fetch('city') # => "Duckburgh" |
| 354 | # |
| 355 | # ==== Options |
| 356 | # |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 1865 | font_src: "'self'" |
| 1866 | }.merge options |
| 1867 | |
| 1868 | protect_session = options.fetch(:session) { sessions? } |
| 1869 | options[:without_session] = !protect_session |
| 1870 | |
| 1871 | options[:reaction] ||= :drop_session |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 347 | # cache.fetch('today') # => "Monday" |
| 348 | # |
| 349 | # cache.fetch('city') # => nil |
| 350 | # cache.fetch('city') do |
| 351 | # 'Duckburgh' |
| 352 | # end |
| 353 | # cache.fetch('city') # => "Duckburgh" |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 556 | # Rails.app.envs.require(:db_password) # ENV,fetch("DB_PASSWORD") |
| 557 | # Rails.app.envs.require(:aws, :access_key_id) # ENV.fetch("AWS__ACCESS_KEY_ID") |
| 558 | # Rails.app.envs.option(:cache_host) # ENV["CACHE_HOST"] |
| 559 | # Rails.app.envs.option(:cache_host, default: "cache-host-1") # ENV.fetch("CACHE_HOST", "cache-host-1") |
| 560 | # Rails.app.envs.option(:cache_host, default: -> { HostProvider.cache }) # ENV.fetch("CACHE_HOST") { HostProvider.cache } |
| 561 | def envs |
| 562 | @envs ||= ActiveSupport:: |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 435 | # # more second to see the entry expire. |
| 436 | # sleep 1 |
| 437 | # |
| 438 | # p cache.fetch("foo") # => nil |
| 439 | # |
| 440 | # ==== Dynamic Options |
| 441 | # |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 126 | {"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01KSfzVYYEGc28Vd7vWbH3Ft","type":"tool_result","content":" 1→# frozen_string_literal: true\n 2→\n 3→describe Grape::Middleware::Formatter do\n 4→ subject { described_class.new(app) }\n 5→\n 6→ before { allow(subject).to receive(:dup).and_return(subject) }\n 7→\n 8→ let(:body) { { 'foo' => 'bar' } }\n 9→ let(:app) { ->(_env) { [200, {}, [body]] } }\n 10→\n 11→ context 'serializa |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 363 | # required when +force+ is true so this always results in a cache write. |
| 364 | # |
| 365 | # cache.write('today', 'Monday') |
| 366 | # cache.fetch('today', force: true) { 'Tuesday' } # => 'Tuesday' |
| 367 | # cache.fetch('today', force: true) # => ArgumentError |
| 368 | # |
| 369 | # The +:force+ option is useful when you're calling some other method to |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 622 | # Before touching this code, please double check RFC 2616 14.24 and 14.26. |
| 623 | options = { kind: options } unless Hash === options |
| 624 | kind = options[:kind] || :strong |
| 625 | new_resource = options.fetch(:new_resource) { request.post? } |
| 626 | |
| 627 | unless ETAG_KINDS.include?(kind) |
| 628 | raise ArgumentError, ':strong or :weak expected' |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 346 | # cache.write('today', 'Monday') |
| 347 | # cache.fetch('today') # => "Monday" |
| 348 | # |
| 349 | # cache.fetch('city') # => nil |
| 350 | # cache.fetch('city') do |
| 351 | # 'Duckburgh' |
| 352 | # end |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 98 | {"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01SDghZStPyMPfz6fsuQCB6j","type":"tool_result","content":[{"type":"text","text":"Perfect! Now I have all the information I need. Let me provide a comprehensive summary of the content type negotiation and Accept header handling in the Grape Ruby gem.\n\n## Content Type Negotiation and Accept Header Handling in Grape\n\nI've found the key code responsible for content type negotiation and Accept header handling in the Grape Ru |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 289 | /** |
| 290 | * Returns a URI to use in contexts where the browser is responsible |
| 291 | * for loading (e.g. fetch()) or when used within the DOM. |
| 292 | * |
| 293 | * **Note:** use `dom.ts#asCSSUrl` whenever the URL is to be used in CSS context. |
| 294 | */ |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 956 | # returned. Otherwise, block is yielded to and its return value |
| 957 | # which may be nil, is cached under key and returned. |
| 958 | def fetch(*key) |
| 959 | @cache.fetch(key) do |
| 960 | @cache[key] = yield |
| 961 | end |
| 962 | end |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 20 | {"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01XkeNa63fUG47m52auMNLeu","type":"tool_result","content":[{"type":"text","text":"Found 9 results:\n\n<result:file filename=\"lib/grape/middleware/versioner/header.rb\">\n <result:chunk line-start=\"24\" line-end=\"127\" symbol=\"Versioner.Header+Header.match_best_quality_media_type!+Header.accept_header+Header.accept_header_check!+Header.q_values_mime_types+Header.invalid_accept_header!+Header.vendor_not_found!+Header.avai |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 554 | # Examples: |
| 555 | # |
| 556 | # Rails.app.envs.require(:db_password) # ENV,fetch("DB_PASSWORD") |
| 557 | # Rails.app.envs.require(:aws, :access_key_id) # ENV.fetch("AWS__ACCESS_KEY_ID") |
| 558 | # Rails.app.envs.option(:cache_host) # ENV["CACHE_HOST"] |
| 559 | # Rails.app.envs.option(:cache_host, default: "cache-host-1") # ENV.fetch("CACHE_HOST", "cache-host-1") |
| 560 | # Rails.app.envs.option(:cache_host, default: -> { HostProvider.cache }) # ENV.fetch("CACHE_HOST") { HostProvider.cache } |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 428 | # |
| 429 | # p val_1 # => "new value 1" |
| 430 | # p val_2 # => "original value" |
| 431 | # p cache.fetch("foo") # => "new value 1" |
| 432 | # |
| 433 | # # The entry requires 3 seconds to expire (expires_in + race_condition_ttl) |
| 434 | # # We have waited 2 seconds already (sleep(1) + t1.join) thus we need to wait 1 |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 409 | # # 1. gets an recent expired entry |
| 410 | # # 2. extends the expiry by 2 seconds (race_condition_ttl) |
| 411 | # # 3. regenerates the new value |
| 412 | # val_1 = cache.fetch("foo", race_condition_ttl: 2) do |
| 413 | # sleep 1 |
| 414 | # "new value 1" |
| 415 | # end |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 481 | return $statement; |
| 482 | }); |
| 483 | |
| 484 | while ($record = $statement->fetch()) { |
| 485 | yield $record; |
| 486 | } |
| 487 | } |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 32 | {"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_019qVGUNKP9opZm4vU7x2RJa","type":"tool_result","content":"238\t\t\t<!-- add a button on top that removes the image -->\n239\t\t\t{#if canClose}\n240\t\t\t\t<button\n241\t\t\t\t\tclass=\"absolute -right-2 -top-2 z-10 grid size-6 place-items-center rounded-full border bg-black group-hover:visible dark:border-gray-700\"\n242\t\t\t\t\tclass:invisible={navigator.maxTouchPoints === 0}\n243\t\t\t\t\tonclick={(e) => {\n244\t\t\t\t\ |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 443 | # on the cached value. To support this, an ActiveSupport::Cache::WriteOptions |
| 444 | # instance is passed as the second argument to the block. For example: |
| 445 | # |
| 446 | # cache.fetch("authentication-token:#{user.id}") do |key, options| |
| 447 | # token = authenticate_to_service |
| 448 | # options.expires_at = token.expires_at |
| 449 | # token |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 13 | {"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01VYtm6VKrCh7EwBLhtDLTCS","type":"tool_result","content":"Found 1 file\nsrc/lib/components/chat/ChatWindow.svelte"}]},"parent_tool_use_id":null,"session_id":"81df990f-cf73-441d-88a1-43c49f009aa1","uuid":"30c40fac-c59a-4c95-9ac3-faf623dde8ef","timestamp":"2026-04-17T02:13:40.218Z","tool_use_result":{"mode":"files_with_matches","filenames":["src/lib/components/chat/ChatWindow.svelte"],"numFiles":1}} |
| 14 | {"type":"assistant","messa |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 113 | {"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01GXhtrjbC7Xon79FeYR2mas","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Now I have a clear understanding of the issue. Let me look at the specific files to understand the regression:\n\n1. `lib/grape/middleware/formatter.rb` - The `negotiate_content_type` method and `format_from_header` method\n2. `lib/grape/util/media_type.rb` - The `best_quality_media_type` method\n\nThe issue is that when `Acc |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 557 | # Rails.app.envs.require(:aws, :access_key_id) # ENV.fetch("AWS__ACCESS_KEY_ID") |
| 558 | # Rails.app.envs.option(:cache_host) # ENV["CACHE_HOST"] |
| 559 | # Rails.app.envs.option(:cache_host, default: "cache-host-1") # ENV.fetch("CACHE_HOST", "cache-host-1") |
| 560 | # Rails.app.envs.option(:cache_host, default: -> { HostProvider.cache }) # ENV.fetch("CACHE_HOST") { HostProvider.cache } |
| 561 | def envs |
| 562 | @envs ||= ActiveSupport::EnvConfiguration.new |
| 563 | end |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Network / IO / subprocess call without an explicit timeout. A malicious or hung upstream (HTTP host, socket peer, child process) can pin threads, exhaust connection/process pools, and make the MCP server unresponsive. Always pass a bounded timeout. v2 extends v1 with subprocess coverage (R03 from the legacy readiness audit).
Evidence
| 364 | # |
| 365 | # cache.write('today', 'Monday') |
| 366 | # cache.fetch('today', force: true) { 'Tuesday' } # => 'Tuesday' |
| 367 | # cache.fetch('today', force: true) # => ArgumentError |
| 368 | # |
| 369 | # The +:force+ option is useful when you're calling some other method to |
| 370 | # ask whether you should force a cache write. Otherwise, it's clearer to |
Remediation
Pass timeout= on every call: - HTTP: `requests.get(url, timeout=5)`, `httpx.get(url, timeout=5.0)` - Node fetch: `AbortSignal.timeout(5000)` - Subprocess: `subprocess.run(["cmd"], timeout=30, check=True)` Pick a value short enough to fail fast and retry.
Overly permissive file mode or IAM wildcard. chmod 0777 and IAM "Action": "*" or "Resource": "*" grant far more access than a least-privilege MCP server needs.
Evidence
| 674 | return err |
| 675 | } |
| 676 | |
| 677 | if err = os.MkdirAll(tmp, 0o777); err != nil { |
| 678 | return err |
| 679 | } |
Remediation
File modes: use 0600 for secrets, 0644 for read-only data, 0755 for directories. IAM: scope Action to the specific service+verb (s3:GetObject) and Resource to exact ARNs. Never use * for both.
Overly permissive file mode or IAM wildcard. chmod 0777 and IAM "Action": "*" or "Resource": "*" grant far more access than a least-privilege MCP server needs.
Evidence
| 922 | // It initializes the lockfile, WAL, compactor, and Head (by replaying the WAL), and runs the database. |
| 923 | // It is not safe to open more than one DB in the same directory. |
| 924 | func open(dir string, l *slog.Logger, r prometheus.Registerer, opts *Options, rngs []int64, stats *DBStats) (_ *DB, returnedErr error) { |
| 925 | if err := os.MkdirAll(dir, 0o777); err != nil { |
| 926 | return nil, err |
| 927 | } |
| 928 | if l == nil { |
Remediation
File modes: use 0600 for secrets, 0644 for read-only data, 0755 for directories. IAM: scope Action to the specific service+verb (s3:GetObject) and Resource to exact ARNs. Never use * for both.
Overly permissive file mode or IAM wildcard. chmod 0777 and IAM "Action": "*" or "Resource": "*" grant far more access than a least-privilege MCP server needs.
Evidence
| 2078 | rand.Int63()) |
| 2079 | dir = filepath.Join(snapdir, name) |
| 2080 | ) |
| 2081 | if err := os.MkdirAll(dir, 0o777); err != nil { |
| 2082 | return apiFuncResult{nil, &apiError{errorInternal, fmt.Errorf("create snapshot directory: %w", err)}, nil, nil} |
| 2083 | } |
| 2084 | if err := api.db.Snapshot(dir, !skipHead); err != nil { |
Remediation
File modes: use 0600 for secrets, 0644 for read-only data, 0755 for directories. IAM: scope Action to the specific service+verb (s3:GetObject) and Resource to exact ARNs. Never use * for both.
Package declares an install-time hook (npm postinstall/preinstall/prepare, setup.py cmdclass override, custom setuptools install class, or non-default pyproject build-backend). Anyone installing this package runs the hook. Confirm the hook is necessary and review its contents; prefer shipping a plain library without install-time execution.
Evidence
| 29 | "types.d.ts" |
| 30 | ], |
| 31 | "scripts": { |
| 32 | "prepare": "husky", |
| 33 | "setup": "node ./setup/setup.js", |
| 34 | "prelint": "yarn setup", |
| 35 | "lint": "yarn lint:code && yarn lint:special && yarn lint:types && yarn lint:types-test && yarn lint:types-benchmark && yarn lint:types-module-test && yarn lint:types-hot && yarn fmt:check && yarn lint:spellcheck", |
Remediation
Prefer libraries that do not require install-time code execution: - Drop `postinstall`/`preinstall`/`prepare` scripts if the work can happen at runtime or build-time instead. - Ship pre-built native binaries rather than compiling via a custom `cmdclass` or `build_ext` override. - For Dockerfiles: replace `RUN curl … | sh` with a pinned download + checksum verification + explicit `RUN` of a named script. - If the hook is unavoidable, document exactly what it does so downstream reviewers
Package declares an install-time hook (npm postinstall/preinstall/prepare, setup.py cmdclass override, custom setuptools install class, or non-default pyproject build-backend). Anyone installing this package runs the hook. Confirm the hook is necessary and review its contents; prefer shipping a plain library without install-time execution.
Evidence
| 12 | }, |
| 13 | "keywords": ["frontend", "hmr", "dev-server", "build-tool", "vite"], |
| 14 | "scripts": { |
| 15 | "preinstall": "npx only-allow pnpm", |
| 16 | "postinstall": "simple-git-hooks", |
| 17 | "format": "prettier --write --cache .", |
| 18 | "lint": "eslint --cache .", |
Remediation
Prefer libraries that do not require install-time code execution: - Drop `postinstall`/`preinstall`/`prepare` scripts if the work can happen at runtime or build-time instead. - Ship pre-built native binaries rather than compiling via a custom `cmdclass` or `build_ext` override. - For Dockerfiles: replace `RUN curl … | sh` with a pinned download + checksum verification + explicit `RUN` of a named script. - If the hook is unavoidable, document exactly what it does so downstream reviewers
Package declares an install-time hook (npm postinstall/preinstall/prepare, setup.py cmdclass override, custom setuptools install class, or non-default pyproject build-backend). Anyone installing this package runs the hook. Confirm the hook is necessary and review its contents; prefer shipping a plain library without install-time execution.
Evidence
| 13 | "keywords": ["frontend", "hmr", "dev-server", "build-tool", "vite"], |
| 14 | "scripts": { |
| 15 | "preinstall": "npx only-allow pnpm", |
| 16 | "postinstall": "simple-git-hooks", |
| 17 | "format": "prettier --write --cache .", |
| 18 | "lint": "eslint --cache .", |
| 19 | "typecheck": "tsc -p scripts && pnpm -r --parallel run typecheck", |
Remediation
Prefer libraries that do not require install-time code execution: - Drop `postinstall`/`preinstall`/`prepare` scripts if the work can happen at runtime or build-time instead. - Ship pre-built native binaries rather than compiling via a custom `cmdclass` or `build_ext` override. - For Dockerfiles: replace `RUN curl … | sh` with a pinned download + checksum verification + explicit `RUN` of a named script. - If the hook is unavoidable, document exactly what it does so downstream reviewers
Package declares an install-time hook (npm postinstall/preinstall/prepare, setup.py cmdclass override, custom setuptools install class, or non-default pyproject build-backend). Anyone installing this package runs the hook. Confirm the hook is necessary and review its contents; prefer shipping a plain library without install-time execution.
Evidence
| 132 | "lint": "node ./scripts/tasks/eslint.js", |
| 133 | "lint-build": "node ./scripts/rollup/validate/index.js", |
| 134 | "extract-errors": "node scripts/error-codes/extract-errors.js", |
| 135 | "postinstall": "node ./scripts/flow/createFlowConfigs.js", |
| 136 | "test": "node ./scripts/jest/jest-cli.js", |
| 137 | "test-stable": "node ./scripts/jest/jest-cli.js --release-channel=stable", |
| 138 | "test-www": "node ./scripts/jest/jest-cli.js --release-channel=www-modern", |
Remediation
Prefer libraries that do not require install-time code execution: - Drop `postinstall`/`preinstall`/`prepare` scripts if the work can happen at runtime or build-time instead. - Ship pre-built native binaries rather than compiling via a custom `cmdclass` or `build_ext` override. - For Dockerfiles: replace `RUN curl … | sh` with a pinned download + checksum verification + explicit `RUN` of a named script. - If the hook is unavoidable, document exactly what it does so downstream reviewers
Package declares an install-time hook (npm postinstall/preinstall/prepare, setup.py cmdclass override, custom setuptools install class, or non-default pyproject build-backend). Anyone installing this package runs the hook. Confirm the hook is necessary and review its contents; prefer shipping a plain library without install-time execution.
Evidence
| 4 | "private": true, |
| 5 | "type": "module", |
| 6 | "scripts": { |
| 7 | "postinstall": "node scripts/postinstall.ts", |
| 8 | "bootstrap": "make bootstrap", |
| 9 | "codesandbox:build": "make build-no-bundle", |
| 10 | "build": "make build", |
Remediation
Prefer libraries that do not require install-time code execution: - Drop `postinstall`/`preinstall`/`prepare` scripts if the work can happen at runtime or build-time instead. - Ship pre-built native binaries rather than compiling via a custom `cmdclass` or `build_ext` override. - For Dockerfiles: replace `RUN curl … | sh` with a pinned download + checksum verification + explicit `RUN` of a named script. - If the hook is unavoidable, document exactly what it does so downstream reviewers
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 40 | -coverprofile=coverage.out -covermode=atomic ./... |
| 41 | |
| 42 | - name: Upload coverage to Coveralls |
| 43 | uses: coverallsapp/github-action@v2 |
| 44 | with: |
| 45 | file: coverage.out |
| 46 | format: golang |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 16 | release_created: ${{ steps.release.outputs.release_created }} |
| 17 | tag_name: ${{ steps.release.outputs.tag_name }} |
| 18 | steps: |
| 19 | - uses: googleapis/release-please-action@v4 |
| 20 | id: release |
| 21 | with: |
| 22 | config-file: release-please-config.json |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 117 | matrix: |
| 118 | os: [ubuntu-latest, macos-latest] |
| 119 | steps: |
| 120 | - uses: actions/checkout@v4 |
| 121 | |
| 122 | - uses: actions/setup-go@v5 |
| 123 | with: |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 78 | steps: |
| 79 | - uses: actions/checkout@v4 |
| 80 | |
| 81 | - uses: actions/setup-go@v5 |
| 82 | with: |
| 83 | go-version: '1.26' |
| 84 | cache: true |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 54 | id-token: write |
| 55 | steps: |
| 56 | - uses: actions/checkout@v4 |
| 57 | - uses: actions/setup-node@v4 |
| 58 | with: |
| 59 | node-version: 22 |
| 60 | registry-url: 'https://registry.npmjs.org' |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 61 | cache: false |
| 62 | |
| 63 | - name: golangci-lint |
| 64 | uses: golangci/golangci-lint-action@v8 |
| 65 | with: |
| 66 | version: latest |
| 67 | args: --build-tags=fts5 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 31 | needs: release-please |
| 32 | if: ${{ needs.release-please.outputs.release_created == 'true' }} |
| 33 | steps: |
| 34 | - uses: actions/checkout@v4 |
| 35 | with: |
| 36 | fetch-depth: 0 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 149 | steps: |
| 150 | - uses: actions/checkout@v4 |
| 151 | |
| 152 | - uses: actions/setup-go@v5 |
| 153 | with: |
| 154 | go-version: '1.26' |
| 155 | cache: true |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 76 | ports: |
| 77 | - 11434:11434 |
| 78 | steps: |
| 79 | - uses: actions/checkout@v4 |
| 80 | |
| 81 | - uses: actions/setup-go@v5 |
| 82 | with: |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 21 | cache: true |
| 22 | |
| 23 | - name: Setup ccache |
| 24 | uses: hendrikmuhs/ccache-action@v1.2 |
| 25 | with: |
| 26 | key: ${{ runner.os }}-go-cgo |
| 27 | max-size: 500M |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 53 | contents: read |
| 54 | id-token: write |
| 55 | steps: |
| 56 | - uses: actions/checkout@v4 |
| 57 | - uses: actions/setup-node@v4 |
| 58 | with: |
| 59 | node-version: 22 |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 119 | steps: |
| 120 | - uses: actions/checkout@v4 |
| 121 | |
| 122 | - uses: actions/setup-go@v5 |
| 123 | with: |
| 124 | go-version: '1.26' |
| 125 | cache: true |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 15 | steps: |
| 16 | - uses: actions/checkout@v4 |
| 17 | |
| 18 | - uses: actions/setup-go@v5 |
| 19 | with: |
| 20 | go-version: '1.26' |
| 21 | cache: true |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 53 | runs-on: ubuntu-latest |
| 54 | if: github.actor != 'release-please[bot]' |
| 55 | steps: |
| 56 | - uses: actions/checkout@v4 |
| 57 | |
| 58 | - uses: actions/setup-go@v5 |
| 59 | with: |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 55 | steps: |
| 56 | - uses: actions/checkout@v4 |
| 57 | |
| 58 | - uses: actions/setup-go@v5 |
| 59 | with: |
| 60 | go-version: '1.26' |
| 61 | cache: false |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 13 | if: github.actor != 'release-please[bot]' |
| 14 | timeout-minutes: 30 |
| 15 | steps: |
| 16 | - uses: actions/checkout@v4 |
| 17 | |
| 18 | - uses: actions/setup-go@v5 |
| 19 | with: |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
GitHub Actions `uses:` reference is not pinned to a 40-character commit SHA. Tags (`@v4`) and branches (`@main`) are mutable — a compromised maintainer or a tag rewrite can substitute malicious code into your CI pipeline silently. Pin to a SHA: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab`. For readability, include the version as a trailing comment: `# v4.1.1`. Tools like `pinact` / `ratchet` automate this. Allowed unpinned forms (excluded by the rule): - Local actions `.
Evidence
| 147 | matrix: |
| 148 | os: [ubuntu-latest, macos-latest, windows-latest] |
| 149 | steps: |
| 150 | - uses: actions/checkout@v4 |
| 151 | |
| 152 | - uses: actions/setup-go@v5 |
| 153 | with: |
Remediation
Pin every `uses:` to a 40-character commit SHA. Trailing comment with the version helps reviewers: `uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v4.1.1` Automate the migration with `pinact` (https://github.com/suzuki-shunsuke/pinact) or `ratchet` (https://github.com/sethvargo/ratchet). Add a `pinact run --check` pre-commit hook so future PRs stay pinned. Re-pin when the action releases a new version — Dependabot can do this automatically with `version-update-strategy: inc
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 159 | ) |
| 160 | if "charset" in self.content_params: |
| 161 | try: |
| 162 | codecs.lookup(self.content_params["charset"]) |
| 163 | except LookupError: |
| 164 | pass |
| 165 | else: |
| 166 | self.encoding = self.content_params["charset"] |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 2811 | # to all. |
| 2812 | model = instances[0].__class__ |
| 2813 | try: |
| 2814 | model._meta.get_field(to_attr) |
| 2815 | except exceptions.FieldDoesNotExist: |
| 2816 | pass |
| 2817 | else: |
| 2818 | msg = "to_attr={} conflicts with a field on the {} model." |
| 2819 | raise ValueError(msg.format(to_attr, model.__name__)) |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 154 | continue |
| 155 | rel_obj_id = rel_getter(obj) |
| 156 | try: |
| 157 | rel_obj = rel_objs[rel_obj_id] |
| 158 | except KeyError: |
| 159 | pass # May happen in qs1 | qs2 scenarios. |
| 160 | else: |
| 161 | setattr(obj, field.name, rel_obj) |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 309 | ) |
| 310 | else: |
| 311 | try: |
| 312 | user = await UserModel._default_manager.aget_by_natural_key(username) |
| 313 | except UserModel.DoesNotExist: |
| 314 | pass |
| 315 | user = await self.aconfigure_user(request, user, created=created) |
| 316 | return user if self.user_can_authenticate(user) else None |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 135 | } |
| 136 | } finally { |
| 137 | $env:PATH = $origPath |
| 138 | if ($proc -and -not $proc.HasExited) { try { $proc.Kill() } catch {} } |
| 139 | Remove-Item -Recurse -Force $TmpRoot, $FakeCurlDir, $MockBinDir -ErrorAction SilentlyContinue |
| 140 | } |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 1094 | sorts.append("rule") |
| 1095 | |
| 1096 | try: |
| 1097 | rows.sort(key=itemgetter(sorts.index(sort))) |
| 1098 | except ValueError: |
| 1099 | pass |
| 1100 | |
| 1101 | rows.insert(0, headers) |
| 1102 | widths = [max(len(row[i]) for row in rows) for i in range(len(headers))] |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 89 | _platformLocale = nlsConfig.osLocale; |
| 90 | _language = nlsConfig.resolvedLanguage || LANGUAGE_DEFAULT; |
| 91 | _translationsConfigFile = nlsConfig.languagePack?.translationsConfigFile; |
| 92 | } catch (e) { |
| 93 | } |
| 94 | } |
| 95 | _isNative = true; |
| 96 | } |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 407 | content = b"".join(self.make_bytes(chunk) for chunk in value) |
| 408 | if hasattr(value, "close"): |
| 409 | try: |
| 410 | value.close() |
| 411 | except Exception: |
| 412 | pass |
| 413 | else: |
| 414 | content = self.make_bytes(value) |
| 415 | # Create a list of properly encoded bytestrings to support write(). |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 286 | ) |
| 287 | else: |
| 288 | try: |
| 289 | user = UserModel._default_manager.get_by_natural_key(username) |
| 290 | except UserModel.DoesNotExist: |
| 291 | pass |
| 292 | user = self.configure_user(request, user, created=created) |
| 293 | return user if self.user_can_authenticate(user) else None |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 2422 | for query_name, model_name in self.translations.items(): |
| 2423 | # Ignore translations for nonexistent column names |
| 2424 | try: |
| 2425 | index = columns.index(query_name) |
| 2426 | except ValueError: |
| 2427 | pass |
| 2428 | else: |
| 2429 | columns[index] = model_name |
| 2430 | return columns |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 1032 | if interactive_hook is not None: |
| 1033 | try: |
| 1034 | import readline |
| 1035 | from rlcompleter import Completer |
| 1036 | except ImportError: |
| 1037 | pass |
| 1038 | else: |
| 1039 | # rlcompleter uses __main__.__dict__ by default, which is |
| 1040 | # flask.__main__. Use the shell context instead. |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 100 | # so swallow the broken-pipe exception and let the exit-code check |
| 101 | # below produce the real diagnostic. |
| 102 | try { $proc.StandardInput.WriteLine($initReq) } catch { } |
| 103 | try { $proc.StandardInput.Close() } catch { } |
| 104 | |
| 105 | $stdout = $proc.StandardOutput.ReadToEnd() |
| 106 | $stderr = $proc.StandardError.ReadToEnd() |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 1015 | return self.create(**params), True |
| 1016 | except IntegrityError: |
| 1017 | try: |
| 1018 | return self.get(**kwargs), False |
| 1019 | except self.model.DoesNotExist: |
| 1020 | pass |
| 1021 | raise |
| 1022 | |
| 1023 | get_or_create.alters_data = True |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 332 | def close(self): |
| 333 | for closer in self._resource_closers: |
| 334 | try: |
| 335 | closer() |
| 336 | except Exception: |
| 337 | pass |
| 338 | # Free resources that were still referenced. |
| 339 | self._resource_closers.clear() |
| 340 | self.closed = True |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.
Silent error swallowing detected. An except clause that does pass or ... discards the exception with no log, no metric, and no trace. This blinds incident response and hides real failures.
Evidence
| 99 | # closed by the time we try to write — that IS the #125 symptom, |
| 100 | # so swallow the broken-pipe exception and let the exit-code check |
| 101 | # below produce the real diagnostic. |
| 102 | try { $proc.StandardInput.WriteLine($initReq) } catch { } |
| 103 | try { $proc.StandardInput.Close() } catch { } |
| 104 | |
| 105 | $stdout = $proc.StandardOutput.ReadToEnd() |
Remediation
Log the exception at minimum (`logger.exception(e)`), emit a metric, or re-raise if the error is not recoverable. If you genuinely want to ignore an exception, say so with a comment.