Web planning internals
StandardWebAttackProfile maps supported web hypotheses to executor-routable actions. It is an opt-in planner profile: it ranks candidates and emits commands but never performs network I/O.
HTTP Evidence
|
v
StandardWebReasoning
|
v
Weak / Strong Hypotheses
|
v
StandardWebAttackProfile
|
+--> requirements expression
+--> posterior / strength threshold
+--> gain, cost, risk, business value
+--> dependency closure
|
v
AttackPlan ---> DecisionLoopCommand::ExecuteAction ---> registered executor
|
+--> optional versioned strategy reference (never raw payload bytes)
Action catalog
The standard profile currently declares nine semantic actions.
Their stable identities live in the transport-neutral web_actions catalog;
planning assigns utility while execution separately binds supported identities
to concrete probes.
| Hypothesis | Action | Required strength | Minimum posterior | Verification target |
|---|---|---|---|---|
| nginx web server | configuration discovery | Any | 70% | Motivation |
| Apache HTTP Server | configuration discovery | Any | 70% | Motivation |
| PHP runtime | input discovery | Any | 70% | KnowledgeOnly |
| Laravel framework | route discovery | Strong | 80% | Motivation |
| Laravel framework | input analysis | Strong | 80% | Motivation |
| Livewire UI framework | component discovery | Any | 60% | Motivation |
| Sanctum authentication (Weak hypothesis) | compatible cookie-boundary observation | Any | 50% | KnowledgeOnly |
| HTTP Basic | auth-boundary analysis | Strong | 90% | Motivation |
| HTTP Bearer | auth-boundary analysis | Strong | 90% | Motivation |
Laravel input analysis depends on Laravel route discovery. The planner can rank input analysis first by utility, but its dependency closure always places route discovery earlier in the emitted plan.
The lower Sanctum threshold does not imply verification. The underlying cookie-based hypothesis remains weak, and the action carries higher operational risk so conservative planning contexts exclude it automatically.
PHP input discovery is deliberately KnowledgeOnly. The PHP hypothesis still
motivates and supplies confidence for the action, but finding a named HTML form
control proves only that the discovery objective succeeded; it does not prove
that PHP produced the control and therefore cannot confirm or reject PHP.
Sanctum auth-boundary observation is also KnowledgeOnly. The weak Sanctum
hypothesis still motivates the credential-free HEAD, but observing
laravel_session and XSRF-TOKEN in the current response proves only a
Laravel-compatible cookie-name surface. Laravel's CSRF middleware can emit the
XSRF cookie independently of Sanctum, while Sanctum may be configured for
token-only use. A successful action therefore leaves the Sanctum hypothesis
Supported.
Executor boundary
Every StandardWebActionKind exposes a stable planner action ID and executor ID. A host must register a matching DecisionActionExecutor before handing the command to DecisionRunnerAdapter.
for kind in StandardWebActionKind::all() {
println!("{} -> {}", kind.action_id(), kind.executor_id());
}
This profile does not silently map semantic actions to generic exploit plugins. Route discovery, component discovery, and authentication analysis remain isolated executor contracts that a host can implement with its own scope, rate, and authorization policy.
The opt-in standard web discovery executor profile supplies bounded built-in implementations for eight actions, including nginx/Apache configuration discovery, PHP input discovery, Laravel route boundaries, Livewire component discovery, and Sanctum/HTTP authentication boundaries. Laravel input analysis remains host-owned.
Installation
Reasoning and planning are installed independently into the decision loop.
let knowledge = KnowledgeBase::new();
let mut decision_loop = DecisionLoop::new(config);
StandardWebReasoning::new()?
.install(&knowledge, decision_loop.rules_mut())?;
StandardWebAttackProfile::new()?
.install(decision_loop.planner_mut())?;
Both installations are idempotent and preflight identity conflicts against cloned registries before replacing planner state.
Explainability and policy
Each selected PlanStep retains:
- the requirements expression trace;
- the hypothesis supplying confidence;
- the separately resolved verification target (
Motivation,Distinct, orKnowledgeOnly) in the in-process plan; the existing serialized plan shape intentionally omits this additive field for wire compatibility; - gain, posterior, business value, cost, and risk;
- the calculated fixed-point utility;
- prerequisite action identities;
- the executor identity;
- the optional exact payload strategy ID and revision selected with the action.
The planner treats the strategy reference as declarative action identity. It does not resolve a transformer, derive bytes, read runtime state, or know HTTP. Changing only the strategy revision changes action semantics and therefore conflicts with an existing registration under the same action ID.
Rejected actions preserve an explicit reason such as unmet requirements, insufficient hypothesis strength, risk limit, dependency failure, budget exhaustion, or policy suppression.