<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Lactf 2025 on kiperZ</title>
    <link>https://kiperz.dev/tags/lactf-2025/</link>
    <description>Recent content in Lactf 2025 on kiperZ</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 17 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://kiperz.dev/tags/lactf-2025/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Messenger - LACTF 2025</title>
      <link>https://kiperz.dev/writeups/messenger/</link>
      <pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate>
      <guid>https://kiperz.dev/writeups/messenger/</guid>
      <description>&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;A 3-byte heap OOB write in &lt;code&gt;msgsnd()&lt;/code&gt; is leveraged into a page-level UAF and then into root via a &lt;code&gt;struct cred&lt;/code&gt; overwrite (PageJack).&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Description: i love sending messages, so i made it possible to add just a few more bytes to them
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;vulnerability&#34;&gt;Vulnerability&lt;/h2&gt;
&lt;p&gt;A custom Linux 6.10.9 kernel ships with the following patch in &lt;code&gt;ipc/msgutil.c&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;@@ -93,7 +93,7 @@
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        return ERR_PTR(-ENOMEM);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    alen = min(len, DATALEN_MSG);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-   if (copy_from_user(msg + 1, src, alen))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+   if (copy_from_user(msg + 1, src, alen + 3))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&lt;/span&gt;        goto out_err;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;load_msg()&lt;/code&gt;, invoked by &lt;code&gt;msgsnd()&lt;/code&gt;, copies &lt;code&gt;alen + 3&lt;/code&gt; bytes from userland into a freshly-allocated &lt;code&gt;msg_msg&lt;/code&gt; slab object. Three bytes are written past the end of the slot, into the next object in the same slab. The allocation size (via &lt;code&gt;msgsz&lt;/code&gt;) and the three overflow bytes (bytes &lt;code&gt;[msgsz, msgsz+1, msgsz+2]&lt;/code&gt; of the user buffer) are both attacker-controlled.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
