< Summary

Information
Class: Intentum.Core.UBA.UserBehaviorRules
Assembly: Intentum.Core
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Core/UBA/UserBehaviorRules.cs
Line coverage
94%
Covered lines: 54
Uncovered lines: 3
Coverable lines: 57
Total lines: 89
Line coverage: 94.7%
Branch coverage
73%
Covered branches: 28
Total branches: 38
Branch coverage: 73.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
InsiderThreat(...)87.5%161695.23%
DataExfiltration(...)75%8892.3%
AnomalousAccess(...)57.14%141494.44%
AllRules()100%11100%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Core/UBA/UserBehaviorRules.cs

#LineLine coverage
 1using Intentum.Core.Behavior;
 2using Intentum.Core.Models;
 3
 4namespace Intentum.Core.UBA;
 5
 6/// <summary>
 7/// Pre-built User Behavior Analytics (UBA) rules for detecting insider threats,
 8/// anomalous access patterns, and data exfiltration attempts.
 9/// </summary>
 10public static class UserBehaviorRules
 11{
 12    /// <summary>
 13    /// Detects potential insider threat: off-hours access + bulk data download + privilege escalation.
 14    /// </summary>
 15    public static Func<BehaviorSpace, RuleMatch?> InsiderThreat(
 316        double confidence = 0.85) => space =>
 217    {
 218        var bulkDownload = space.Events.Count(e =>
 919            e.Action.Contains("download", StringComparison.OrdinalIgnoreCase) ||
 920            e.Action.Contains("export", StringComparison.OrdinalIgnoreCase));
 221        var sensitiveAccess = space.Events.Count(e =>
 922            e.Action.Contains("sensitive", StringComparison.OrdinalIgnoreCase) ||
 923            e.Action.Contains("confidential", StringComparison.OrdinalIgnoreCase) ||
 924            e.Action.Contains("admin", StringComparison.OrdinalIgnoreCase));
 225        var hasPrivilegeEscalation = space.Events.Any(e =>
 826            e.Action.Contains("privilege", StringComparison.OrdinalIgnoreCase) ||
 827            e.Action.Contains("role.change", StringComparison.OrdinalIgnoreCase));
 328
 229        if (bulkDownload >= 3 && sensitiveAccess >= 2)
 130            return new RuleMatch("InsiderThreat", confidence,
 131                $"Bulk downloads: {bulkDownload}, sensitive access: {sensitiveAccess}, privilege escalation: {hasPrivile
 132        if (hasPrivilegeEscalation && sensitiveAccess >= 1)
 133            return new RuleMatch("InsiderThreat", confidence * 0.9,
 134                $"Privilege escalation with sensitive access: {sensitiveAccess}");
 035        return null;
 536    };
 37
 38    /// <summary>
 39    /// Detects data exfiltration: large file transfers, USB usage, email attachments.
 40    /// </summary>
 41    public static Func<BehaviorSpace, RuleMatch?> DataExfiltration(
 42        int minTransfers = 3,
 243        double confidence = 0.8) => space =>
 144    {
 145        var transfers = space.Events.Count(e =>
 446            e.Action.Contains("transfer", StringComparison.OrdinalIgnoreCase) ||
 447            e.Action.Contains("upload", StringComparison.OrdinalIgnoreCase) ||
 448            e.Action.Contains("usb", StringComparison.OrdinalIgnoreCase) ||
 449            e.Action.Contains("attachment", StringComparison.OrdinalIgnoreCase));
 250
 151        if (transfers >= minTransfers)
 152            return new RuleMatch("DataExfiltration", confidence,
 153                $"Suspicious transfers: {transfers}");
 054        return null;
 355    };
 56
 57    /// <summary>
 58    /// Detects anomalous access patterns: unusual time, location, or resource access.
 59    /// </summary>
 60    public static Func<BehaviorSpace, RuleMatch?> AnomalousAccess(
 261        double confidence = 0.7) => space =>
 162    {
 163        var offHoursAccess = space.Events.Any(e =>
 264            e.Action.Contains("off-hours", StringComparison.OrdinalIgnoreCase) ||
 265            e.Action.Contains("weekend", StringComparison.OrdinalIgnoreCase));
 166        var newLocationAccess = space.Events.Any(e =>
 367            e.Action.Contains("new.location", StringComparison.OrdinalIgnoreCase) ||
 368            e.Action.Contains("vpn.new", StringComparison.OrdinalIgnoreCase));
 169        var unusualResource = space.Events.Any(e =>
 370            e.Action.Contains("first.access", StringComparison.OrdinalIgnoreCase) ||
 371            e.Action.Contains("unusual.resource", StringComparison.OrdinalIgnoreCase));
 272
 173        var anomalyCount = (offHoursAccess ? 1 : 0) + (newLocationAccess ? 1 : 0) + (unusualResource ? 1 : 0);
 174        if (anomalyCount >= 2)
 175            return new RuleMatch("AnomalousAccess", confidence,
 176                $"Off-hours: {offHoursAccess}, new location: {newLocationAccess}, unusual resource: {unusualResource}");
 077        return null;
 378    };
 79
 80    /// <summary>
 81    /// Returns all standard UBA rules in recommended evaluation order.
 82    /// </summary>
 83    public static IReadOnlyList<Func<BehaviorSpace, RuleMatch?>> AllRules() =>
 184    [
 185        InsiderThreat(),
 186        DataExfiltration(),
 187        AnomalousAccess()
 188    ];
 89}