<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Chad Ray</title>
    <description>The latest articles on DEV Community by Chad Ray (@chad_ray_7d6ba00911308ded).</description>
    <link>https://dev.to/chad_ray_7d6ba00911308ded</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4124159%2Fc4906426-59ef-41af-bdee-e12b503b9166.png</url>
      <title>DEV Community: Chad Ray</title>
      <link>https://dev.to/chad_ray_7d6ba00911308ded</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chad_ray_7d6ba00911308ded"/>
    <language>en</language>
    <item>
      <title>Beyond Auditd: Logster and the Case for Kernel-Level Threat Detection</title>
      <dc:creator>Chad Ray</dc:creator>
      <pubDate>Mon, 19 Oct 2026 11:05:33 +0000</pubDate>
      <link>https://dev.to/chad_ray_7d6ba00911308ded/beyond-auditd-logster-and-the-case-for-kernel-level-threat-detection-5hke</link>
      <guid>https://dev.to/chad_ray_7d6ba00911308ded/beyond-auditd-logster-and-the-case-for-kernel-level-threat-detection-5hke</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Auditd isn't bad software. It's software solving a 2004 problem we stopped having. Here's why the filter has to move into the kernel.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The last time auditd actually caught something in my environment, it was 3 a.m. and the alert landed forty minutes after the attacker had already pivoted. Not because the rule was wrong. Because the box was under enough load that the audit backlog filled, records got dropped, and the one &lt;code&gt;execve&lt;/code&gt; that mattered never made it to disk.&lt;/p&gt;

&lt;p&gt;Auditd isn't bad software. It's software solving a 2004 problem extremely well, and then being asked to solve a 2025 problem it was never designed for. That gap is why kernel-level visibility has quietly gone from a nice-to-have to the baseline everyone eventually arrives at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auditd is a queue with a rulebook
&lt;/h2&gt;

&lt;p&gt;Strip away the tooling and auditd is a rule-matching engine in the kernel's audit subsystem that hands matching syscall records to a single userspace daemon over a netlink socket. You write rules: watch &lt;code&gt;execve&lt;/code&gt;, watch writes to &lt;code&gt;/etc/passwd&lt;/code&gt;, watch &lt;code&gt;connect&lt;/code&gt;. The kernel matches them, and &lt;code&gt;auditd&lt;/code&gt; drains the queue and writes records to &lt;code&gt;/var/log/audit/audit.log&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That design has two properties that were sensible in 2004 and are load-bearing failures now.&lt;/p&gt;

&lt;p&gt;First, the filtering is coarse, and the real decision happens too late. You can match on syscall number, uid, a watched path, a few fields. What you cannot say is "record this &lt;code&gt;openat&lt;/code&gt; only if the process isn't one of my forty known-benign scanners," or "dedup identical outbound connects inside a five-second window." Any logic richer than field-equality runs &lt;em&gt;after&lt;/em&gt; the record has been formatted and shipped to userspace. You pay the full cost of every event, then decide it was noise.&lt;/p&gt;

&lt;p&gt;Second, the transport is a queue, and queues overflow. Every matched record crosses netlink into that one daemon. Run a &lt;code&gt;find /&lt;/code&gt; across a large filesystem and you generate hundreds of thousands of &lt;code&gt;openat&lt;/code&gt; calls in seconds. The backlog fills, and now &lt;code&gt;failure&lt;/code&gt; mode picks your poison: silently drop records, or &lt;code&gt;panic&lt;/code&gt; and take the host down. Most shops run drop mode and learn about it during the incident where the record they needed was one of the dropped ones.&lt;/p&gt;

&lt;p&gt;I've watched a single sloppy file-access rule produce something like 85 to 90% of all audit volume on a host: &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;getcap&lt;/code&gt;, and &lt;code&gt;ps&lt;/code&gt; walking &lt;code&gt;/proc&lt;/code&gt; and eating &lt;code&gt;EACCES&lt;/code&gt; at every step. The signal wasn't buried. It was evicted.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workaround economy
&lt;/h2&gt;

&lt;p&gt;The fair rebuttal is: so tune your rules. Agreed, a disciplined ruleset with tight path watches and aggressive exclusions gets you a long way. I've written those. They hold until the workload changes, and then you're back in the backlog.&lt;/p&gt;

&lt;p&gt;The structural problem is that auditd pushes you into a workaround economy. You can't express the filter you want in the kernel, so you ship everything to userspace and filter there, in the SIEM, in Logstash or in a stream processor. By then you've already paid the collection cost, the netlink cost, the serialization cost, and the network cost to move data you're about to discard. You end up running an entire pipeline whose main job is throwing away 90% of what the previous stage worked to produce. That's not detection engineering; it's plumbing built to compensate for a drain in the wrong place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The filter belongs where the event is born
&lt;/h2&gt;

&lt;p&gt;Here's the whole argument in one move. When a process calls &lt;code&gt;connect()&lt;/code&gt;, at that instant, in kernel context, you already have everything: the calling task, its full ancestry, the socket, the destination, the namespace it lives in. If you can run a small, safe program &lt;em&gt;right there&lt;/em&gt;, you decide keep/drop/dedup/enrich in place and surface only the fraction that matters. The rest never gets copied, never gets serialized, never touches a queue.&lt;/p&gt;

&lt;p&gt;Concretely, compare what you can &lt;em&gt;say&lt;/em&gt; in each model. An audit rule watching outbound network activity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# auditd: match every connect() syscall for uid &amp;gt;= 1000.
# Filtering stops here. "Which destination? dedup? skip my scanners?"
# all happen later, in userspace, after you've paid to ship each one.
&lt;/span&gt;-&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt;,&lt;span class="n"&gt;exit&lt;/span&gt; -&lt;span class="n"&gt;F&lt;/span&gt; &lt;span class="n"&gt;arch&lt;/span&gt;=&lt;span class="n"&gt;b64&lt;/span&gt; -&lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; -&lt;span class="n"&gt;F&lt;/span&gt; &lt;span class="n"&gt;auid&lt;/span&gt;&amp;gt;=&lt;span class="m"&gt;1000&lt;/span&gt; -&lt;span class="n"&gt;F&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;=&lt;span class="n"&gt;net&lt;/span&gt;-&lt;span class="n"&gt;connect&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rough eBPF equivalent, where the decision is made in the kernel before anything is emitted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;SEC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tracepoint/syscalls/sys_enter_connect"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;on_connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;trace_event_raw_sys_enter&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;__u32&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bpf_get_current_pid_tgid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_known_scanner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// drop noise in-kernel&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seen_recently&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;daddr&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// dedup in-kernel&lt;/span&gt;
    &lt;span class="n"&gt;emit_enriched&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;daddr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dport&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;             &lt;span class="c1"&gt;// only survivors cross to userspace&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same syscall, completely different economics. The audit rule is a wiretap that records everything and sorts it out downstream. The eBPF program is a bouncer at the door. Falco, Tetragon, and Tracee all landed on this model independently, and that convergence matters: three teams with different goals reaching the same architecture is a strong signal it's the shape of the problem, not a fashion.&lt;/p&gt;

&lt;h2&gt;
  
  
  But we've tried kernel-level before
&lt;/h2&gt;

&lt;p&gt;We have, in two ways, and both taught us something.&lt;/p&gt;

&lt;p&gt;Kernel modules give you all the visibility and all the risk. A bug in your out-of-tree module is a kernel panic, a null deref in ring 0, a host that doesn't come back. Nearly every EDR that shipped a kernel driver has, at some point, panicked or blue-screened a fleet on a bad update. Visibility was never the problem there; blast radius was.&lt;/p&gt;

&lt;p&gt;ptrace-based approaches (the &lt;code&gt;strace&lt;/code&gt; lineage) get you syscall detail without a module, but ptrace stops the tracee twice per syscall and context-switches to the tracer each time. It's a debugging interface, not fleet telemetry. On syscall-heavy workloads that overhead isn't a few percent. &lt;code&gt;strace&lt;/code&gt; can slow a program by an order of magnitude, and I don't turn it on in production without a reason and a stopwatch.&lt;/p&gt;

&lt;p&gt;So the bar for "detection in the kernel" was never just visibility. It was visibility &lt;em&gt;without&lt;/em&gt; a module's panic risk and &lt;em&gt;without&lt;/em&gt; ptrace's overhead. That specific combination is the actual news. Not that the kernel sees more (everyone always knew that), but that you can finally run your own logic up there without betting the host on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where auditd still wins
&lt;/h2&gt;

&lt;p&gt;I'd be selling you something if I called auditd dead. There are places I'd still reach for it first.&lt;/p&gt;

&lt;p&gt;For a &lt;strong&gt;compliance checkbox&lt;/strong&gt; (CIS, PCI, a control that says "audit logs must exist"), auditd is the blessed, documented, auditor-recognized answer. Rolling your own eBPF collector to satisfy that control is a fine way to fail an assessment for no upside.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;ancient kernels&lt;/strong&gt;, a fleet frozen on RHEL 7 / 3.10 that nobody will let you touch, the eBPF features you'd actually want aren't there, and auditd is what you've got.&lt;/p&gt;

&lt;p&gt;And in an &lt;strong&gt;air-gapped, change-frozen&lt;/strong&gt; environment, "it's in the base OS and the auditors already trust it" is a genuine operational advantage a new agent has to earn, not wave away.&lt;/p&gt;

&lt;p&gt;None of that changes the direction of travel. It just makes this a migration, not a conversion.&lt;/p&gt;

&lt;p&gt;That's the split we ended up with building Logster, an AI-driven endpoint threat detection platform: it supports both kernel-level collection and auditd, because real Linux fleets have both. The 85 to 90% figure above came from that same work. It's the workaround economy in miniature: we fixed it, but only after the flood had shown us where the rule was too broad.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tax nobody warns you about
&lt;/h2&gt;

&lt;p&gt;Kernel-level detection isn't free, and the cost isn't compute. It's people. The team that can write and debug a verifier-approved BPF program is smaller than the team that can write an audit rule. When the verifier rejects your program at load time with a message that reads like a compiler venting its frustrations, there's no Stack Overflow answer waiting for you. You'll also chase version drift: what loaded cleanly on 5.15 behaves differently on 6.8, and your CI matrix grows a dimension it didn't have.&lt;/p&gt;

&lt;p&gt;That's a real tax. But it's paid by the &lt;em&gt;builders&lt;/em&gt;, once, up front. Auditd's tax is paid by the &lt;em&gt;detection itself&lt;/em&gt;, every time the host gets busy and the records you needed quietly evaporate. I know which debt I'd rather carry. The threats moved into the space between syscalls years ago; our visibility is only now able to follow them there safely.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>linux</category>
      <category>security</category>
    </item>
    <item>
      <title>Show Your Work: Logster and Detection That Explains Its Alerts and Its Silences</title>
      <dc:creator>Chad Ray</dc:creator>
      <pubDate>Mon, 19 Oct 2026 10:47:23 +0000</pubDate>
      <link>https://dev.to/chad_ray_7d6ba00911308ded/show-your-work-logster-and-detection-that-explains-its-alerts-and-its-silences-53cp</link>
      <guid>https://dev.to/chad_ray_7d6ba00911308ded/show-your-work-logster-and-detection-that-explains-its-alerts-and-its-silences-53cp</guid>
      <description>&lt;p&gt;Every maths teacher has written the same note in the margin: &lt;em&gt;show your work.&lt;/em&gt; A correct answer with no working earns partial credit. A wrong answer with clear working can still be fixed, because the teacher can see where the reasoning went wrong.&lt;/p&gt;

&lt;p&gt;Security teams rarely get that courtesy from their tools. An alert arrives with a severity, a technique ID and perhaps a score. The analyst then does the working backwards, reconstructing why the system reached that conclusion before deciding whether they agree with it.&lt;/p&gt;

&lt;p&gt;The same problem runs the other way, and there it is quieter and more dangerous. When a detection is tuned to stop firing on something benign, the tuning usually shows even less of its reasoning than the alert did. Nobody reviews an alert that never fires.&lt;/p&gt;

&lt;p&gt;This article looks at both halves of the problem: verdicts that can't show their work, and silences that can't either.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An alert is only as useful as the evidence an analyst can check behind it; a score alone forces them to reconstruct the reasoning.&lt;/li&gt;
&lt;li&gt;Suppressions and exclusions are detection logic too. Broad ones can become places for an attacker to hide.&lt;/li&gt;
&lt;li&gt;A good system ties every verdict to specific observed activity and keeps each suppression narrow, visible and testable before it takes effect.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Alerts that can't show their reasoning
&lt;/h2&gt;

&lt;p&gt;Picture two alerts for the same host.&lt;/p&gt;

&lt;p&gt;The first reads: &lt;em&gt;Suspicious PowerShell activity. Severity high.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The second reads: &lt;em&gt;A document viewer launched PowerShell with an encoded command. That PowerShell process wrote a script to a temporary folder, and a scheduled task registered a minute later points to that script.&lt;/em&gt; Each clause links to the process, the file and the task it refers to.&lt;/p&gt;

&lt;p&gt;Both might be correct. Only the second can be checked in a minute. With the first, the analyst still has to open the process tree, find the parent, look for file writes, and search for persistence, which is the investigation the alert was supposed to start.&lt;/p&gt;

&lt;p&gt;Pattern-matching rules have always had a partial answer here: the rule itself is the explanation. If a rule fires on "Office application spawns a shell", the analyst knows what it matched. That transparency is one reason rules remain valuable.&lt;/p&gt;

&lt;p&gt;Model-driven detection makes the problem harder. A statistical score says &lt;em&gt;how&lt;/em&gt; sure the model is, not &lt;em&gt;why&lt;/em&gt;. A language model can produce a fluent explanation, but a fluent paragraph is not evidence. The model may describe a connection that isn't in the records. The paragraph and the telemetry need to be tied together, or the analyst is simply trading one kind of reconstruction for another: checking whether the prose is true.&lt;/p&gt;

&lt;p&gt;So the useful question isn't "Does the detector explain itself?" It is "Can each step of the explanation be traced to something that was actually observed?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Suppressions that hide more than they should
&lt;/h2&gt;

&lt;p&gt;Every production detection program tunes. A backup agent that reads thousands of files every night, or a software deployment tool that launches scripts across the fleet, will generate noise until someone suppresses it. That work is necessary; an untuned system buries real findings.&lt;/p&gt;

&lt;p&gt;The trouble is the shape suppressions tend to take under pressure. The fastest fix is broad: exclude a directory, a process name or a whole host. Such rules often contain wildcards and are rarely reviewed again.&lt;/p&gt;

&lt;p&gt;Attackers understand this. MITRE ATT&amp;amp;CK documents &lt;em&gt;Impair Defenses: Disable or Modify Tools&lt;/em&gt; (T1562.001), which covers adversaries modifying or disabling security tooling to avoid detection. (&lt;a href="https://attack.mitre.org/techniques/T1562/001/" rel="noopener noreferrer"&gt;MITRE ATT&amp;amp;CK, T1562.001&lt;/a&gt;) Adding an exclusion is one quiet way to do that. One who finds an existing exclusion that is broad enough doesn't need to add anything.&lt;/p&gt;

&lt;p&gt;Consider a hypothetical suppression that matches any process whose path contains a trusted vendor's folder name. It was written to silence an updater. It also matches a binary an attacker drops into a subfolder of that directory, and anything that binary launches. The rule matched a &lt;em&gt;name&lt;/em&gt;. It had no way to notice that the &lt;em&gt;behaviour&lt;/em&gt; around that name had changed.&lt;/p&gt;

&lt;p&gt;CISA's joint guidance on living-off-the-land techniques recommends establishing and maintaining baselines of normal network, user and administrative activity, and comparing current activity against them. (&lt;a href="https://www.ic3.gov/CSA/2024/240207-2.pdf" rel="noopener noreferrer"&gt;CISA and partners, February 2024&lt;/a&gt;) A suppression is a baseline written down, and a baseline is only safe if it describes &lt;em&gt;what normal looks like&lt;/em&gt;, not merely &lt;em&gt;who is usually present&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "showing your work" would require
&lt;/h2&gt;

&lt;p&gt;Put the two halves together and a set of requirements emerges. None is exotic on its own. The difficulty is getting all of them in one system.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;For verdicts&lt;/th&gt;
&lt;th&gt;For suppressions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Grounding&lt;/td&gt;
&lt;td&gt;Every reasoning step points to observed entities&lt;/td&gt;
&lt;td&gt;Every rule matches observed attributes, not substrings of them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;The verdict covers a connected set of activity, not a single event&lt;/td&gt;
&lt;td&gt;A match covers only benign activity, not whatever that activity spawned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visibility&lt;/td&gt;
&lt;td&gt;The analyst can see what the conclusion relied on&lt;/td&gt;
&lt;td&gt;The team can see what a rule would suppress before it does&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Honest failure&lt;/td&gt;
&lt;td&gt;"Could not decide" is distinct from "benign"&lt;/td&gt;
&lt;td&gt;A rule that stops matching stops suppressing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The common thread is that both the alert and the silence should be decisions about &lt;em&gt;structure&lt;/em&gt;: which process did what, to what, and in what order. That is also the information an analyst needs to judge either one.&lt;/p&gt;

&lt;h2&gt;
  
  
  One way to build it
&lt;/h2&gt;

&lt;p&gt;This is the design behind Logster, an AI-driven endpoint threat detection platform that the team behind these articles builds. Here is what it offers for each requirement, and where the approach has limits.&lt;/p&gt;

&lt;p&gt;Logster connects the activity on each Windows and Linux endpoint into a single picture of what happened, so related actions are judged together rather than one event at a time. Each verdict comes with a written explanation of how it was reached.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grounding the verdict.&lt;/strong&gt; When an analyst investigates an attack verdict, each step of the AI model's explanation is linked to the specific processes, files and connections it refers to. Clicking a step highlights them. The linking annotates the verdict; it never changes it. The prose now points to evidence, and the analyst can check whether that evidence says what the prose claims.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scoping the silence.&lt;/strong&gt; Analysts suppress known-benign activity by approving patterns of &lt;em&gt;behaviour&lt;/em&gt; rather than names. A rule matches what it was written for, not everything that happens to resemble it, so a rule written for a vendor's updater doesn't &lt;em&gt;accidentally&lt;/em&gt; cover a file dropped beside it. Anything broader has to be written explicitly, where a reviewer can see it.&lt;/p&gt;

&lt;p&gt;The subtle part is what happens when approved activity changes. If the trusted updater suddenly launches a shell that nothing approved, that activity stays in view and is still assessed. The exclusion covers the behaviour it was written for and stops there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Making silence visible.&lt;/strong&gt; A new rule can be trialled before it takes effect: the team sees what it would have suppressed while nothing is hidden. Once it is live, every verdict records what was suppressed. Before a suppression goes live, and long after it does, the team can see exactly what it is hiding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failing honestly.&lt;/strong&gt; If the AI model can't reach a verdict, Logster reports a failure, not a clean result. A finding set aside by tuning stays on record with the reason, so reviewers can still find it rather than losing it entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the working still runs out
&lt;/h2&gt;

&lt;p&gt;Showing your work does not guarantee the answer is right.&lt;/p&gt;

&lt;p&gt;Linking an explanation to evidence ties it to real activity, but an explanation can cite real activity and still draw the wrong conclusion from it. The highlighting makes that easier to catch, not impossible to happen. Model confidence is not a calibrated probability until someone measures it against labelled data.&lt;/p&gt;

&lt;p&gt;Any verdict also rests only on what was collected. If telemetry is missing or the activity that explains an event happened earlier than what was assessed, the verdict rests on less than the full picture. A narrow suppression rule is still only as good as the analyst's judgement about what counts as benign, and a pattern that is normal today can be abused tomorrow.&lt;/p&gt;

&lt;p&gt;Architecture describes intent. Detection quality, false-positive rates and time saved still need to be measured against real attacks and real workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mark the paper
&lt;/h2&gt;

&lt;p&gt;The next time you review your detection stack, grade both columns.&lt;/p&gt;

&lt;p&gt;For a recent alert, ask: could an analyst verify it from the alert alone, or did they have to rebuild the story? Does every claim in the explanation point to a specific event?&lt;/p&gt;

&lt;p&gt;For your suppressions, ask harder questions. Which of them match on a substring or wildcard? What would happen if an allowed process launched something new? When did anyone last look at what each one is hiding?&lt;/p&gt;

&lt;p&gt;A detection system earns trust the way a student does: by showing work that holds up when someone checks it. That applies to the answers it gives and to the questions it has been told to stop asking.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>infosec</category>
      <category>security</category>
    </item>
    <item>
      <title>When Every Event Looks Normal: Logster and the Context Gap in Endpoint Detection</title>
      <dc:creator>Chad Ray</dc:creator>
      <pubDate>Mon, 14 Sep 2026 08:39:40 +0000</pubDate>
      <link>https://dev.to/chad_ray_7d6ba00911308ded/when-every-event-looks-normal-logster-and-the-context-gap-in-endpoint-detection-o2b</link>
      <guid>https://dev.to/chad_ray_7d6ba00911308ded/when-every-event-looks-normal-logster-and-the-context-gap-in-endpoint-detection-o2b</guid>
      <description>&lt;p&gt;A PowerShell process starts. A script appears in a temporary directory. A scheduled task is registered. A connection goes out to an unfamiliar address.&lt;/p&gt;

&lt;p&gt;An analyst could find a reasonable explanation for each of those actions. Software deployment, perhaps. A maintenance job. An administrator troubleshooting a workstation.&lt;/p&gt;

&lt;p&gt;But were they part of the same operation? Did the process that downloaded the script also arrange for it to run at the next login? Was that process launched by the expected management agent, or by something that had no reason to start a shell?&lt;/p&gt;

&lt;p&gt;Those questions change the investigation. The challenge is getting enough context to answer them before the activity disappears into another day of logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeways&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Legitimate tools can perform malicious actions; their names alone rarely settle an investigation.&lt;/li&gt;
&lt;li&gt;Relationships between processes, files, and connections help distinguish routine work from suspicious behavior.&lt;/li&gt;
&lt;li&gt;Automated analysis is useful when it preserves evidence and reduces the work needed to investigate a finding.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Familiar tools leave ambiguous evidence
&lt;/h2&gt;

&lt;p&gt;Living off the land means abusing tools and capabilities already available in the environment. Their legitimate uses give attackers room to blend into routine administration.&lt;/p&gt;

&lt;p&gt;CISA and its partners describe this detection challenge in their joint guidance, &lt;em&gt;Identifying and Mitigating Living Off the Land Techniques&lt;/em&gt;. They emphasize detailed logging, established baselines, and correlation to distinguish malicious activity from legitimate operations. Recognizing an executable is only one part of understanding its use. (&lt;a href="https://www.ic3.gov/CSA/2024/240207-2.pdf" rel="noopener noreferrer"&gt;CISA and partners, February 2024&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The wider threat data reinforces why signatures alone are insufficient. CrowdStrike's 2026 Global Threat Report states that &lt;strong&gt;82% of detections in 2025 were malware-free&lt;/strong&gt;. That describes CrowdStrike's observed detections, not all attacks worldwide, and malware-free activity is broader than living off the land. It does, however, show why detection cannot depend entirely on finding a malicious file. (&lt;a href="https://www.crowdstrike.com/en-us/global-threat-report/" rel="noopener noreferrer"&gt;CrowdStrike, 2026 Global Threat Report&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Consider this hypothetical Windows sequence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A process launches PowerShell with an encoded command.&lt;/li&gt;
&lt;li&gt;PowerShell writes a script into a temporary directory.&lt;/li&gt;
&lt;li&gt;A child process registers a scheduled task that references that script.&lt;/li&gt;
&lt;li&gt;The same process tree contacts an external destination and queries domain accounts.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is an illustration, not a captured incident. It also isn't proof of compromise: administration software can perform similar operations. Some of the individual actions may already trigger good detections.&lt;/p&gt;

&lt;p&gt;What makes the sequence worth investigating is the connection between the actions. A newly written script, a persistence mechanism pointing to it, and related discovery activity give an analyst a more specific question than “Was PowerShell running?”&lt;/p&gt;

&lt;h2&gt;
  
  
  Collecting the events is only the beginning
&lt;/h2&gt;

&lt;p&gt;A searchable log store can contain every relevant record and still leave considerable work for the analyst.&lt;/p&gt;

&lt;p&gt;The process creation event may live in one view, the file write in another, and the network connection in a third. Before making a judgment, someone has to establish which process performed each action, reconstruct its ancestry, and align the timestamps. Missing identifiers or incomplete collection make that harder.&lt;/p&gt;

&lt;p&gt;Existing tools already address parts of this problem. Event correlation is an established capability: Elastic's EQL rules, for example, can match ordered sequences and join events through shared fields such as process or host identifiers. It would be inaccurate to say that rules only understand isolated events. (&lt;a href="https://www.elastic.co/docs/solutions/security/detect-and-alert/eql" rel="noopener noreferrer"&gt;Elastic, Event correlation rules&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The practical challenge is coverage. A correlation rule describes a relationship its author anticipated. Detection engineers still have to choose which sequences matter, tune them against legitimate operations, and maintain them as the environment changes.&lt;/p&gt;

&lt;p&gt;A useful additional capability would preserve the surrounding behavior even when it doesn't match a prewritten sequence. That gives both automated analysis and the person reviewing its result more evidence to work with.&lt;/p&gt;

&lt;h2&gt;
  
  
  A process tree helps, but the activity extends beyond it
&lt;/h2&gt;

&lt;p&gt;A behavior graph connects the entities involved in an operation. Processes, files, and network destinations become nodes; actions such as spawning, writing, and connecting become edges. Timestamps help retain the order in which those actions occurred.&lt;/p&gt;

&lt;p&gt;The value becomes clearer when you compare the questions available at each level:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Recorded activity&lt;/th&gt;
&lt;th&gt;Context that helps explain it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PowerShell started&lt;/td&gt;
&lt;td&gt;Which parent launched it, with what command line and account?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A script was written&lt;/td&gt;
&lt;td&gt;Which process wrote it, and was it subsequently executed?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A scheduled task was registered&lt;/td&gt;
&lt;td&gt;What does it run, and how does that target relate to earlier activity?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An outbound connection occurred&lt;/td&gt;
&lt;td&gt;Which process opened it, and what else did that process do?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A graph does not make these actions malicious. It makes their relationships available for analysis. A management agent carrying out an expected deployment and an unexpected shell arranging persistence may use overlapping tools while producing different surrounding behavior.&lt;/p&gt;

&lt;p&gt;Nor does proximity prove causation. Two events on the same host within a minute are not automatically related. Reliable process identity, explicit file references, and observed parent-child relationships matter more than simply drawing lines between nearby timestamps. This also connects detection quality to collection quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the context available before an analyst opens the alert
&lt;/h2&gt;

&lt;p&gt;Once activity has been organized into a graph, a detector can assess a connected set of actions. Rules, graph models, and language models offer different ways to do that; the representation and the method used to evaluate it are separate choices.&lt;/p&gt;

&lt;p&gt;A language model can receive a textual representation of the graph alongside instructions about suspicious behavior and legitimate operating patterns. The intended benefit is contextual assessment: examining what the connected actions suggest, then returning a structured result that the surrounding system can process.&lt;/p&gt;

&lt;p&gt;Logster is one implementation of this approach. It is an endpoint threat detection platform for SOC teams, with ingestion paths for Windows Sysmon and PowerShell logs and Linux auditd and eBPF telemetry. Its pipeline normalizes incoming records and builds activity graphs over per-endpoint windows.&lt;/p&gt;

&lt;p&gt;In the current implementation, an LLM classifier evaluates the serialized graph and supplies the verdict, subject to configured thresholds. The platform also provides alerts, graph views, and process trees for investigation. This brings the connection between collection, detection, and investigation into the same workflow: the relationships assembled for analysis can also help the analyst understand the finding.&lt;/p&gt;

&lt;p&gt;That is the useful idea here. Instead of beginning every investigation by reconstructing how disconnected records fit together, the analyst can start with an assembled account of the observed activity and test whether the conclusion is supported.&lt;/p&gt;

&lt;p&gt;The architecture alone does not establish detection accuracy or time saved. Those outcomes need to be measured against representative attacks and legitimate workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  The context still has limits
&lt;/h2&gt;

&lt;p&gt;Any verdict is bounded by the evidence the system collected and retained.&lt;/p&gt;

&lt;p&gt;A short activity window may miss an earlier action that explains what happened next. An endpoint graph cannot, by itself, establish the full story of an operation spanning several hosts. Missing script content or incomplete process ancestry can leave crucial questions unanswered.&lt;/p&gt;

&lt;p&gt;Model input limits add another constraint. Logster's serializer includes mechanisms to compact and truncate oversized graphs to fit the available input budget. A model may therefore receive less detail than the complete collected window. Evaluating what survives that reduction matters as much as evaluating the model's answer.&lt;/p&gt;

&lt;p&gt;A language model can also produce a plausible explanation that the records do not support. Its reported confidence should not be treated as a calibrated probability of correctness without validation. An analyst needs a way to inspect the evidence behind the conclusion.&lt;/p&gt;

&lt;p&gt;Operational failures deserve equally clear treatment. In Logster's current classifier resolution path, a failed model call or missing verdict is reported as an error. Separately, model attack verdicts that fall below the configured probability or confidence thresholds are demoted to benign, with a suppression reason recorded. Both behaviors matter when measuring coverage: an unavailable decision and a suppressed finding need to be visible during evaluation.&lt;/p&gt;

&lt;p&gt;These constraints leave plenty of room for conventional controls. Known malicious artifacts and well-understood behaviors still warrant direct detection. Contextual analysis adds value when the ambiguity lies in how otherwise familiar actions fit together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evaluate the investigation, not just the alert
&lt;/h2&gt;

&lt;p&gt;A practical evaluation should pair a suspicious sequence with a legitimate workflow that uses similar tools. A scripted software deployment is a useful comparison for a sequence involving script execution, downloads, and scheduled tasks.&lt;/p&gt;

&lt;p&gt;Ask the system to show what distinguishes them. Then inspect the evidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it preserve the process ancestry and relevant command lines?&lt;/li&gt;
&lt;li&gt;Can the reviewer follow a file from creation to later use?&lt;/li&gt;
&lt;li&gt;Are the claimed relationships observed, or inferred only from timing?&lt;/li&gt;
&lt;li&gt;What happens when activity crosses a window boundary or telemetry is missing?&lt;/li&gt;
&lt;li&gt;How often does it flag legitimate work, miss the test attack, or fail to produce a verdict?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Measure time to a supported decision alongside detection results. An alert that names a technique but leaves the analyst to reconstruct everything may offer less operational value than its demo suggests.&lt;/p&gt;

&lt;p&gt;The next time a detection fires on a familiar administrative tool, follow the actions around it. Check who launched it, what it changed, and what followed. A useful endpoint detection system should make that investigation easier to begin and easier to verify.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tags: Endpoint Detection, Living off the Land, Security Operations, Behavioral Analysis, Logster&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>cybersecurity</category>
    </item>
  </channel>
</rss>
