Skip to content

Releases: blacklanternsecurity/badsecrets

1.2

Choose a tag to compare

@liquidsec liquidsec released this 19 Jun 12:27
f06138f

1.2.0

Major infrastructure overhaul and significant bug fixes for passive detection accuracy.

Breaking Changes

  • blacklist3r CLI tool removed — the standalone blacklist3r example script has been deprecated and deleted. Use the main badsecrets CLI instead.
  • httpxblasthttp — all HTTP client code migrated from httpx to blasthttp. If you import badsecrets and were relying on httpx transports or response objects, update accordingly.
  • poetryuv — build system migrated from poetry/poetry-dynamic-versioning to hatchling + uv. Use uv sync / uv run instead of poetry install / poetry run.
  • check_all_modules() now returns a list (matching carve_all_modules's shape), including IdentifyOnly hits alongside SecretFound results.
  • cookie_identify_only renamed to report_uncracked_cookies on module classes.

New Features

  • Docker support — added Dockerfile and .dockerignore (thanks @vortexau)
  • badsecrets.__version__ — version string now exposed at package level
  • IdentifyOnly results from cookies and manual product mode — cookies and the badsecrets <product> CLI path now fall back to identify() when check_secret() misses, surfacing recognizable crypto products with unknown keys (e.g. Laravel cookies)

Bug Fixes

  • Fix Python 3.13+ test failures: URL-unquote before slicing in PBKDF1/PBKDF2 crypt tests
  • Handle PyJWT 2.13.0 InvalidKeyError during JWT secret detection
  • Fix A-z character class typo in rack2, rails, and django identify regexes (was matching `[]^_`` characters)
  • Fix Telerik_HashKey.get_hashcat_commands: swapped variables and wrong encoding (was base64-decoding the HMAC message instead of hex-encoding raw bytes)
  • Guard Rack2.get_hashcat_commands against binascii.Error on malformed base64
  • Guard all IdentifyOnly get_hashcat_commands calls with _safe_hashcat wrapper to prevent malformed cookie values from crashing scans
  • Suppress cookie false positives from Shiro, PeopleSoft, LTPA, Flask, and Rails modules (broad base64 regexes were matching ordinary cookies like AWSALB)
  • Tighten identify_regex on loose-base64 modules; deduplicate IdentifyOnly results per module
  • Fix blasthttp body encoding: pass str not bytes

Dependency Updates

  • blasthttp (new) ≥ 0.8.0
  • pycryptodome ≥ 3.23.0
  • PyJWT ≥ 2.13.0
  • yara-python ≥ 4.5.4
  • idna 3.11 → 3.15
  • django ≥ 5.2.15
  • Various dev dependency bumps (pytest-cov, pytest-asyncio, pytest-mock, respx, dulwich)

Full Changelog: 1.1.0...1.2.0

1.0

1.0

Choose a tag to compare

@liquidsec liquidsec released this 20 Mar 19:36
3edc7cb

badsecrets 1.0.0 Changelog

New Modules

Active Module System

A new active module architecture that sends probes to live targets to detect default/known secrets server-side. Modules are organized into passive/ and active/ subdirectories.

  • GlobalProtect - Detects Palo Alto GlobalProtect portals using default master keys
  • Shiro RememberMe (active + passive) - Detects Apache Shiro instances using known encryption keys (1,122 known keys)
  • IBM LTPA Token (active + passive) - Detects IBM WebSphere servers using known LTPA keys (338 known key sets)

ASP.NET Resource Token

  • New ASPNET_Resource passive module for detecting known machine keys via WebResource.axd / ScriptResource.axd encrypted URL tokens

MAC_DISABLED ViewState Detection

  • Detect and report ASP.NET ViewStates with MAC validation disabled (a critical misconfiguration), including null-padded variants

New Features

  • YARA pre-filter for carve scanning - Massively speeds up body carving by using YARA rules to pre-screen HTML before running expensive crypto checks
  • Inline ViewState parser - Replaced the external viewstate library with a lightweight skip-only parser, removing a dependency and improving performance
  • --list-modules CLI flag - Lists all available modules (passive and active) in a formatted table
  • --custom-secrets CLI flag - Unified interface for passing custom secret material to any module
  • Auto-follow trailing-slash redirects in CLI URL mode
  • ViewStateUserKey support - Included in DOTNET 4.5 KDF purpose strings for proper key derivation
  • MobilePage ViewState detection - Fixed detection for pages without __VIEWSTATEGENERATOR
  • Per-module carve_locations scoping - Modules can now declare which parts of a response they want to carve from

Performance

  • YARA pre-filter skips expensive crypto checks when no relevant tokens are found in the response body
  • Deduplicated carve() logic and extracted reusable check_secret() helper
  • Inline ViewState parser avoids full deserialization overhead

Infrastructure / Tooling

  • Migrated HTTP client from requests/requests_mock to httpx/respx - Async-ready HTTP stack
  • Replaced Black + Flake8 with Ruff for linting and formatting
  • Expanded CI test matrix with broader Python version and ruff coverage
  • Python 3.13+ compatibility - Fixed argparse help text format change

Secret Wordlist Updates

  • New Rack secret keys including GitHub Enterprise hardcoded secret
  • New Play Framework secret keys added to JWT wordlist
  • New Strapi and common tutorial JWT secrets
  • New JSF viewstate passwords and ASP.NET machine keys

Bug Fixes

  • Fix ASPNET_Resource base64 crash on malformed input
  • Fix false positive in JSF viewstate DES3 detection (now requires 2+ java. matches)
  • Fix CodeQL regex security alerts
  • Fix MAC_DISABLED carve detection for null-padded ViewStates
  • Suppress JWT InsecureKeyLengthWarning noise

Dependency Updates

Django, cryptography, httpx, PyJWT, urllib3, certifi, charset-normalizer, and many others brought to current versions.

Acknowledgments

Thanks to @irsdl for crapsecrets, which inspired several additions in this release.

0.13

Choose a tag to compare

@liquidsec liquidsec released this 25 Sep 19:20
4540a4a
  • Major rewrite of telerik-knownkey standalone/example tool
  • Dependency version bumps
  • Small key updates

New Contributors

Full Changelog: v0.12.12...v0.13.47

v0.12.12

Choose a tag to compare

@liquidsec liquidsec released this 15 Aug 15:07
0f21077

What's Changed

v0.11.118

Choose a tag to compare

@liquidsec liquidsec released this 11 Aug 17:02
466150f

What's Changed

Full Changelog: v0.10.35...v0.11.118

v0.10.35

Choose a tag to compare

@liquidsec liquidsec released this 15 Apr 13:31
ddc5dc2

What's Changed

Full Changelog: v0.9.30...v0.10.35

v0.9.30

Choose a tag to compare

@liquidsec liquidsec released this 17 Feb 18:38
d9c9d68

What's Changed

Full Changelog: v0.8.25...v0.9.30

v0.8.25

Choose a tag to compare

@liquidsec liquidsec released this 14 Feb 19:43
f2880df

What's Changed

Full Changelog: v0.7.14...v0.8.25

Badsecrets 0.5

Choose a tag to compare

@liquidsec liquidsec released this 09 Oct 17:27
7489439
v0.5.509

Release v0.5.509