parlov
HTTP oracle detection tool — systematic probing for RFC-compliant information leakage.
HTTP servers that faithfully implement RFC 9110 often leak protected internal state through deterministic differences in status codes, cache-conditional responses, and response metadata. parlov detects those differential signals, scores confidence with per-signal normative weighting, and reports whether an application is vulnerable to oracle-based enumeration.
usage
manual probe (existence) — deprecated
Deprecated since 0.8.0. Use
parlov scan --strategy <id>for single-strategy runs; theexistencesubcommand is retained for backward compatibility.
# GET existence check
# POST registration enumeration
# HEAD — lightweight, no response body
# with auth header
automated scan (scan)
# default: all vectors, safe risk
# specific vector with risk ceiling
# mixed risk per vector
# specific vector with risk ceiling
# specific strategy
# SARIF output for CI integration
# reproducible curl commands per finding (Authorization not redacted)
# include filtered headers + body samples in each finding
# run every strategy regardless of interim confidence
39 strategies across four detection vectors (16 status-code-diff + 8 cache-probing + 7 error-message-granularity + 8 redirect-diff). Each scan also walks a Producer/Consumer DAG to emit Phase-2 chained probes informed by Phase-1 observations (Location redirects, ETag validators, harvested resource IDs, Problem-Details envelopes, Content-Type negotiation, auth challenges). Each finding includes a confidence score, impact class, severity, and deterministic finding ID for cross-run deduplication; the run as a whole carries an EndpointVerdict envelope with posterior probability, stop reason, and observability status.
options
global
| Flag | Description |
|---|---|
--format |
Output format: table (default), json, sarif |
existence subcommand
| Flag | Description |
|---|---|
--target |
URL template with {id} placeholder |
--baseline-id |
Resource ID known to exist |
--probe-id |
Resource ID to test (defaults to random UUIDv4) |
--method |
HTTP method (defaults to GET) |
--header |
Request header in Name: Value format (repeatable) |
--body |
Body template with {id} placeholder |
scan subcommand
| Flag | Description |
|---|---|
--target |
URL template with {id} placeholder |
--baseline-id |
Resource ID known to exist |
--probe-id |
Resource ID to test (defaults to random UUIDv4) |
--body |
Body template with {id} placeholder (required when the API identifies resources via body) |
--header |
Request header in Name: Value format (repeatable) |
--vector |
Detection vector with optional risk ceiling (repeatable) |
--risk |
Global risk ceiling for all vectors (mutually exclusive with --vector) |
--strategy |
Run specific strategy by ID (repeatable, mutually exclusive with --risk and --vector) |
--alt-credential |
Alternative credential header for scope manipulation |
--known-duplicate |
Known duplicate value for uniqueness strategies (field=value) |
--state-field |
State field name for state transition strategies (field=value) |
--exhaustive |
Run all strategies regardless of interim confidence; records the first-confirming strategy |
--repro |
Emit reproducible curl commands for each non-NotPresent finding (headers NOT redacted) |
--verbose |
Include filtered request/response headers and 256-byte body samples in each finding (headers NOT redacted) |
exit codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Runtime error |
license
MIT OR Apache-2.0