Repository navigation
Releases
v3.8.0
Added
leak rotate azure-devops-patrotates an Azure DevOps personal access token in the order that avoids downtime.checklists your active tokens; with--authorization-id, it shows the leaked one. It points at the audit events that show whether Azure DevOps has already revoked it.replacecreates a new token with the same scope, for one organisation only, and pipes it straight into your secret store. If the store refuses it, the new token is revoked again.- Once the new token is deployed,
revokeremoves the leaked one. - It signs in as the user from
az login, and the token travels in a header on stdin, never in a command line. Theleak plancatalog points Azure DevOps token findings at the recipe.
Fixed
Found by a second independent review, of the code added in 3.6 and 3.7:
leak responddid not rebuild the incident report when an earlier step ran again. For example, after scanning a clone of a repository that was already gone, the report still said there were no secrets. A step now also reruns when a step whose results it uses has run again: a new scan means a new plan and report, a new hunt a new report.leak respondstopped with a usage error, and no record, when the hunt could not start. It now reads the hunt's folder from the hunt's own output, and a hunt that cannot start is recorded as failed.leak respond --statuswrote to the incident's state file. It now changes nothing. Settings are recorded only when they change.leak respondwith an unusable folder name as the incident ID created the folder before refusing it, which blocked the retry. The ID is now checked first.- For a repository that is already deleted,
leak huntreported its fork list as "not checked", so the hunt, and the incident, could never be complete. That check is covered by the same-name forks search, and is now reported as "covered below". install.shinstalled the version folder as readable by its owner only, so on a shared prefix (sudo ... --prefix /usr/local) nobody else could runleak. It is now readable by everyone.
Found by an accessibility audit (axe-core, WCAG 2.1 AA) of every page of the site and every generated report:
- Code blocks and tables that scroll sideways could not be reached with the keyboard on first load, because the check ran before the web fonts had loaded. It now runs again once they have.
- The how-to box of the incident report and the rotation plan was outside every landmark, so screen reader users moving by landmark missed it. It is now a labelled aside.
v3.7.1
Added
- The README shows the last screen of
leak respond, rendered from a real run.
Changed
leak respondnames what the hunt found (for example "Repository on GitHub"), and keeps its lines short enough for a normal terminal.
Fixed
leak respondrecorded a hunt that found something as complete even when some sources could not be checked.leak huntexits 1 in that case, sorespondnow counts the unchecked sources itself and marks the hunt incomplete, with what to do.leak huntlisted the leaked repository among the owner's "other" public repositories, and marked an owner with none as "review: 0". It now lists only the others, and none is clean.- A clean
leak scanin 3.7.0 said "No secrets found in every commit"; it says "in any commit" again. - Terminal images: status marks (✔ ✘) no longer push the rest of their line out of column.
v3.7.0
Added
leak respond <owner>/<repo>runs the first hour of an incident in order, in one incident folder: evidence snapshot, full-history scan, rotation plan, copy hunt and incident report.- Every step is written to
timeline.mdwith its UTC time, and its full output tologs/. - Rotating, the takedown and telling people stay with you. It says what to do for each one, and
--done rotate(ortakedown,notify) records the time you finished. - Run it again with
--dirto continue where it stopped.--redo huntrepeats the hunt a week later, as the runbook asks, and--statusshows where the incident stands. - It only reads, like the steps it runs. The folder gets a
.gitignorebecause the evidence holds the leaked code.
- Every step is written to
- Fast pull request scans.
leak scan --commits BASE..HEADscans only the commits in a range.- The GitHub Action's new
scope: changesinput scans only the commits a pull request or push adds, in seconds on a large repository. - If that range is not in the checkout (a branch's first push, or a shallow clone), the Action scans the full history and says so, so nothing is skipped silently.
scope: historystays the default.
v3.6.1
Added
- Homebrew:
brew install aboutbilal/tap/spillkiton macOS and Linux, from the new aboutBilal/homebrew-tap. It brings gitleaks and jq, plus a current bash on macOS. A daily workflow moves the formula to each new release only after it has checked the archive's checksum and Sigstore signature, and has installed and tested the formula.
Changed
leak doctorandinstall.shpoint macOS users with an old bash at the Homebrew formula, which brings a current bash with it.- SECURITY.md says how the Homebrew formula is verified before it moves to a new release.
Fixed
leak auditdid not count Spillkit's ownleak-guardpre-commit hook, or the Spillkit GitHub Action, as secret scanning. A repository protected by Spillkit itself lost 25 points.- On phones, the copy button on the home page's install commands covered the first line of code.
v3.6.0
Added
leak rotate gitlab-tokenhandles GitLab personal, project and group access tokens, on gitlab.com or a self-managed instance (GITLAB_URL).checkshows the token's scopes, last use (with IP addresses) and expiry. Without--token-idit lists the active tokens, so you can find the leaked one.rotatehas GitLab revoke the leaked token and issue its replacement in one call, piped straight into your secret store. Because a revoked token cannot be brought back, the store is checked first. The new token gets 90 days instead of GitLab's one-week default (--expiresto change it). If the store still refuses the new token, it is revoked too.revokeis for when you made and deployed a replacement yourself.GITLAB_TOKENis sent in a header on stdin, never in a command line. Theleak plancatalog pointsgitlab-patfindings at the recipe.
- The GitHub Action's scan mode ends with what to rotate first. When secrets are found, the job summary lists them most dangerous first, with where each is revoked, the
leak rotaterecipe and the guide section. Files and commits are left out of the summary, because the job summaries of public repositories are public. The full plan is at the newplanoutput. leak planalso writesrotation-plan.json, the same items for automation.- CI runs the Action on a leak built by
leak demo, so the plan in the summary is tested on every change.
Changed
- A new AWS access key is stored in Secrets Manager without a trailing newline.
Fixed
- The GitHub Action stopped as soon as a scan, audit, audit-org or hunt had findings. GitHub runs Action scripts with
bash -e, so the first non-zero exit ended the step. That left no job summary, no outputs and no Slack, Teams or Discord alert, and it ignoredfail-on-findings: false. Every exit code is now handled by the script itself. The new CI step that runs the Action on a leak found this.
Found by an independent review of the 3.5 code:
install.shwith a relative--prefixmade aleaklink that led nowhere, yet reported success. The prefix is now made absolute, and the link is checked.- Reinstalling a version deleted the working copy before unpacking the new one, so a failed unpack left nothing. The new version is now unpacked beside the old one and swapped in only when complete.
leak demostopped at its first step for anyone using Spillkit's ignore file or pre-commit hook globally, because they rightly blocked the planted secrets. It now commits past both, in its own throwaway repository only.leak democould also stop at random on Alpine, because a pipe closed early underpipefail. A demo that stops now removes its folder, so it can simply be run again.leak planlisted Amazon Bedrock API keys as AWS access keys and pointed them atleak rotate aws-key. They now have their own entry (billing attached, no recipe), with where to revoke them.leak audit-org --gitlabalso graded projects shared into the group by other groups. It now lists only the group's own projects.leak rotate:--storewithout a target (--store aws-sm) wrote to a secret named after the store type. It is now refused, as are targets that start with-.- The
checkstep used the wrong project for App Engine and Compute Engine default service accounts. - Tracing (
bash -x) is switched off, because it would print the new secret.
Removed
- The old container package
ghcr.io/aboutbilal/leak-response-toolkit(images 2.1.0 to 3.2.0, from before the rename). Useghcr.io/aboutbilal/spillkit, which has every release since 3.3.0.
v3.5.2
Changed
- The GitHub Action's description is shorter (115 characters), so it fits a GitHub Marketplace listing.
v3.5.1
Added
- SLSA build provenance on every release for the source archive and the install script, attached as
spillkit-vX.Y.Z.intoto.jsonland verifiable withgh attestation verify spillkit-vX.Y.Z.tar.gz --repo aboutBilal/spillkit.
Fixed
install.shrefused to install when cosign 2 was installed, because releases use the newer Sigstore bundle format. It now passes--new-bundle-formatto cosign 2.4 and later, and says when cosign is too old.leak auditin CI (and the GitHub Action inauditmode) no longer reports "no pre-commit hook installed in this clone": a CI checkout never has one, so the finding was noise in code scanning. Developer clones are still checked.
v3.5.0
From finding secrets to getting them rotated, and from hearing about Spillkit to seeing it work.
Added
leak planturns a scan report into a rotation checklist, most dangerous first: anything that can create resources or read data, then anything with billing attached, then anything that grants further access, then the rest, oldest first within each. Every item says where the secret is revoked, links to its section of the rotation guide and names theleak rotaterecipe where one exists. An unidentified secret right next to a known one (an AWS secret key under its key ID) is kept as its own item but rotated with its pair. Output:rotation-plan.mdwith checkboxes for the incident issue and a print-readyrotation-plan.htmlwith a TLP label. The order comes fromscripts/secret-types.txt, a catalog of gitleaks rules that a test keeps in step with the guide.leak rotaterotates an AWS access key, an Entra ID app registration secret, a Google Cloud service account key or an Azure storage account key, one step at a time: check, replace, disable, delete (renew for storage keys). Without--applyit is a dry run that prints every step with its exact command. The new secret goes from the provider's CLI straight into AWS Secrets Manager, Azure Key Vault or Google Secret Manager (--store) through a pipe: never shown, never written to disk, never in a command line; if the store refuses it, the new credential is deleted again. Disabling and deleting ask for the key ID first. Every applied step is logged with its UTC time inrotation-log.tsv.leak demobuilds a repository with a leak made for the purpose (random keys that work nowhere) and runs audit, scan, plan and a rotation dry run on it, in about a minute.- One-line install:
curl -fsSL https://github.com/aboutBilal/spillkit/releases/latest/download/install.sh | bash. It checks the release's SHA-256 and, when cosign is installed, its Sigstore signature (--require-signaturemakes that mandatory), installs under~/.localwithout root, and runs on the bash 3.2 that macOS ships. Releases now carryinstall.shand its signature. - GitLab groups in
leak audit-org:--gitlab <group>, including subgroups, withGITLAB_TOKEN(read_api) for private projects andGITLAB_URLfor self-managed GitLab. Forks and archived projects are skipped.
Changed
leak scanandleak auditnow point toleak planas the next step;leak doctoralso reports the cloud CLIsleak rotateuses and cosign.- The runbook, cheat sheet, rotation guide, README and home page show the new commands. 51 tests, up from 41.
v3.4.0
Added
leak audit --sarif FILEwrites the audit findings as SARIF 2.1.0 for GitHub code scanning. Each finding points at the file it concerns (the tracked secret file, the code that reads environment variables, the exact Dockerfile line, the first commit with a secret) and carries a severity, so critical findings rank as High. The GitHub Action passessarif-filethrough inauditmode too.- Bitbucket Cloud and Azure DevOps in
leak audit-org:--bitbucket <workspace>(withBITBUCKET_TOKEN, an access token) and--azure-devops <org>[/<project>](withAZURE_DEVOPS_PAT). Forks and disabled repositories are skipped, and a listing error exits4instead of reporting an empty organisation as clean. As everywhere else, tokens reachcurlandgiton standard input or through the environment, never as command-line arguments.
v3.3.0
Changed
-
Reports rebuilt as standard incident documents.
leak reportnow follows the structure of NIST SP 800-61r3: document control (incident ID, severity, version, author, approver, distribution), a bottom-line summary with the decisions needed, incident details, a UTC timeline filled in from the tool runs, the investigation, secrets to rotate, impact, a notification assessment (for example GDPR Articles 33 and 34), actions with owners and due dates, root cause, and appendices for evidence checksums, method and limitations, a severity scale and document history. Every page carries a FIRST TLP 2.0 handling label, the incident ID and "Page X of Y" when printed. New options:--id,--tlpand--blank. The default file name is nowincident-report.html, and the hand-fill template istemplates/incident-report.html. -
The organisation dashboard (
leak audit-org) uses the same document style: colours follow the data, every finding is labelled Critical or Fix with its remedy, and a method section states the weights and grade thresholds. New option:--tlp. -
Renamed to Spillkit. The project is now Spillkit: the emergency kit you keep ready for leaked secrets. The command is still
leak. The repository moves toaboutBilal/spillkit(GitHub redirects the old address), the container image toghcr.io/aboutbilal/spillkit(images for 3.2.0 and earlier stay atghcr.io/aboutbilal/leak-response-toolkit), and the documentation toaboutbilal.github.io/spillkit. Updateuses:lines and pre-commitrepo:entries to the new name. -
New logo: an emergency case with a key, in place of the shield.
Added
- Redesigned documentation site and home page. The home page is built around one idea: a leaked key can be in use within five minutes. A clock starts when the page opens and a stopwatch fills toward five minutes in real time, next to the product's own output, four verified numbers, illustrated stages, a map of where copies survive, product screenshots, the first-15-minutes plan, release verification and installation. The documentation has light and dark themes with a switch, IBM Plex Sans, dark code blocks with copy buttons, callouts with icons, heading links, an "On this page" rail, a mobile drawer, print styles for runbooks, and a 404 page.
- Documentation search. Press
Ctrl K,⌘Kor/on any page to search every runbook, guide and template by section. - Site checks in CI.
tools/check-site.pychecks every internal link and anchor, page titles, descriptions, headings, image alt text and the search index on every pull request, before anything is deployed.
Fixed
-
Documentation site: links in the README's HTML header pointed at
.mdfiles and returned 404 on the site; the Overview and Incident checklist pages had no main heading. -
Documentation site: the home page no longer overflows on phones (grid columns shrink; long command lines scroll inside their box).
-
The test suite no longer needs GNU
timeout, which macOS does not have; hangs are caught by bats' own per-test limit (BATS_TEST_TIMEOUT) on every platform.