mitre detetction

This commit is contained in:
Adir Shitrit
2025-11-08 13:43:11 +02:00
parent be73f614eb
commit 87c2c85fd7

View File

@@ -0,0 +1,724 @@
use crate::{ProcessInfo, MemoryRegion, ThreadInfo, GhostError};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::{SystemTime, Duration};
/// MITRE ATT&CK Framework Integration Engine
/// Provides comprehensive technique mapping, threat actor profiling, and tactical analysis
#[derive(Debug, Clone)]
pub struct MitreAttackEngine {
techniques: HashMap<String, AttackTechnique>,
tactics: HashMap<String, AttackTactic>,
threat_actors: HashMap<String, ThreatActor>,
campaigns: HashMap<String, Campaign>,
detection_rules: Vec<DetectionRule>,
matrix_version: String,
last_update: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AttackTechnique {
pub id: String,
pub name: String,
pub description: String,
pub tactics: Vec<String>,
pub platforms: Vec<Platform>,
pub data_sources: Vec<DataSource>,
pub detection_methods: Vec<DetectionMethod>,
pub mitigations: Vec<Mitigation>,
pub sub_techniques: Vec<String>,
pub kill_chain_phases: Vec<KillChainPhase>,
pub threat_actors: Vec<String>,
pub references: Vec<Reference>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AttackTactic {
pub id: String,
pub name: String,
pub description: String,
pub techniques: Vec<String>,
pub matrix_position: u8,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThreatActor {
pub id: String,
pub name: String,
pub aliases: Vec<String>,
pub description: String,
pub country: Option<String>,
pub motivation: Vec<Motivation>,
pub sophistication: SophisticationLevel,
pub techniques: Vec<String>,
pub campaigns: Vec<String>,
pub first_seen: SystemTime,
pub last_activity: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Campaign {
pub id: String,
pub name: String,
pub description: String,
pub threat_actors: Vec<String>,
pub techniques: Vec<String>,
pub targets: Vec<Target>,
pub timeline: CampaignTimeline,
pub attribution_confidence: ConfidenceLevel,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Platform {
Windows,
Linux,
MacOS,
Android,
iOS,
Cloud,
Network,
Container,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DataSource {
pub name: String,
pub data_component: String,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DetectionMethod {
pub method_type: DetectionType,
pub description: String,
pub effectiveness: f32,
pub false_positive_rate: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DetectionType {
SignatureBased,
BehavioralAnalysis,
AnomalyDetection,
MachineLearning,
HeuristicAnalysis,
NetworkMonitoring,
EndpointDetection,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Mitigation {
pub id: String,
pub name: String,
pub description: String,
pub implementation_difficulty: DifficultyLevel,
pub effectiveness: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DifficultyLevel {
Low,
Medium,
High,
VeryHigh,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum KillChainPhase {
Reconnaissance,
WeaponizationDevelopment,
Delivery,
Exploitation,
Installation,
CommandAndControl,
ActionsOnObjectives,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Reference {
pub source: String,
pub url: String,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Motivation {
Financial,
Espionage,
Sabotage,
Ideology,
PersonalGain,
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SophisticationLevel {
Minimal,
Intermediate,
Advanced,
Expert,
StateSponsored,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Target {
pub sector: IndustrySector,
pub region: GeographicRegion,
pub organization_size: OrganizationSize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum IndustrySector {
Government,
Defense,
Financial,
Healthcare,
Energy,
Technology,
Manufacturing,
Education,
Telecommunications,
Other(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum GeographicRegion {
NorthAmerica,
Europe,
Asia,
MiddleEast,
Africa,
SouthAmerica,
Oceania,
Global,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum OrganizationSize {
Small,
Medium,
Large,
Enterprise,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CampaignTimeline {
pub start_date: SystemTime,
pub end_date: Option<SystemTime>,
pub peak_activity: Option<SystemTime>,
pub duration: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ConfidenceLevel {
Low,
Medium,
High,
Confirmed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DetectionRule {
pub id: String,
pub technique_id: String,
pub rule_logic: String,
pub data_sources: Vec<String>,
pub confidence_threshold: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MitreAnalysisResult {
pub detected_techniques: Vec<DetectedTechnique>,
pub tactics_coverage: Vec<TacticCoverage>,
pub threat_actor_matches: Vec<ThreatActorMatch>,
pub campaign_indicators: Vec<CampaignIndicator>,
pub kill_chain_analysis: KillChainAnalysis,
pub risk_assessment: RiskAssessment,
pub mitigation_recommendations: Vec<MitigationRecommendation>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DetectedTechnique {
pub technique: AttackTechnique,
pub confidence: f32,
pub evidence: Vec<Evidence>,
pub sub_technique_id: Option<String>,
pub detection_timestamp: SystemTime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TacticCoverage {
pub tactic: AttackTactic,
pub techniques_detected: usize,
pub total_techniques: usize,
pub coverage_percentage: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThreatActorMatch {
pub threat_actor: ThreatActor,
pub match_confidence: f32,
pub matching_techniques: Vec<String>,
pub behavioral_similarity: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CampaignIndicator {
pub campaign: Campaign,
pub indicator_strength: f32,
pub supporting_evidence: Vec<String>,
pub timeline_match: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KillChainAnalysis {
pub completed_phases: Vec<KillChainPhase>,
pub current_phase: Option<KillChainPhase>,
pub next_likely_phases: Vec<KillChainPhase>,
pub attack_progression: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiskAssessment {
pub overall_risk_score: f32,
pub attack_likelihood: f32,
pub potential_impact: f32,
pub urgency_level: UrgencyLevel,
pub risk_factors: Vec<RiskFactor>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum UrgencyLevel {
Low,
Medium,
High,
Critical,
Emergency,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiskFactor {
pub factor_name: String,
pub risk_contribution: f32,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MitigationRecommendation {
pub mitigation: Mitigation,
pub priority: Priority,
pub implementation_timeline: Duration,
pub cost_estimate: CostEstimate,
pub effectiveness_against_detected: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Priority {
Low,
Medium,
High,
Critical,
Immediate,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CostEstimate {
Low,
Medium,
High,
VeryHigh,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Evidence {
pub evidence_type: EvidenceType,
pub description: String,
pub confidence: f32,
pub source: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum EvidenceType {
ProcessBehavior,
MemoryPattern,
NetworkActivity,
FileSystem,
Registry,
API_Calls,
Timing,
}
impl MitreAttackEngine {
pub fn new() -> Result<Self, GhostError> {
let mut engine = MitreAttackEngine {
techniques: HashMap::new(),
tactics: HashMap::new(),
threat_actors: HashMap::new(),
campaigns: HashMap::new(),
detection_rules: Vec::new(),
matrix_version: "13.1".to_string(),
last_update: SystemTime::now(),
};
engine.initialize_techniques()?;
engine.initialize_tactics()?;
engine.initialize_threat_actors()?;
engine.initialize_detection_rules()?;
Ok(engine)
}
fn initialize_techniques(&mut self) -> Result<(), GhostError> {
// Process Injection (T1055)
self.techniques.insert("T1055".to_string(), AttackTechnique {
id: "T1055".to_string(),
name: "Process Injection".to_string(),
description: "Adversaries may inject code into processes to evade process-based defenses".to_string(),
tactics: vec!["TA0004".to_string(), "TA0005".to_string()], // Defense Evasion, Privilege Escalation
platforms: vec![Platform::Windows, Platform::Linux, Platform::MacOS],
data_sources: vec![
DataSource {
name: "Process".to_string(),
data_component: "Process Access".to_string(),
description: "Monitor for unexpected process access patterns".to_string(),
},
],
detection_methods: vec![
DetectionMethod {
method_type: DetectionType::BehavioralAnalysis,
description: "Monitor for unusual cross-process activity".to_string(),
effectiveness: 0.85,
false_positive_rate: 0.1,
},
],
mitigations: vec![
Mitigation {
id: "M1040".to_string(),
name: "Behavior Prevention on Endpoint".to_string(),
description: "Use endpoint security solutions to detect injection".to_string(),
implementation_difficulty: DifficultyLevel::Medium,
effectiveness: 0.8,
},
],
sub_techniques: vec!["T1055.001".to_string(), "T1055.002".to_string()],
kill_chain_phases: vec![KillChainPhase::Installation, KillChainPhase::ActionsOnObjectives],
threat_actors: vec!["APT1".to_string(), "APT29".to_string()],
references: vec![
Reference {
source: "MITRE ATT&CK".to_string(),
url: "https://attack.mitre.org/techniques/T1055/".to_string(),
description: "Process Injection".to_string(),
},
],
});
// Process Hollowing (T1055.012)
self.techniques.insert("T1055.012".to_string(), AttackTechnique {
id: "T1055.012".to_string(),
name: "Process Hollowing".to_string(),
description: "Adversaries may inject malicious code into suspended and hollowed processes".to_string(),
tactics: vec!["TA0004".to_string(), "TA0005".to_string()],
platforms: vec![Platform::Windows],
data_sources: vec![
DataSource {
name: "Process".to_string(),
data_component: "Process Creation".to_string(),
description: "Monitor for processes created in suspended state".to_string(),
},
],
detection_methods: vec![
DetectionMethod {
method_type: DetectionType::EndpointDetection,
description: "Detect hollowing through memory analysis".to_string(),
effectiveness: 0.9,
false_positive_rate: 0.05,
},
],
mitigations: vec![],
sub_techniques: vec![],
kill_chain_phases: vec![KillChainPhase::Installation],
threat_actors: vec!["APT29".to_string(), "Lazarus Group".to_string()],
references: vec![],
});
Ok(())
}
fn initialize_tactics(&mut self) -> Result<(), GhostError> {
self.tactics.insert("TA0004".to_string(), AttackTactic {
id: "TA0004".to_string(),
name: "Defense Evasion".to_string(),
description: "Techniques that adversaries use to avoid detection".to_string(),
techniques: vec!["T1055".to_string()],
matrix_position: 4,
});
self.tactics.insert("TA0005".to_string(), AttackTactic {
id: "TA0005".to_string(),
name: "Privilege Escalation".to_string(),
description: "Techniques that adversaries use to gain higher-level permissions".to_string(),
techniques: vec!["T1055".to_string()],
matrix_position: 5,
});
Ok(())
}
fn initialize_threat_actors(&mut self) -> Result<(), GhostError> {
self.threat_actors.insert("APT29".to_string(), ThreatActor {
id: "G0016".to_string(),
name: "APT29".to_string(),
aliases: vec!["Cozy Bear".to_string(), "The Dukes".to_string()],
description: "Russian state-sponsored threat group".to_string(),
country: Some("Russia".to_string()),
motivation: vec![Motivation::Espionage],
sophistication: SophisticationLevel::StateSponsored,
techniques: vec!["T1055".to_string(), "T1055.012".to_string()],
campaigns: vec!["Operation Ghost".to_string()],
first_seen: SystemTime::now() - Duration::from_secs(365 * 24 * 3600 * 10), // 10 years ago
last_activity: SystemTime::now() - Duration::from_secs(30 * 24 * 3600), // 30 days ago
});
Ok(())
}
fn initialize_detection_rules(&mut self) -> Result<(), GhostError> {
self.detection_rules.push(DetectionRule {
id: "DR001".to_string(),
technique_id: "T1055".to_string(),
rule_logic: "process_access AND cross_process_memory_write".to_string(),
data_sources: vec!["Process".to_string(), "Memory".to_string()],
confidence_threshold: 0.8,
});
Ok(())
}
/// Analyze process behavior against MITRE ATT&CK framework
pub async fn analyze_attack_patterns(
&self,
process: &ProcessInfo,
memory_regions: &[MemoryRegion],
threads: &[ThreadInfo],
) -> Result<MitreAnalysisResult, GhostError> {
let detected_techniques = self.detect_techniques(process, memory_regions, threads).await?;
let tactics_coverage = self.analyze_tactics_coverage(&detected_techniques)?;
let threat_actor_matches = self.match_threat_actors(&detected_techniques)?;
let campaign_indicators = self.analyze_campaign_indicators(&detected_techniques)?;
let kill_chain_analysis = self.analyze_kill_chain(&detected_techniques)?;
let risk_assessment = self.assess_risk(&detected_techniques)?;
let mitigation_recommendations = self.recommend_mitigations(&detected_techniques)?;
Ok(MitreAnalysisResult {
detected_techniques,
tactics_coverage,
threat_actor_matches,
campaign_indicators,
kill_chain_analysis,
risk_assessment,
mitigation_recommendations,
})
}
async fn detect_techniques(
&self,
process: &ProcessInfo,
memory_regions: &[MemoryRegion],
_threads: &[ThreadInfo],
) -> Result<Vec<DetectedTechnique>, GhostError> {
let mut detected = Vec::new();
// Check for Process Injection indicators
let rwx_regions = memory_regions.iter()
.filter(|r| r.protection.readable && r.protection.writable && r.protection.executable)
.count();
if rwx_regions > 0 {
if let Some(technique) = self.techniques.get("T1055") {
detected.push(DetectedTechnique {
technique: technique.clone(),
confidence: 0.8,
evidence: vec![
Evidence {
evidence_type: EvidenceType::MemoryPattern,
description: format!("Found {} RWX memory regions", rwx_regions),
confidence: 0.9,
source: "Memory Analysis".to_string(),
},
],
sub_technique_id: None,
detection_timestamp: SystemTime::now(),
});
}
}
// Check for Process Hollowing indicators
if memory_regions.len() > 20 && process.name.ends_with(".exe") {
if let Some(technique) = self.techniques.get("T1055.012") {
detected.push(DetectedTechnique {
technique: technique.clone(),
confidence: 0.7,
evidence: vec![
Evidence {
evidence_type: EvidenceType::ProcessBehavior,
description: "Suspicious memory layout consistent with hollowing".to_string(),
confidence: 0.7,
source: "Process Analysis".to_string(),
},
],
sub_technique_id: Some("T1055.012".to_string()),
detection_timestamp: SystemTime::now(),
});
}
}
Ok(detected)
}
fn analyze_tactics_coverage(&self, detected_techniques: &[DetectedTechnique]) -> Result<Vec<TacticCoverage>, GhostError> {
let mut coverage = Vec::new();
for tactic in self.tactics.values() {
let techniques_detected = detected_techniques.iter()
.filter(|dt| dt.technique.tactics.contains(&tactic.id))
.count();
let total_techniques = tactic.techniques.len();
let coverage_percentage = if total_techniques > 0 {
(techniques_detected as f32 / total_techniques as f32) * 100.0
} else {
0.0
};
coverage.push(TacticCoverage {
tactic: tactic.clone(),
techniques_detected,
total_techniques,
coverage_percentage,
});
}
Ok(coverage)
}
fn match_threat_actors(&self, detected_techniques: &[DetectedTechnique]) -> Result<Vec<ThreatActorMatch>, GhostError> {
let mut matches = Vec::new();
for actor in self.threat_actors.values() {
let matching_techniques: Vec<String> = detected_techniques.iter()
.filter(|dt| actor.techniques.contains(&dt.technique.id))
.map(|dt| dt.technique.id.clone())
.collect();
if !matching_techniques.is_empty() {
let match_confidence = matching_techniques.len() as f32 / actor.techniques.len() as f32;
matches.push(ThreatActorMatch {
threat_actor: actor.clone(),
match_confidence,
matching_techniques,
behavioral_similarity: 0.8, // Simulated
});
}
}
Ok(matches)
}
fn analyze_campaign_indicators(&self, _detected_techniques: &[DetectedTechnique]) -> Result<Vec<CampaignIndicator>, GhostError> {
Ok(Vec::new()) // Simplified implementation
}
fn analyze_kill_chain(&self, detected_techniques: &[DetectedTechnique]) -> Result<KillChainAnalysis, GhostError> {
let mut completed_phases = Vec::new();
for technique in detected_techniques {
for phase in &technique.technique.kill_chain_phases {
if !completed_phases.contains(phase) {
completed_phases.push(phase.clone());
}
}
}
let current_phase = completed_phases.last().cloned();
let attack_progression = completed_phases.len() as f32 / 7.0; // 7 total phases
Ok(KillChainAnalysis {
completed_phases,
current_phase,
next_likely_phases: vec![KillChainPhase::CommandAndControl],
attack_progression,
})
}
fn assess_risk(&self, detected_techniques: &[DetectedTechnique]) -> Result<RiskAssessment, GhostError> {
let technique_count = detected_techniques.len() as f32;
let avg_confidence = if !detected_techniques.is_empty() {
detected_techniques.iter().map(|dt| dt.confidence).sum::<f32>() / technique_count
} else {
0.0
};
let overall_risk_score = (technique_count * 0.3 + avg_confidence * 0.7).min(1.0);
let urgency_level = if overall_risk_score > 0.8 {
UrgencyLevel::Critical
} else if overall_risk_score > 0.6 {
UrgencyLevel::High
} else if overall_risk_score > 0.4 {
UrgencyLevel::Medium
} else {
UrgencyLevel::Low
};
Ok(RiskAssessment {
overall_risk_score,
attack_likelihood: avg_confidence,
potential_impact: 0.8, // Simulated
urgency_level,
risk_factors: vec![
RiskFactor {
factor_name: "Multiple Techniques Detected".to_string(),
risk_contribution: 0.6,
description: "Multiple attack techniques increase overall risk".to_string(),
},
],
})
}
fn recommend_mitigations(&self, detected_techniques: &[DetectedTechnique]) -> Result<Vec<MitigationRecommendation>, GhostError> {
let mut recommendations = Vec::new();
for technique in detected_techniques {
for mitigation in &technique.technique.mitigations {
recommendations.push(MitigationRecommendation {
mitigation: mitigation.clone(),
priority: Priority::High,
implementation_timeline: Duration::from_secs(7 * 24 * 3600), // 1 week
cost_estimate: CostEstimate::Medium,
effectiveness_against_detected: mitigation.effectiveness,
});
}
}
Ok(recommendations)
}
/// Update MITRE ATT&CK data from official sources
pub async fn update_framework_data(&mut self) -> Result<usize, GhostError> {
// Simulate framework update
self.last_update = SystemTime::now();
self.matrix_version = "13.1".to_string();
// Return number of updated techniques
Ok(self.techniques.len())
}
pub fn get_technique(&self, technique_id: &str) -> Option<&AttackTechnique> {
self.techniques.get(technique_id)
}
pub fn get_framework_stats(&self) -> (usize, usize, usize) {
(self.techniques.len(), self.tactics.len(), self.threat_actors.len())
}
}