using System;
using System.Collections.Generic;
using System.Linq;
using MemScanEDR.Models;
namespace MemScanEDR.Services;
///
/// MITRE ATT&CK 规则引擎 —— 第三层复核
/// 基于 MITRE ATT&CK 框架中的内存攻击技术,对 AI 判定结果进行交叉验证
/// 降低误报:AI 标记但规则不匹配 → 降级
/// 提高准确率:AI + 规则双重确认 → 确认为恶意
///
public class RuleEngine
{
private readonly List _rules;
public RuleEngine()
{
_rules = BuildMitreRules();
}
///
/// 对 AI 分类结果进行规则复核
///
public RuleValidationResult Validate(MemoryFeatures features, ClassificationResult aiResult,
BaselineResult baselineResult)
{
var result = new RuleValidationResult();
var matchedRules = new List();
var totalScore = 0.0;
foreach (var rule in _rules)
{
var (matched, confidence) = rule.Evaluate(features);
if (matched)
{
matchedRules.Add(rule);
totalScore += confidence;
result.MatchedTechniques.Add(rule.TechniqueId);
}
}
result.MatchedRuleCount = matchedRules.Count;
result.RuleConfidenceScore = Math.Min(totalScore / Math.Max(_rules.Count, 1), 1.0);
// ─── 三级交叉验证 ───
// AI 分数 + 基线异常 + 规则匹配 = 综合判定
result.AiScore = aiResult.FinalScore;
result.BaselineAnomalyScore = baselineResult.AnomalyScore;
result.RuleScore = result.RuleConfidenceScore;
// 综合分:AI 40% + 基线 30% + 规则 30%
var combinedScore = aiResult.FinalScore * 0.40 +
baselineResult.AnomalyScore * 0.30 +
result.RuleConfidenceScore * 0.30;
result.CombinedScore = Math.Min(combinedScore, 1.0);
// 最终风险等级
result.FinalRiskLevel = result.CombinedScore switch
{
>= 0.75 => RiskLevel.High,
>= 0.45 => RiskLevel.Suspicious,
_ => RiskLevel.Safe
};
// ─── 误报修正逻辑 ───
ApplyFalsePositiveCorrections(result, features);
// 生成综合解释
result.Reasoning = BuildReasoning(result, features, matchedRules);
return result;
}
///
/// 误报修正 —— 对AI高分但规则不匹配的情况进行降级
///
private static void ApplyFalsePositiveCorrections(RuleValidationResult result, MemoryFeatures features)
{
// 修正1: JIT 编译器合法 RWX (.NET, Java, V8)
if (features.RwxPrivatePages > 0 && result.MatchedRuleCount == 0)
{
var name = features.ProcessName.ToLowerInvariant();
var isRuntime = name.Contains("dotnet") || name.Contains("java") ||
name.Contains("node") || name.Contains("python") ||
name.Contains("chrome") || name.Contains("msedge") ||
name.Contains("firefox");
if (isRuntime && features.IsSystemPath && features.IsSigned)
{
// JIT 运行时正常使用 RWX,降级
result.FinalRiskLevel = RiskLevel.Safe;
result.CombinedScore = Math.Min(result.CombinedScore, 0.25);
result.FalsePositiveCorrection = "JIT运行时合法RWX内存(.NET/Java/V8引擎)";
}
}
// 修正2: 安全软件正常行为
if (features.SuspiciousApiStrings.Count > 0 && result.MatchedRuleCount <= 1)
{
var nameLower = features.ProcessName.ToLowerInvariant();
var isSecurity = nameLower.Contains("defender") || nameLower.Contains("antivirus") ||
nameLower.Contains("security") || nameLower.Contains("edr") ||
nameLower.Contains("sentinel") || nameLower.Contains("crowd") ||
nameLower.Contains("carbon") || nameLower.Contains("mcafee");
if (isSecurity && features.IsSigned)
{
result.FinalRiskLevel = RiskLevel.Safe;
result.CombinedScore = Math.Min(result.CombinedScore, 0.20);
result.FalsePositiveCorrection = "安全软件正常行为特征";
return; // 已经确定是误报,无需继续检查
}
}
// 修正2.5: 脚本引擎/Shell自身字符串误匹配
if (features.SuspiciousStringHits > 0 && result.MatchedRuleCount <= 1)
{
var nameLower = features.ProcessName.ToLowerInvariant();
var isScriptEngine = nameLower is "powershell.exe" or "pwsh.exe" or "powershell_ise.exe"
or "cmd.exe" or "wscript.exe" or "cscript.exe" or "conhost.exe"
or "python.exe" or "python3.exe" or "wsl.exe" or "bash.exe";
if (isScriptEngine && features.IsSigned && features.IsSystemPath)
{
result.FinalRiskLevel = RiskLevel.Safe;
result.CombinedScore = Math.Min(result.CombinedScore, 0.15);
result.FalsePositiveCorrection = "脚本引擎自身合法字符串(非恶意注入)";
return;
}
}
// 修正3: 开发工具调试行为
if (features.SuspiciousApiStrings.Count > 0 && result.MatchedRuleCount <= 1)
{
var exeLower = features.ExePath.ToLowerInvariant();
var isDev = exeLower.Contains("visual studio") || exeLower.Contains("jetbrains") ||
exeLower.Contains("vscode") || exeLower.Contains("debugger") ||
exeLower.Contains("ollydbg") || exeLower.Contains("x64dbg") ||
exeLower.Contains("windbg") || exeLower.Contains("ida");
if (isDev)
{
result.FinalRiskLevel = RiskLevel.Safe;
result.CombinedScore = Math.Min(result.CombinedScore, 0.30);
result.FalsePositiveCorrection = "开发/调试工具正常行为";
}
}
}
private static string BuildReasoning(RuleValidationResult result, MemoryFeatures f,
List matchedRules)
{
var parts = new List();
if (result.FalsePositiveCorrection != null)
{
parts.Add($"误报修正: {result.FalsePositiveCorrection}");
}
if (matchedRules.Count > 0)
{
var ruleDescriptions = matchedRules.Take(3)
.Select(r => $"{r.TechniqueId} ({r.TechniqueName})");
parts.Add($"匹配MITRE规则: {string.Join(", ", ruleDescriptions)}");
}
if (f.RwxPrivatePages > 0)
parts.Add($"RWX私有页: {f.RwxPrivatePages}");
if (f.PeMismatchDisk)
parts.Add("Process Hollowing 特征");
if (f.SuspiciousStringHits > 0)
parts.Add($"敏感字符串命中: {f.SuspiciousStringHits}");
parts.Add($"综合评分: AI={result.AiScore:F2} 基线={result.BaselineAnomalyScore:F2} 规则={result.RuleScore:F2} → {result.CombinedScore:F2}");
return string.Join(" | ", parts);
}
// ─── MITRE ATT&CK 内存攻击规则库 ───
private static List BuildMitreRules() => new()
{
// T1055: Process Injection
new MitreRule
{
TechniqueId = "T1055",
TechniqueName = "进程注入",
Description = "通过 VirtualAllocEx/WriteProcessMemory/CreateRemoteThread 实现跨进程代码注入",
EvaluateFunc = f => f.RwxPrivatePages > 0 &&
f.SuspiciousApiStrings.Any(a =>
a.Contains("VirtualAllocEx", StringComparison.OrdinalIgnoreCase) ||
a.Contains("WriteProcessMemory", StringComparison.OrdinalIgnoreCase) ||
a.Contains("CreateRemoteThread", StringComparison.OrdinalIgnoreCase))
},
// T1055.012: Process Hollowing
new MitreRule
{
TechniqueId = "T1055.012",
TechniqueName = "进程掏空 (Process Hollowing)",
Description = "创建挂起进程后掏空原始代码,替换为恶意载荷",
EvaluateFunc = f => f.PeMismatchDisk
},
// T1055.001: Dynamic-link Library Injection
new MitreRule
{
TechniqueId = "T1055.001",
TechniqueName = "DLL注入",
Description = "通过 LoadLibrary/CreateRemoteThread 注入恶意DLL",
EvaluateFunc = f => f.SuspiciousApiStrings.Any(a =>
a.Contains("LoadLibrary", StringComparison.OrdinalIgnoreCase) ||
a.Contains("LdrLoadDll", StringComparison.OrdinalIgnoreCase)) &&
f.SuspiciousApiStrings.Any(a =>
a.Contains("CreateRemoteThread", StringComparison.OrdinalIgnoreCase))
},
// T1620: Reflective Code Loading
new MitreRule
{
TechniqueId = "T1620",
TechniqueName = "反射代码加载",
Description = "在内存中直接加载PE/DLL,不通过标准 LoadLibrary",
EvaluateFunc = f => f.AnonymousExecPages > 0 &&
f.RwxPrivatePages > 0 &&
f.SuspiciousStrings.Any(s =>
s.Contains("ReflectiveLoader", StringComparison.OrdinalIgnoreCase))
},
// T1574.002: DLL Side-Loading
new MitreRule
{
TechniqueId = "T1574.002",
TechniqueName = "DLL侧加载",
Description = "利用合法程序的DLL搜索顺序加载恶意DLL",
EvaluateFunc = f => f.TempPathModules > 0 && f.IsSigned && f.IsSystemPath
},
// T1071: Application Layer Protocol (C2)
new MitreRule
{
TechniqueId = "T1071",
TechniqueName = "C2 通信",
Description = "通过应用层协议与C2服务器通信",
EvaluateFunc = f => f.ForeignConnections > 0 &&
f.SuspiciousPortConnections > 0 &&
f.SuspiciousApiStrings.Any(a =>
a.Contains("connect", StringComparison.OrdinalIgnoreCase) ||
a.Contains("InternetConnect", StringComparison.OrdinalIgnoreCase))
},
// T1095: Non-Application Layer Protocol
new MitreRule
{
TechniqueId = "T1095",
TechniqueName = "非标准协议通信",
Description = "使用非标准协议的网络通信",
EvaluateFunc = f => f.NonStandardPortConnections >= 2 &&
f.ForeignConnections > 0
},
// T1027: Obfuscated Files or Information
new MitreRule
{
TechniqueId = "T1027",
TechniqueName = "代码混淆/加密",
Description = "内存中存在加密或混淆载荷",
EvaluateFunc = f => f.MaxEntropy > 7.2 &&
f.HighEntropyRegions >= 2 &&
f.AnonymousExecPages > 0
},
// T1003.001: LSASS Memory (Credential Dumping)
new MitreRule
{
TechniqueId = "T1003.001",
TechniqueName = "LSASS 凭据转储",
Description = "访问 LSASS 进程内存提取凭据",
EvaluateFunc = f => f.ProcessName.Equals("lsass.exe", StringComparison.OrdinalIgnoreCase) &&
f.SuspiciousApiStrings.Any(a =>
a.Contains("MiniDump", StringComparison.OrdinalIgnoreCase) ||
a.Contains("SamOpenUser", StringComparison.OrdinalIgnoreCase)) ||
f.SuspiciousStrings.Any(s =>
s.Contains("lsass", StringComparison.OrdinalIgnoreCase))
},
// T1036.005: Match Legitimate Name or Location
new MitreRule
{
TechniqueId = "T1036.005",
TechniqueName = "进程名伪装",
Description = "使用合法的系统进程名但位于非系统路径",
EvaluateFunc = f => f.IsSystemProcessName && !f.IsSystemPath
},
// T1547.001: Registry Run Keys
new MitreRule
{
TechniqueId = "T1547.001",
TechniqueName = "注册表持久化",
Description = "通过注册表run键实现持久化驻留",
EvaluateFunc = f => f.SuspiciousStrings.Any(s =>
s.Contains("Run", StringComparison.OrdinalIgnoreCase) &&
(s.Contains("SOFTWARE\\Microsoft\\Windows\\CurrentVersion", StringComparison.OrdinalIgnoreCase) ||
s.Contains("RunOnce", StringComparison.OrdinalIgnoreCase)))
},
// T1496: Resource Hijacking (Crypto Mining)
new MitreRule
{
TechniqueId = "T1496",
TechniqueName = "资源劫持 (挖矿)",
Description = "劫持系统资源进行加密货币挖矿",
EvaluateFunc = f => f.SuspiciousStrings.Any(s =>
s.Contains("stratum", StringComparison.OrdinalIgnoreCase) ||
s.Contains("cryptonight", StringComparison.OrdinalIgnoreCase) ||
s.Contains("coinmine", StringComparison.OrdinalIgnoreCase) ||
s.Contains("mining", StringComparison.OrdinalIgnoreCase))
},
// T1486: Data Encrypted for Impact (Ransomware)
new MitreRule
{
TechniqueId = "T1486",
TechniqueName = "勒索加密",
Description = "加密文件以勒索赎金",
EvaluateFunc = f => f.SuspiciousStrings.Any(s =>
s.Contains("ENCRYPTED", StringComparison.OrdinalIgnoreCase) ||
s.Contains("ransom", StringComparison.OrdinalIgnoreCase) ||
s.Contains("decrypt", StringComparison.OrdinalIgnoreCase)) &&
f.MaxEntropy > 7.0
},
// T1562.001: Disable or Modify Tools
new MitreRule
{
TechniqueId = "T1562.001",
TechniqueName = "禁用安全工具",
Description = "禁用或修改安全软件",
EvaluateFunc = f => f.SuspiciousApiStrings.Any(a =>
a.Contains("AdjustTokenPrivileges", StringComparison.OrdinalIgnoreCase)) &&
f.IsSystemProcessName
},
// T1106: Native API
new MitreRule
{
TechniqueId = "T1106",
TechniqueName = "Native API 调用",
Description = "通过NT原生API绕过用户态Hook",
EvaluateFunc = f => f.SuspiciousApiStrings.Count(a =>
a.StartsWith("Nt", StringComparison.OrdinalIgnoreCase)) >= 2
},
};
}
///
/// MITRE ATT&CK 单条规则定义
///
public class MitreRule
{
public string TechniqueId { get; init; } = "";
public string TechniqueName { get; init; } = "";
public string Description { get; init; } = "";
public Func EvaluateFunc { get; init; } = _ => false;
///
/// 评估规则,返回 (是否匹配, 置信度)
///
public (bool matched, double confidence) Evaluate(MemoryFeatures features)
{
try
{
var match = EvaluateFunc(features);
return (match, match ? 1.0 : 0.0);
}
catch
{
return (false, 0);
}
}
}
///
/// 规则引擎验证结果
///
public class RuleValidationResult
{
public double AiScore { get; set; }
public double BaselineAnomalyScore { get; set; }
public double RuleScore { get; set; }
public double CombinedScore { get; set; }
public RiskLevel FinalRiskLevel { get; set; } = RiskLevel.Safe;
public int MatchedRuleCount { get; set; }
public List MatchedTechniques { get; set; } = new();
public double RuleConfidenceScore { get; set; }
public string Reasoning { get; set; } = "";
public string? FalsePositiveCorrection { get; set; }
}