parlov-elicit
Elicitation engine for parlov. Given a target endpoint and operator context, generates a plan of ProbeSpecs designed to trigger specific server-side differentials that reveal resource existence.
Overview
The engine codifies the elicitation playbook as 17 composable strategies. Each strategy targets a different layer of the HTTP pipeline — content negotiation, conditional headers, auth, payload validation, rate limiting — and produces probe definitions that the binary feeds into its execution loops.
Usage
use ;
use HeaderMap;
let ctx = ScanContext ;
let plan = generate_plan;
// plan contains ProbeSpec::Pair, ::Burst, and ::HeaderDiff items
// ready for dispatch by the binary's scan pipeline
Strategies
| # | ID | Risk | Methods | Prereq |
|---|---|---|---|---|
| 1 | accept-elicit |
Safe | GET, HEAD | — |
| 2 | if-none-match-elicit |
Safe | GET, HEAD | — |
| 3 | trailing-slash-elicit |
Safe | GET, HEAD | — |
| 4 | case-normalize-elicit |
Safe | GET, HEAD | — |
| 5 | long-uri-elicit |
Safe | GET, HEAD | — |
| 6 | auth-strip-elicit |
Safe | GET, HEAD | Authorization header |
| 7 | low-privilege-elicit |
Safe | GET, HEAD | Authorization header |
| 8 | scope-manipulation-elicit |
Safe | GET, HEAD | alt_credential |
| 9 | rate-limit-headers-elicit |
Safe | GET, HEAD | — |
| 10 | content-type-elicit |
MethodDestructive | POST, PUT, PATCH | — |
| 11 | if-match-elicit |
MethodDestructive | PUT, PATCH, DELETE | — |
| 12 | empty-body-elicit |
MethodDestructive | POST, PUT, PATCH | — |
| 13 | oversized-body-elicit |
MethodDestructive | POST, PUT, PATCH | — |
| 14 | state-transition-elicit |
MethodDestructive | PATCH, PUT | state_field |
| 15 | uniqueness-elicit |
OperationDestructive | POST, PUT | known_duplicate |
| 16 | dependency-delete-elicit |
OperationDestructive | DELETE | — |
| 17 | rate-limit-burst-elicit |
OperationDestructive | GET, HEAD | — |
Design
- Pure computation — no I/O, no async. The binary owns the async boundary.
- Strategy as trait — adding a strategy is one file + one registry line.
ProbeSpecvariants drive dispatch in the binary:Pair→ adaptive loop,Burst→ volume loop,HeaderDiff→ single-request header comparison.RiskLevelusesOrd—generate_planfilters withrisk() <= ctx.max_risk.