forge_guard/exploit/
mod.rs1use crate::core::{Finding, ForgeGuardError, Severity};
4pub fn analyze_exploit_paths(
6 findings: &[Finding],
7 _source_files: &[PathBuf],
8) -> Result<Vec<Finding>, ForgeGuardError> {
9 let mut exploit_findings = Vec::new();
10
11 for finding in findings {
12 if finding.severity >= Severity::High {
13 let exploit_path = generate_exploit_path(finding);
14 if let Some(path) = exploit_path {
15 let mut enhanced = finding.clone();
16 enhanced.exploit_path = Some(path);
17 exploit_findings.push(enhanced);
18 }
19 }
20 }
21
22 Ok(exploit_findings)
23}
24
25fn generate_exploit_path(finding: &Finding) -> Option<Vec<String>> {
27 match finding.category.as_str() {
28 "Access Control" => Some(vec![
29 format!(
30 "Attacker identifies unprotected function: {}",
31 finding.title
32 ),
33 "Attacker calls vulnerable function directly without authorization".into(),
34 "Function executes with attacker-controlled parameters".into(),
35 match finding.severity {
36 Severity::Critical | Severity::High => {
37 "Attacker gains unauthorized control or extracts funds".into()
38 }
39 _ => "Attacker modifies contract state illegally".into(),
40 },
41 ]),
42 "Logic" => Some(vec![
43 format!("Attacker identifies logical flaw: {}", finding.title),
44 "Attacker crafts transactions exploiting the flawed logic".into(),
45 "Contract executes unintended code path".into(),
46 "Attacker drains assets or breaks contract invariants".into(),
47 ]),
48 "DeFi" => Some(vec![
49 "Attacker obtains flash loan from lending protocol".into(),
50 "Attacker manipulates price oracle or liquidity pool".into(),
51 "Attacker executes arbitrage transaction manipulating contract".into(),
52 "Attacker repays flash loan, keeping profit".into(),
53 ]),
54 "Upgradeability" => Some(vec![
55 "Attacker identifies unsafe upgrade path".into(),
56 "Attacker deploys malicious implementation contract".into(),
57 "Proxy proxies to malicious implementation".into(),
58 "Attacker takes over contract through upgrade".into(),
59 ]),
60 "Cryptography" => Some(vec![
61 "Attacker intercepts signed message".into(),
62 "Attacker replays signature on different chain or context".into(),
63 "Signature bypasses authorization checks".into(),
64 "Attacker gains unauthorized access".into(),
65 ]),
66 "Cross-Chain" => Some(vec![
67 "Attacker identifies cross-chain message vulnerability".into(),
68 "Attacker crafts malicious cross-chain message".into(),
69 "Validator/relayer processes malicious message".into(),
70 "Funds are stolen from cross-chain bridge".into(),
71 ]),
72 _ => None,
73 }
74}
75
76use std::path::PathBuf;
77
78#[cfg(test)]
79mod tests {
80 use super::*;
81 use crate::core::FindingBuilder;
82
83 #[test]
84 fn test_exploit_path_generation() {
85 let finding = FindingBuilder::default()
86 .title("Test Finding")
87 .description("A test vulnerability")
88 .severity(Severity::High)
89 .category("Access Control".into())
90 .build();
91
92 let result = analyze_exploit_paths(&[finding], &[]).unwrap();
93 assert!(!result.is_empty());
94 assert!(result[0].exploit_path.is_some());
95 }
96}