Namespace Kuestenlogik.Bowire.Security
Classes
- AttackJsonPathClause
Operator-bag for the BodyJsonPath leaf. Path selects values; one of Exists, EqualsValue, Matches, or AnyValueMatches specifies what counts as a match.
- AttackPredicate
Predicate-tree node for the vulnerability-template DSL. Each instance is either a leaf (one of the response-property checks set on this node) or a composite (one of AllOf / AnyOf / Not set on this node).
- AttackPredicateEvaluator
Stateless walker that evaluates an AttackPredicate against an AttackProbeResponse. Returns true when the predicate matches — i.e. when the target is vulnerable according to the template.
- AttackProbeResponse
Captured response context that AttackPredicateEvaluator walks an AttackPredicate against. Transport-agnostic: the HTTP scanner populates Status from the HTTP status code; future gRPC / SignalR / WebSocket transports map their own status concepts onto the same integer (gRPC: 0..16 status codes, SignalR: 200 for invocation OK / specific code on hub error, …).
- AttackVulnerability
Identifying + classification metadata for a vulnerability template. Attached to a BowireRecording via its
Vulnerabilityfield when the recording is being used as a security-test probe rather than as a mock-server fixture.
- FuzzExecutor
Server-side runtime for the schema-aware fuzzer. Shared between the
bowire fuzzCLI subcommand and the/api/security/fuzzHTTP endpoint that the workbench's right-click "Fuzz this field" menu calls into. Stateless; payload wordlists + per-category response heuristics live as static data so neither consumer pays for instance state.
- FuzzExecutorRequest
Input bundle for RunAsync(FuzzExecutorRequest, CancellationToken).
- FuzzFieldSpec
What the engine knows about a field, extracted from the schema.
- FuzzResultRow
One row of the fuzz result — per-payload outcome.
- FuzzRunResult
Aggregate result of one fuzz run.
- JwtAnalysis
Result of Analyze(string, string?, long?).
- JwtFlag
One deterministic observation about a JWT's security posture.
- JwtSecurityAnalyzer
Deterministic JWT security analysis (#105): decodes a token's header + payload and runs rule-based checks —
alg=none, symmetric-HMAC crackability, missing / expired / long-livedexp, missingnbf, scope creep, audience binding, futureiat,kidinjection surface. No crypto, no network, no AI — the substance a tester would otherwise eyeball on jwt.io. An AI layer can narrate these; this is the ground truth it narrates.
- OastInteractionClause
Inner clause of OastInteraction — which out-of-band callback counts as proof (#35 Phase 2f). An empty clause means "any callback at all", which is already the finding for most blind templates: the target contacting a host it was fed is the vulnerability, regardless of transport.
- OrchestratedFinding
A finding produced against one endpoint, carrying its triage verdict once scored.
- OrchestratedScanResult
Result of an orchestrated security scan.
- OrchestratorEndpoint
An endpoint the orchestrated scan can consider.
- OwaspApiTop10Mapper
Deterministic OWASP API Security Top 10 (2023) mapping per method (#106): each of the ten entries gets a tri-state status (at-risk / maybe / n-a) and a concrete suggested probe, from rule-based signals on the method's path, verb, and request fields. This is the ground truth the AI panel refines — and the panel still works with no model connected.
- OwaspMethodDescriptor
The method shape the mapper reasons over.
- OwaspPanelRow
One OWASP API Top 10 row for a method.
- ProbeInteraction
One out-of-band callback attributed to a probe — the target reached out to a host the probe planted in it, which is the evidence a blind finding rests on (blind SSRF / RCE / XXE leave nothing in the response itself).
- RankedEndpoint
An endpoint ranked by the threat-model step.
- SchemaMutation
One targeted invalid input the engine produced for a field.
- SchemaMutator
Schema-aware mutation engine (#175). Given a field's declared type it produces targeted invalid inputs — the type-confusion, boundary, encoding, enum-bypass, and structural mutations a schema-blind fuzzer misses. Output is seeded (reproducible via
--seed) and budgeted (capped per field so a scan doesn't explode); the same (spec, seed, budget) always yields the same mutation set.
- SecurityReport
Structured security report (#107): findings grouped by severity + OWASP, plus a diff against a baseline run. ToMarkdown(string?) renders the deterministic markdown skeleton; an AI layer adds the executive-summary prose.
- SecurityReportBuilder
Builds a SecurityReport from a scanner SARIF document (the
bowire scan --outartifact), optionally diffed against a baseline SARIF. Deterministic — no AI, no network.
- SecurityReportDiff
Diff of a scan against a baseline run.
- SecurityReportFinding
One finding lifted out of a SARIF run for the report.
- SecurityScanOrchestrator
AI security scan orchestration (#104): the single control flow that composes the four primitives into a loop — threat-model → (per above-threshold endpoint) probe → triage → report. Deterministic; the AI/scanner work is injected via ISecurityScanSteps. This is the "story" the individual primitives couldn't tell on their own.
Interfaces
- ISecurityScanProbeRunner
Seam that executes probes against one endpoint for the AI scan orchestration (#104). The scan engine (
Kuestenlogik.Bowire.Security.Scanner) or the host registers an implementation; the AI orchestration adapter resolves it optionally, so the AI planning stages (threat-model → triage → report) work even when no live probe executor is wired (plan-only mode) — and the core / AI packages don't take a hard dependency on the scan engine.
- ISecurityScanSteps
The step primitives the orchestrator chains — supplied by the caller so the control flow stays deterministic + testable while the real work (AI threat-model / probe execution / AI triage / AI report) is pluggable.
Enums
- FuzzFieldKind
The type of a field the mutation engine knows how to attack.
- FuzzOutcome
Per-payload outcome bucket.
- JwtFlagLevel
Severity of a JwtFlag.
- OwaspRiskStatus
Tri-state per-entry risk for the OWASP panel (#106).