v0.0.158
Released Nov 1, 2026
Release Notes
security/leaked-secrets is sharper in both directions: it stops reporting documentation samples, placeholders, catalogue values and sample data tables as credentials, names more providers (Cerebras, OpenRouter, NVIDIA, Fireworks, Shopify Admin, Stripe restricted keys, Google OAuth client secrets), and classifies Shopify, Netlify and signed-URL tokens and browser SDK keys instead of calling them generic leaks. A percent-encoded Twitter bearer token is found again, and the crawler throttle spacing test no longer fails under load. Thanks to William for the throttle test fix (#1516, #1519).
Fixed
security/leaked-secretsno longer reports documentation samples, placeholders and binary payloads as credentials. jwt.io's default sample token (when its signature verifies under a published sample secret), a-----BEGIN ... PRIVATE KEY-----header with no key body after it, a connection string with a documentation password onlocalhostor one whose password is a template placeholder (${user},{{ pass }},%s), Stripe's published sample key, a hashed asset name such asneon_<hash>.png, a Dominican Republic IBAN and a run ofAinside a base64 image, font or wasm payload are not reported. A real-shaped key in the same place still is: a PEM block with a body, a random password on a local host, any othersk_test_key.example-passwordand similar are placeholders. Paystack'ssk_live_keys (40 hex) are labelled Paystack instead of Stripe, and ansk_live_key with a hex tail that is not Stripe's, such as a chat widget'sdata-deployment-key, reports as an unknown-provider key with a widget hint.changemestays reportable on purpose. See leaked-secrets. (#1283, #1227)security/leaked-secretstreats Shopify wallet and Shop sessions tokens, the Netlify web vitals token and anyapiKeyorapi-keyassignment onapps.shopify.com(Shopify's own site, in markup or script) as public by design. Each needs positive evidence: the token's own claims, the attribute it sits in, or the Shopify sessions URL beside it. AnapiKeyin a Shopify platform bundle (cdn.shopify.com/shopifycloud/, or/cdn/shopifycloud/on a*.myshopify.comhost) is not reported; secrets, tokens and provider keys in the same bundle still are. A key namedsearch_api_keystill reports at medium, with a hint that the name suggests a search-only key, because an admin key under that name reads the same. A role, an extra claim, an unsigned token or an issuer host alone never makes a token public. See leaked-secrets. (#1287, #1229)security/leaked-secretsnames more providers and labelssbp_correctly. Cerebrascsk-keys, which were missed even beside reported Groq keys, now report. New named patterns: OpenRouter (sk-or-v1-), NVIDIA (nvapi-), Fireworks AI (fw_), Stripe restricted keys (rk_live_), Shopify Admin tokens (shpat_,shpss_,shpca_,shppa_) and Google OAuth client secrets (GOCSPX-).sbp_is a Supabase personal access token, no longer labelled "Service Role Key": it is account-wide, so revoke it in the account settings. A JWT issued by a Hygraph host is labelled as a Hygraph management or content token. Server-side classes are critical in a browser script (Shopify Admin,sbp_, Google OAuth secrets and Stripe restricted keys); OpenRouter, Cerebras and NVIDIA keys stay high and Fireworks medium. Afw_camelCase identifier and a Shopify token shape that is a file name or a CSS class (/files/shpat_<hash>.png,.shpca_<hash>) are not reported. See leaked-secrets. (#1309)security/leaked-secretsstops reporting values that cannot be credentials and credentials that are sample data. A genericpassword:orsecret:assignment no longer reports credential names written as lower-case words joined by_,:or.(app_secret_v6,authentication_secret_v6); random words with none of a credential word (a whole word:monkeyandauthordo not count), and the value of aBearerorBasicheader, still report, a css-loader class (the whole<file>__<local>___<hash>value), a URL or path with no credential in it, an environment-variable reference, a short elided or masked value, or a span of up to 64 characters that is code (a bare&&or||, a one-letter member call and a long password are not code). A password in a table of three or more same-shaped records with a reserved-domain email in every row that carries it, and a puzzle or generator object with two of its markers, are sample data and are not reported; the same table with real-domain emails stays, asPossible Demo Login (seed data table). See leaked-secrets. (#1292, #1308)security/leaked-secretsclassifies signed-URL tokens and browser SDK keys instead of calling them generic leaks. A JWT in a?token=,?jwt=,?sig=orX-Amz-*URL parameter (57% of JWT flags in a 38k-site batch were Supabase storage signed URLs) that carries anexpand aurlclaim and no role or admin scope is labelledSigned URL Token (JWT)and reported at medium with its expiry (any other JWT there is an ordinary JWT). Keys in Bugsnag and Amplitude init calls,data-*-api-keyattributes on a third-party widget script and RevenueCat public SDK keys beside the SDK's name are public client keys. ANEXT_PUBLIC_,VITE_orPUBLIC_name, or apublic*orclient*Keyname, adds a hint but does not downgrade the finding. An AWS access key id with no 40-character secret-shaped value within 300 characters reports at medium instead of high (an id in one script and its secret in another is ranked below high: each script is read by itself). Aservice_rolekey, an admin-scope token and anysk_,rk_orsb_secret_value still report wherever they appear. See leaked-secrets. (#1293, #1294)
Update to this version
squirrelscan will auto-update, or run this command to update now: