Changelog
Changelog
All notable changes to opensecuritybot (bin: vapt) are recorded here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Breaking
- Scope: a bare host now authorizes only itself.
acme.comno longer matchesapp.acme.com; add*.acme.comto keep subdomains in scope. Affected findings are dropped as out of scope (fail closed), never processed by mistake. - **
.env:** loaded only whenVAPT_LOAD_DOTENV=1is exported. A.envin an untrusted directory could redirect where findings are sent.
Added
- Secret redaction before any data reaches the LLM (
redactSecretsinsrc/agent-prompt.ts). scope.jsonexcludelist (exclusions win everywhere) andnotBefore/notAftertesting window, enforced byvapt scan.vapt scanresolves the target before each step and refuses link-local/metadata addresses; all link-local literals are refused too.- Hash-chained scan ledger (
prevHash) withverifyLedger; the report states the chain status. - Report provenance footer (tool version, model, endpoint, system-prompt sha256, time) and
provenanceinreport --json. <out>/triage-cache.json: triage results reused across report runs; analyst edits override the model until the finding, model or prompt changes.- CISA KEV enrichment: known-exploited CVEs are marked
kev: true(VAPT_KEV=0stays offline). npm run evalwith a seed labeled set inexamples/eval/.- Anthropic prompt caching on the system prompt.
- Four reviewed scan skills:
web-fingerprintandtakeover-checkandexposed-panels(passive) andcve-scan(active); nuclei steps carry explicittimeoutMsfor broad tag sets.
Changed
- Anthropic
max_tokensdefault raised from 4096 to 16000; a reply cut off at the output limit now ends with a visible[truncated: …]marker on every provider. - An
owaspCategorythat is not an OWASP Top 10 (2021) id flags the result for manual review. - Terminal shows a red
KEVmarker on findings citing a CISA Known Exploited CVE (/findings,vapt triageheader) and akevcount on the session card. - Triage cards show the
[verify]cross-check note as its ownverifyrow instead of inside the reasoning. /reportprints the provenance line (model, endpoint, prompt sha256) and warns when the ledger hash chain is broken./findingsheader adds· N flaggedwhen any triaged result needs manual review.
Security
- Terminal control characters are stripped from scanner data on load and from all LLM output.
/loadkeeps only valid triage results and user/assistant history turns.
Fixed
vapt diffwrites the Markdown report to stdout whenever it is not saved with--out; previously it did so only with-q. The console summary now goes to stderr so stdout stays data-only.vapt diffresolves--baseline,--currentand--scopethrough the active workspace liketriage/report/scan.- LLM request timeout (
VAPT_LLM_TIMEOUT_MS) now covers reading the response body, not just the headers. - Scope matching and the metadata-address refusal share one host parser (
hostOf); bracketed IPv6 targets with a port ([fd00::1]:8080) now match scope entries correctly. - Secret redaction no longer masks prose such as "Basic authentication" or "Bearer tokens"; a token must contain a digit.
- Known-exploited (KEV) CVEs are flagged even when no NVD record is cached (offline,
VAPT_NVD_MAX=0). - Streamed replies keep the final chunk's text when it arrives together with the output-limit signal.
scope.jsonrejectsexcludeentries that carry a path, since exclusions match whole hosts and a path would silently exclude the entire host.vapt triage --jsonand the session's/triagesharereport/triage-cache.jsonwithvapt report(triagegains-o <dir>), so/reportafter/triagemakes no extra LLM calls.- CVSS 4.0 base scores (
cvssMetricV40) are read from NVD records when present. - Removed unused code:
WorkspaceInfo.hasFindings/createdAt, theprefixMarkerstream option, the duplicatePARSER_NAMESlist (skills validate againstNORMALIZERS) and the duplicatehostPatternparser.npm run evalmoved tosrc/eval.tsso it is type-checked by the build.
[0.5.2] - 2026-10-17
Fixed
vapt skillsandvapt scanresolve the bundledskills/directory relative to the installed package, not the current working directory. They previously failed on a global install unless run from a directory containingskills/(VAPT_SKILLS_DIRstill overrides).
[0.5.0] - 2026-10-17
First functional public release on npm. (An earlier accidental placeholder, 0.0.0-stage, is not a usable release.)
Added
- Reviewed scan skills (
skills/,src/skills.ts): declarative, allowlisted playbooks fornmap,nucleiandhttpx. - Scope-pinned runner (
src/runner.ts): argv-only steps,{{target}}as the sole placeholder, scope re-checked before each step, per-step timeout and 10 MB output cap. - Normalizers for httpx JSONL, nuclei JSONL and nmap grepable output (
src/normalizers.ts). - Append-only execution ledger (
report/scan-ledger.jsonl) folded into the report's Scope & Methodology section. vapt skillsto list available skills andvapt scanto run one and write normalized findings.
Changed
vapt reportnow includes the execution ledger in the methodology section.- Scan output uses the existing findings format, so deduplication, scope filtering, triage and reporting work unchanged.
Fixed
- Evidence longer than 8 KB is now actually replaced with a placeholder.
- Streaming requests now enforce their timeout after response headers arrive.
- HTML output filters link schemes before rendering.
Security
- Session and diff fail closed when no valid scope is loaded.
- Prompt data tags are escaped, so scanner content cannot break out of its boundary.
- Workspace names are validated before use in paths.
- Scan runner refuses cloud metadata endpoints even when listed in scope.