[v1.99.0]
- Fixed #371:
pip install kingfisher-binon glibc Linux distros (Ubuntu, Debian, RHEL, Fedora, …) installed a macOS Mach-O binary and failed withOSError: [Errno 8] Exec format error. Linux wheels are now taggedmanylinux_2_17_<arch>.musllinux_1_2_<arch>(instead ofmusllinux_1_2_<arch>only), so pip accepts them on both glibc-2.17+ and musl distros. Thepypi/hatch_build.pyhook now hard-fails whenKINGFISHER_PYPI_WHEEL_TAGis unset, and the publish workflow refuses to upload anypy3-none-any.whl, so the v1.92.0-era pure-Python wheel cannot recur. --self-update(alias--update) on a scan or other command now re-execs into the freshly installed binary so the current invocation completes with the new code and the latest detection rules. Previously the on-disk binary was replaced but the running process kept using the old in-memory version, requiring a second invocation to pick up the changes. On Unix this is a trueexec()(same PID); on Windows the new binary is spawned and the parent exits with its status code. The explicitkingfisher self-updatesubcommand still updates and exits without re-execing. Self-update now also covers Windows arm64 (the asset was already published; the runtime cfg map gained the missing arm). Seedocs/ADVANCED.md→ Update Checks.--include-contributorsnow respects--github-repo-typewhen enumerating contributor-owned repositories: by default contributor forks are excluded (matching the existingSourcedefault), previously they were always included regardless of the flag. Added a new--github-repo-type alloption to opt into the prior behavior of scanning both source and fork repos for contributors, organizations, and users.- Access Map: Pinecone API keys (validated
kingfisher.pinecone.1): caller resources viaGET /indexes(with serverless cloud/region or pod environment metadata, deletion-protection state) andGET /collections; standalonekingfisher access-map pinecone(aliaspinecone.io). - Added
--blast-radiusas an alias for--access-maponkingfisher scan, andkingfisher blast-radius <provider>as an alias for thekingfisher access-map <provider>subcommand, so the user-facing "blast radius" concept matches the CLI invocation. - Webhook alerting — Discord, Mattermost, and Google Chat targets:
--alert-formatnow acceptsdiscord(color-coded embeds),mattermost(Slack-compatible attachments), andgooglechat(cardsV2cards). Discord and Google Chat URLs are auto-inferred from the webhook host; Mattermost requires--alert-format mattermostsince it is always self-hosted. All five chat targets (Slack, Teams, Discord, Mattermost, Google Chat) plus the Generic JSON sink can be combined in a single run via repeated--alert-webhookflags oralerts.webhooksentries inkingfisher.yaml. - Webhook alerting —
--alert-detailmode: new--alert-detail auto|summary|detailflag controls per-finding verbosity.auto(default) renders inline findings for ≤ 25 filtered results and drops to a summary card for larger scans so high-volume runs do not flood the channel.summaryalways suppresses per-finding blocks;detailalways renders them. Per-webhook overrides are available viadetail:inkingfisher.yaml. - Webhook alerting —
--alert-report-urlpivot link: pass a CI run URL (or setKINGFISHER_ALERT_REPORT_URL) to embed a one-click "Full report →" link in every chat payload. In GitHub Actions, pair withgithub.server_url/${{ github.repository }}/actions/runs/${{ github.run_id }}to land the responder directly in the SARIF view for that run. - Webhook alerting — fingerprints in chat payloads: every finding rendered in detail mode now includes its stable
fingerprintID (e.g.fp:1635470773610661884), matching the value emitted in JSON/JSONL/SARIF/baseline outputs. SOAR playbooks and SIEM rules can use these IDs to dedupe across runs without a separate correlation step. - Webhook alerting — scan target in all alert modes: the "Target" line in chat payloads now correctly reflects the actual scan target for all input modes (GitHub org/user, GitLab group, Bitbucket workspace, S3/GCS bucket, Docker image, Jira/Confluence, Slack, Teams, Postman, etc.), not just local path scans.
kingfisher.yamlreaches near-CLI parity: scalar overrides for--confidence,--redact,--format,--baseline-file,--tls-mode, validation tuning (timeout / retries / rps / per-rule rps), filters (--max-file-size,--no-binary,--extraction-depth,--skip-aws-account*), output (--output), git options (--git-clone-dir,--keep-clones,--repo-clone-limit,--include-contributors),alerts.defaults.*, and global flags (--allow-internal-ips,--no-update-check,--user-agent-suffix,--endpoint). Precedence isCLI > env > config > built-in default(clapValueSourcedecides per-flag); list-typed values stay additive. Scan-target inputs (paths,--git-url, provider user/org/bucket flags) remain CLI-only by design. The config is loaded only when--config FILEis passed explicitly — there is no auto-discovery, so scan results never depend on which directory the binary was launched from. Seedocs/CONFIG.md.kingfisher config initsubcommand: convert an existingkingfisher scan ...invocation into a reusablekingfisher.yamlby replacingscanwithconfig init(e.g.kingfisher config init --confidence high --redact --exclude vendor/ > kingfisher.yaml). Only flags the user actually supplied appear in the output — clap defaults are stripped — and scan-target inputs are dropped. Writes to stdout by default, or to--out FILE(with--forceto overwrite).- Access Map UI redesign in the report viewer: identities are now grouped into collapsible per-provider sections (admin-bearing providers first); permissions are classified by severity (admin / privilege escalation / risky / read-only) with color-coded badges and rollup chips on each card header; the expanded card body renders permissions once per group with a "These permissions apply to all N resources above" banner instead of repeating the same 50+ badges per resource; duplicate-named identities (e.g., multiple MongoDB
admintokens) now display a discriminator subtitle (identity_id · access_type) so they're tellable apart; new "Critical only" toolbar toggle (persisted inlocalStorage) hides read-only permissions and zero-risk identities; the stats bar gained an admin-permission count. Imported TruffleHog/Gitleaks reports keep the previous flat rendering as a backwards-compatible fallback. Underlying JSON now includespermissions_by_severityand anidentity.contextdiscriminator on eachAccessMapEntry.