pub struct VerifySpec {
pub service: String,
pub method: Option<HttpMethod>,
pub url: Option<String>,
pub auth: Option<AuthSpec>,
pub headers: Vec<HeaderSpec>,
pub body: Option<String>,
pub success: Option<SuccessSpec>,
pub metadata: Vec<MetadataSpec>,
pub timeout_ms: Option<u64>,
pub steps: Vec<StepSpec>,
pub allowed_domains: Vec<String>,
pub oob: Option<OobSpec>,
}Expand description
Live verification configuration for a detector.
Fields§
§service: StringTarget service identifier (defaults to detector’s service if omitted).
method: Option<HttpMethod>HTTP method (default: GET).
url: Option<String>Endpoint URL with optional `{{match}}` or `{{companion.
auth: Option<AuthSpec>Authentication scheme.
headers: Vec<HeaderSpec>Custom HTTP headers.
body: Option<String>Optional request body template.
success: Option<SuccessSpec>Criteria for a successful verification.
metadata: Vec<MetadataSpec>Metadata to extract from the response.
timeout_ms: Option<u64>Optional request timeout override.
steps: Vec<StepSpec>Multi-step verification flow.
allowed_domains: Vec<String>Domain allowlist for the verify URL after interpolation. If non-empty,
the resolved host of the (interpolated) URL — and of every step’s URL —
MUST equal one of these entries (or be a subdomain of one). When empty,
the verifier falls back to a hardcoded service allowlist if the
service field maps to a known provider; otherwise the verifier
REFUSES to send the request. This blocks malicious detector TOMLs
that set url = "{{match}}" (or interpolate an attacker-controlled
companion) from exfiltrating credentials. See kimi-wave1 audit
finding 4.1 + wave3 §1.
oob: Option<OobSpec>Optional out-of-band verification probe. When set, the verifier mints a
per-finding correlation URL via the configured interactsh server,
substitutes {{interactsh}} (and {{interactsh.host}} /
{{interactsh.url}}) into the request template, and waits for the
service to call back. OOB verification proves a leaked credential is
exfil-capable, not just live: a webhook URL that returns 200 OK to
every probe still has to actually fetch our collector to confirm it
will deliver attacker-controlled traffic.
Gated behind the runtime --verify-oob flag — never default. When the
flag is off, oob is ignored and verification falls back to the
HTTP success criteria alone.
Trait Implementations§
Source§impl Clone for VerifySpec
impl Clone for VerifySpec
Source§fn clone(&self) -> VerifySpec
fn clone(&self) -> VerifySpec
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for VerifySpec
impl Debug for VerifySpec
Source§impl Default for VerifySpec
impl Default for VerifySpec
Source§fn default() -> VerifySpec
fn default() -> VerifySpec
Source§impl<'de> Deserialize<'de> for VerifySpec
impl<'de> Deserialize<'de> for VerifySpec
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for VerifySpec
impl RefUnwindSafe for VerifySpec
impl Send for VerifySpec
impl Sync for VerifySpec
impl Unpin for VerifySpec
impl UnsafeUnpin for VerifySpec
impl UnwindSafe for VerifySpec
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more