[v2.0.0]
- Added Kingfisher-side typed validation for Betterleaks'
generic-credential-urirule without
changing its detector: PostgreSQL, MySQL/MariaDB, and MongoDB URI captures now use the
corresponding live validator and feed validated credentials into blast-radius mapping, while
unsupported URI schemes remain detected with validation not attempted. JDBC strings containing
a credential-bearing PostgreSQL/MySQL URI are handled through that inner URI, and direct
CredentialUrivalidation also dispatches supportedjdbc:inputs. - Removed the Veles Paystack, PyPI, and Square OAuth application-secret adapters. PyPI upload-token and Square access-token detection remain covered by Betterleaks; Paystack and Square OAuth application-secret built-in coverage are no longer included.
- Security: the MongoDB, MySQL, Postgres, and JDBC validators now enforce the same SSRF gate as the HTTP/gRPC/JWT validators. Previously they only rejected loopback/unspecified hosts, so a crafted connection string in scanned content could make Kingfisher open TCP connections to RFC1918, link-local (including
169.254.169.254), CGNAT, and other non-public addresses, turning the scan report into an internal-network reachability oracle. Every host in a Postgres multi-host URL and every MongoDB seed — including hosts resolved viamongodb+srv://SRV records — is now checked, and blocked targets report a constant message instead of the driver's connection error. Use--allow-internal-ipsto opt back in. - Breaking (library):
validate_mongodb,validate_mysql,validate_postgres, andvalidate_jdbctake an additionalallow_internal_ips: boolargument. - Restored per-rule
tls_modefor built-in rules. The imported-rule capability overlay now acceptstls_mode: strict | lax | off, andbetterleaks.mongodb-connection-stringandbetterleaks.jwtdeclarelaxso self-managed clusters and self-hosted IdPs presenting private-CA or self-signed certificates validate again. This remains opt-in on both sides: it takes effect only when the operator also runs--tls-mode lax(or--tls-mode off). The build rejects an unknowntls_modevalue, or atls_modeon a rule with no validator. - Kingfisher 1.x rule selectors keep working.
--rule,--exclude-rule, andrules.disabledentries namingkingfisher.*IDs now resolve to their 2.x replacements through a new alias table, with a one-time deprecation warning naming the selector to migrate to, instead of failing the scan. Exactkingfisher.*IDs still win when the 1.x catalog is loaded via--rules-path, and an unknownkingfisher.*selector is still an error. - Added a rule-coverage drift guard.
crates/kingfisher-rules/data/legacy-rule-aliases.ymlmaps
migrated Kingfisher 1.x families with known 2.x replacements, and a test asserts each alias target
still resolves against the built-in catalog, so an upstream release that drops a replacement fails
the build instead of silently breaking that compatibility path. - Restored scan-time access mapping for validated Veles rules (Slack app-level/config tokens, DigitalOcean, SendGrid), which previously reached the rule-ID dispatch and matched nothing.
- Breaking: moved the candidate detector catalog to the Betterleaks rule format, with selected
Veles detectors filling gaps, giving the community a well-designed shared format and a common
place to develop generally useful rules. - Kingfisher now fetches and parses the Betterleaks catalog and selected Veles source files at build
time; the Kingfisher 1.x YAML custom-rule format remains supported for custom rules. - Preserved Kingfisher's engine capabilities around validation, blast-radius mapping, and credential revocation while allowing us to focus investment on scan performance, integrations, and analysis workflows.
- All rules now use Vectorscan candidate detection, eliminating unconditional whole-blob regex fallbacks for Betterleaks' large generic credential patterns; Betterleaks path and finding-filter regex helpers are also compiled once with Vectorscan instead of being rebuilt per path or finding.