Releases: fevra-dev/GitExpose
Releases · fevra-dev/GitExpose
v0.5.1 — Supply-Chain Intelligence (hardening)
v0.5.1 — Supply-Chain Intelligence (hardening)
A hardening + correctness release on top of v0.5.0, including a focused /attack pass on the new OSV egress surface.
Fixed
- Verification request amplification — identical secrets gathered concurrently each fired a separate outbound auth request to the provider (the in-run dedup populated its cache only after the
await). Now collapses to a single request per distinct secret via an await-once pattern. Also fixes cross-Python-version flakiness in the dedup test. - OSV robustness — a malformed-but-
200OSV response (non-JSON body or unexpected shape) crashed thesupply-chainscan instead of degrading to the curated list; per-batch and per-vuln parsing is now guarded. - Click ≥8.2 / CI compatibility — the v0.5 CLI/smoke tests used
CliRunner(mix_stderr=), removed in Click 8.2 (CI installs it on Python 3.10+); switched to--no-verify-bannerso parsed stdout stays clean on every Click version. - Version-fragile test —
test_status_is_string_enumasserted the Python-3.12(str, Enum).__str__output; now asserts the version-stable JSON-serialization contract.
Security (hardening — /attack pass on the v0.5 egress surface)
- URL-encode OSV-provided vuln IDs before interpolating them into the hydration URL path.
- Cap total OSV vuln-hydration fan-out to
--osv-max(a dependency with many advisories — or a hostile OSV — can no longer amplify into unbounded outbound requests). - Skip lock files larger than 1 MB in
parse_all(mirrors the filesystem scanner). - Clamp
--osv-max(≥0) and--osv-timeout(≥0.1).
329 tests. No changes to the v0.5.0 feature set.
v0.5.0 — Supply-Chain Intelligence
v0.5.0 — Supply-Chain Intelligence
Turns GitExpose's static supply-chain signatures into real, live dependency SCA.
Added
- Live dependency SCA — lock-file parsing for Python (
requirements.txt,poetry.lock,Pipfile.lock) and JavaScript (package-lock.json,yarn.lockv1 + Berry), enriched via OSV.dev live CVE/GHSA/malicious-package advisories. Newvulnerable_dependencyfinding type (OWASP A06:2021 / CICD-SEC-3; AI middleware also keeps its ATLAS tag). - OSV.dev integration — default on; sends only package names + versions (no secrets) via the batch endpoint (≤1000/request → bounded fan-out).
--offlineopt-out falls back to the curated known-bad list; any network failure degrades gracefully rather than failing the scan. New flags:--offline,--osv-timeout,--osv-max. - CycloneDX 1.6 AI-BOM —
-o cyclonedx(aliasaibom); components (PURLs + lock-file integrity hashes), dependency-vulnerability VEX, and NTIA minimum elements. - Exploitability-first ranking —
vulnerable_dependencyfindings are ordered by exploitability context (direct/transitive, fix-available, pinned, credential-co-presence), CVSS only as a tiebreaker. - Honest VEX — a vulnerability is marked
exploitableonly when proven (a credential in the same source file was--verify-confirmed live, or OSV flags it known-exploited), elsein_triage. Nevernot_affected. Self-contained CVSS v3.1 base-score computation (no external CVSS dependency).
Changed
- New core deps:
cyclonedx-python-lib,packageurl-python(pure-Python);tomlionly on Python 3.9/3.10. - 325 tests (was 287 at v0.4).
Deferred to v0.6
- Classic typosquatting; lock-file poisoning checks (data already captured); Shai-Hulud install-time behavioral analysis; Go/Cargo ecosystems.
Note: the tagged tree (
v0.5.0) ships the correct product code on all supported Python versions. A follow-up test-only commit onmain(3c979fb) makes the v0.5 CLI test harness compatible with Click ≥8.2 (which removedCliRunner(mix_stderr=)); it does not change any shipped behavior.
v0.4.0 — Detection Depth
v0.4.0 — 2026-05-28 — Detection Depth
Added
gitexpose git-history <path>— scans all reachable git history (git log -p --all --reverse) for credentials committed and later removed, reusing the full credential matrix. Each secret is reported once at its earliest-introducing commit, with commit SHA / author / date. Composes with--verify: a historical secret can be reportedverified/dead/error— "deleted N commits ago, confirmed live." Flags:-o/--output,--out-file,--since,--max-commits, and the--verify*family.- AI-supply-chain signature pack (working-tree, via
supply-chain):polyglot_file(HIGH) — text-extension file whose leading bytes are a binary/executable/archive signature (ELF, PE, ZIP, PDF, Mach-O, gzip). Built-in magic-byte detection — no external dependency.skill_prompt_injection(HIGH, LLM01) — hidden directives in instruction files (CLAUDE.md/AGENTS.md/.continue/…): "ignore previous instructions", exfil directives, system-prompt-reveal attempts.agent_config_malicious_content(CRITICAL) — command/exfil payloads inside CrewAI/AutoGen/litellm configs.langgrinch_lc_key(CRITICAL) — heuristic pattern for LangChainlc--prefixed credentials (LangGrinch / CVE-2025-68664 context; upstream key format not authoritatively confirmed).
- AWS access+secret pairing — same-source
aws_access_key+aws_secret_keyfindings are paired intoACCESS:SECRETso AWS keys now verify live (previously always ERROR). Applies to bothsupply-chain --verifyandgit-history --verify. - Shared
add_verify_argsClick decorator (reused bysupply-chainandgit-history).
Changed
- New OPTIONAL dependency:
python-magic>=0.4.27(advanced extra; reserved for future richer format detection — the polyglot detector itself uses built-in magic bytes and needs no system lib). - Test count grew from 251 (v0.3.0) to 287 (v0.4.0).
- Internal
_verify_input(the paired AWS secret) is scrubbed from all command output.
Fixed
- The v0.3 smoke-test fixture (
tests/fixtures/synthetic_repo_v03/.env) was never tracked — the generic.envgitignore rule silently dropped it at commit time, sotest_smoke_v03was red on clean checkouts. It is now tracked via a gitignore negation.
Deferred to v0.5
- AI-BOM (
--format aibom) structured security inventory - Policy engine + tamper-evident audit log
- Unreachable/dangling-blob history walk (force-pushed-away secrets)
- Additional provider verifiers (Discord/Telegram/Twilio/SendGrid/Stripe)
--verifyon the web-scan path; capability/scope enumeration
Full Changelog: v0.3.0...v0.4.0
v0.3.0 — Active Verification
v0.3.0 — 2026-05-28 — Active Verification
Added
- Active Verification engine (opt-in via
--verify). 16 providers
supported: OpenAI (3 variants), Anthropic, Groq, OpenRouter, Perplexity,
xAI, Cerebras, Hugging Face, ElevenLabs, Pinecone, LangSmith (v2 + legacy),
GitHub, GitLab, Docker Hub, Slack token, AWS (SigV4GetCallerIdentity).
Verification adds binaryverified/dead/errorstatus to each
applicable finding. --verifyCLI flags on thesupply-chaincommand:--verify,
--verify-concurrency,--verify-timeout,--verify-only-severity,
--no-verify-banner.- Consent banner printed to stderr when
--verifyis active. Names every
destination host. - Verification surfaces in all reporters: JSON (
verification_status,
verification_detail), SARIF (properties.verification_status+tags),
HTML (color badge), CSV (two new columns), console (colored tag). - In-run dedup: identical secrets in multiple files trigger only one
verification call per scan. - Log-redaction safety net: every verifier and engine path tested with a
sentinel canary to guarantee no raw secret leaks to logs, stdout, stderr, or
verification_detail. - Tier 3 provider patterns: Helicone, Portkey, Voyage, Cohere, Modal
(paired token), Runpod. Detection-only in v0.3; verification deferred to
v0.4. - GitHub Actions sample workflow at
.github/workflows/gitexpose-scan.yml. - pre-commit hook config at
.pre-commit-hooks.yaml. docs/INTEGRATIONS_CICD.md— pipeline setup walkthrough.docs/INTEGRATIONS_CODE_SCANNING.md— GitHub Code Scanning setup +
SARIF tag filtering.docs/MITRE_ATLAS_COVERAGE.md— per-detection ATLAS technique mapping.- README "Why this matters" section linking to the CISA
Private-CISA
incident.
Changed
- New runtime dependency:
httpx>=0.27.0. - New dev dependency:
respx>=0.21.0for HTTP mocking in tests. - Test count grew from 122 (v0.2.0) to 253 (v0.3.0).
- Project research notes now tracked under
docs/notes/. .gitignoreextended for workspace artifacts (.serena/,RESEARCH/,
files/, root PNGs,uv.lock,.venv/).
Fixed
gitexpose/advanced/mcp_server.py— removed unsupportedvalidate=
kwarg fromSecretExtractor.extract()call; fixed.get("valid")→
.get("validated")typo; fixed brokenfrom .secret_extractorimport path.
Regression test added.gitexpose/advanced/local_fs_scanner.py—.envdotfiles were silently
skipped (Path('.env').suffixis empty); added.envto the bare-filename
allowlist so supply-chain scans actually read.envfiles.github_tokenverifier registration — the scanner emits finding type
github_token(notgithub_pat); registered the alias so GitHub tokens are
actually liveness-checked.
Deferred to v0.4
- Capability/scope enumeration (AWS IAM perms, GitHub PAT scopes, OpenAI
org/project membership) - AI-BOM (SPDX 3.0) output format
- Verifiers for Discord bot/webhook, Telegram, Twilio, SendGrid, Stripe (each
needs case-by-case side-effect analysis) - Tier 3 provider verification (need documented endpoint surfaces)
- Persistent cross-run verification cache
- Deep git-history traversal
--verifyon the web-scan command (cli.py:main produces URL findings, not
extractable credentials)
Full Changelog: v0.2.0...v0.3.0
v0.2.0
Full Changelog: https://github.com/fevra-dev/GitExpose/commits/v0.2.0