use serde::Serialize;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
pub enum Confidence {
Low,
Medium,
High,
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
pub enum EnvironmentSignal {
RootDetected {
confidence: Confidence,
evidence: String,
},
EmulatorDetected {
confidence: Confidence,
evidence: String,
},
DebuggerAttached {
confidence: Confidence,
evidence: String,
},
Unknown {
label: String,
evidence: String,
},
}
impl EnvironmentSignal {
pub fn confidence(&self) -> Option<Confidence> {
match self {
Self::RootDetected { confidence, .. }
| Self::EmulatorDetected { confidence, .. }
| Self::DebuggerAttached { confidence, .. } => Some(*confidence),
Self::Unknown { .. } => None,
}
}
pub fn evidence(&self) -> &str {
match self {
Self::RootDetected { evidence, .. }
| Self::EmulatorDetected { evidence, .. }
| Self::DebuggerAttached { evidence, .. }
| Self::Unknown { evidence, .. } => evidence,
}
}
pub fn category(&self) -> &str {
match self {
Self::RootDetected { .. } => "root_detected",
Self::EmulatorDetected { .. } => "emulator_detected",
Self::DebuggerAttached { .. } => "debugger_attached",
Self::Unknown { label, .. } => label,
}
}
pub(crate) fn base_threat_weight(&self) -> u32 {
match self {
Self::DebuggerAttached { .. } => 100,
Self::RootDetected { .. } => 70,
Self::EmulatorDetected { .. } => 40,
Self::Unknown { .. } => 0,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
pub enum ThreatLevel {
None,
Low,
Medium,
High,
Critical,
}
impl ThreatLevel {
pub(crate) fn from_score(score: u32) -> Self {
match score {
0 => Self::None,
1..=30 => Self::Low,
31..=60 => Self::Medium,
61..=99 => Self::High,
_ => Self::Critical,
}
}
}