pub struct Finding {Show 15 fields
pub id: Uuid,
pub scanner: String,
pub target: String,
pub severity: Severity,
pub title: String,
pub detail: String,
pub kind: FindingKind,
pub evidence: Vec<Evidence>,
pub tags: Vec<String>,
pub timestamp: DateTime<Utc>,
pub cve_ids: Vec<String>,
pub references: Vec<String>,
pub confidence: Option<f64>,
pub exploit_hint: Option<String>,
pub matched_values: Vec<String>,
}Expand description
A single security finding produced by any Santh tool.
This is the universal output format. Whether the finding comes from
Gossan (discovery), Karyx (routing), Calyx (templates), Sear (SAST),
jsdet (JS malware), or a binding (sqlmap-rs), it produces a Finding.
Fields§
§id: UuidUnique identifier for this finding instance.
scanner: StringWhich tool/scanner produced this finding.
target: StringThe target that was scanned (URL, file path, domain, IP, etc.).
severity: SeverityFinding severity.
title: StringShort human-readable title.
detail: StringDetailed description of the finding.
kind: FindingKindClassification of the finding.
evidence: Vec<Evidence>Typed evidence proving the finding.
Free-form tags for categorization and filtering.
timestamp: DateTime<Utc>When the finding was produced.
cve_ids: Vec<String>CVE identifiers associated with this finding.
references: Vec<String>Reference URLs (advisories, documentation, etc.).
confidence: Option<f64>Statistical confidence score (0.0 to 1.0).
exploit_hint: Option<String>Ready-to-run command demonstrating exploitability.
matched_values: Vec<String>Specific values that triggered the finding (matched strings, payloads, etc.).
Implementations§
Source§impl Finding
impl Finding
Sourcepub fn builder(
scanner: impl Into<String>,
target: impl Into<String>,
severity: Severity,
) -> FindingBuilder
pub fn builder( scanner: impl Into<String>, target: impl Into<String>, severity: Severity, ) -> FindingBuilder
Start building a finding with the three required fields.
Examples found in repository?
3fn main() {
4 let finding = Finding::builder("basic-scanner", "https://example.com", Severity::High)
5 .title("Potential command injection")
6 .detail("Untrusted input reaches shell execution")
7 .tag("rce")
8 .evidence(secfinding::Evidence::http_status(500))
9 .build();
10
11 println!("{finding}");
12
13 let json = serde_json::to_string_pretty(&finding).unwrap();
14 println!("{json}");
15}Trait Implementations§
Source§impl<'de> Deserialize<'de> for Finding
impl<'de> Deserialize<'de> for Finding
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>,
Source§impl Reportable for Finding
Blanket: secfinding’s own Finding implements Reportable.
impl Reportable for Finding
Blanket: secfinding’s own Finding implements Reportable.
Source§fn confidence(&self) -> Option<f64>
fn confidence(&self) -> Option<f64>
Source§fn exploit_hint(&self) -> Option<&str>
fn exploit_hint(&self) -> Option<&str>
PoC command.