#![cfg_attr(coverage_nightly, coverage(off))]
use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::ops::Range;
use wasmparser::{Operator, Payload};
#[derive(Debug, Clone)]
pub struct PatternDetector {
patterns: Vec<VulnerabilityPattern>,
found: Vec<VulnerabilityMatch>,
}
#[derive(Debug, Clone)]
pub struct VulnerabilityPattern {
pub name: &'static str,
pub opcodes: Vec<OpcodePattern>,
pub severity: Severity,
}
#[derive(Debug, Clone)]
pub enum OpcodePattern {
Sequence(Vec<OperatorMatcher>),
Within {
distance: usize,
operators: Vec<OperatorMatcher>,
},
NotPrecededBy {
target: OperatorMatcher,
guards: Vec<OperatorMatcher>,
},
}
#[derive(Debug, Clone)]
pub enum OperatorMatcher {
I32Const,
I32Add,
I32Sub,
I32Mul,
I32DivS,
I32DivU,
I32RemU,
I32And,
I32Or,
I32Xor,
I32Eqz,
I32Eq,
I32Ne,
I32LtS,
I32LtU,
I32GtS,
I32GtU,
I32Load,
I32Store,
I64Load,
I64Store,
BrIf,
Br,
Call,
CallIndirect,
MemoryGrow,
MemorySize,
Any,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum Severity {
Low,
Medium,
High,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VulnerabilityMatch {
pub pattern: String,
pub location: Range<usize>,
pub severity: Severity,
pub operator_index: usize,
}
include!("security_patterns.rs");
include!("security_matcher.rs");
include!("security_tests.rs");
include!("security_tests_matcher.rs");