CVE-2026-43503

Published May 23, 2026

Last updated a month ago

CVSS high 8.8
Container Security

Overview

AI description

Automated description summarized from trusted sources.

CVE-2026-43503, dubbed "DirtyClone," is a vulnerability found within the Linux kernel's networking subsystem, specifically affecting the `net/skbuff` component. The core of the issue lies in certain "frag-transfer helpers," such as `__pskb_copy_fclone()` and `skb_shift()`, which fail to correctly propagate the `SKBFL_SHARED_FRAG` bit in `skb_shinfo()->flags` when network packet fragments (skbs) are moved between source and destination. This flag is crucial as it indicates whether the packet fragments reference shared page-cache memory. This propagation failure results in a state where the destination `skb` maintains references to shared, page-cache-backed pages but incorrectly reports that it lacks shared fragments. This discrepancy can be exploited by in-place writers, such as the ESP (Encapsulating Security Payload) input processing, which relies on the `skb_has_shared_frag()` function to determine if shared pages require copying before modification. An unprivileged user could leverage this flaw, for instance, by using an `nft 'dup to <local>'` rule or other `nf_dup_ipv4()` / `xt_TEE` callers, to write into the page cache of a root-owned read-only file.

Description
In the Linux kernel, the following vulnerability has been resolved: net: skbuff: propagate shared-frag marker through frag-transfer helpers Two frag-transfer helpers (__pskb_copy_fclone() and skb_shift()) fail to propagate the SKBFL_SHARED_FRAG bit in skb_shinfo()->flags when moving frags from source to destination. __pskb_copy_fclone() defers the rest of the shinfo metadata to skb_copy_header() after copying frag descriptors, but that helper only carries over gso_{size,segs, type} and never touches skb_shinfo()->flags; skb_shift() moves frag descriptors directly and leaves flags untouched. As a result, the destination skb keeps a reference to the same externally-owned or page-cache-backed pages while reporting skb_has_shared_frag() as false. The mismatch is harmful in any in-place writer that uses skb_has_shared_frag() to decide whether shared pages must be detoured through skb_cow_data(). ESP input is one such writer (esp4.c, esp6.c), and a single nft 'dup to <local>' rule -- or any other nf_dup_ipv4() / xt_TEE caller -- is enough to land a pskb_copy()'d skb in esp_input() with the marker stripped, letting an unprivileged user write into the page cache of a root-owned read-only file via authencesn-ESN stray writes. Set SKBFL_SHARED_FRAG on the destination whenever frag descriptors were actually moved from the source. skb_copy() and skb_copy_expand() share skb_copy_header() too but linearize all paged data into freshly allocated head storage and emerge with nr_frags == 0, so skb_has_shared_frag() returns false on its own; they need no change. The same omission exists in skb_gro_receive() and skb_gro_receive_list(). The former moves the incoming skb's frag descriptors into the accumulator's last sub-skb via two paths (a direct frag-move loop and the head_frag + memcpy path); the latter chains the incoming skb whole onto p's frag_list. Downstream skb_segment() reads only skb_shinfo(p)->flags, and skb_segment_list() reuses each sub-skb's shinfo as the nskb -- both p and lp must carry the marker. The same omission also exists in tcp_clone_payload(), which builds an MTU probe skb by moving frag descriptors from skbs on sk_write_queue into a freshly allocated nskb. The helper falls into the same family and warrants the same fix for consistency; no TCP TX-side in-place writer is currently known to reach a user page through this gap, but a future consumer depending on the marker would regress silently. The same omission exists in skb_segment(): the per-iteration flag merge takes only head_skb's flag, and the inner switch that rebinds frag_skb to list_skb on head_skb-frags exhaustion does not fold the new frag_skb's flag into nskb. Fold frag_skb's flag at both sites so segments drawing frags from frag_list members carry the marker.
Source
416baaa9-dc9f-4396-8d5f-8c081fb06d67
NVD status
Modified
Products
linux_kernel

Risk scores

CVSS 3.1

Type
Secondary
Base score
8.8
Impact score
6
Exploitability score
2
Vector string
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Severity
HIGH

Weaknesses

nvd@nist.gov
NVD-CWE-noinfo
0b0ca135-0b70-47e7-9f44-1890c2a1c46c
CWE-664

Social media

Hype score
Not currently trending
  1. lpe-toolkit has been updated with new LPE exploits! New exploits added: - RefluXFS CVE-2026-64600 - CrackArmor CVE-2026-23268 - skb_shift CVE-2026-43503 - GRO Flag Loss CVE-2026-43503 - snap-confine CVE-2026-8933 https://t.co/Uafh1WjbqV

    @portbuster1337

    23 Sept 2026

    6594 Impressions

    19 Retweets

    94 Likes

    53 Bookmarks

    0 Replies

    0 Quotes

  2. Added 3 New LPE to the Toolkit (Open Source) Page Cache Corruption Exploits - Research by Rajat Gupta (Qualcomm): - Dirty Pedit (CVE-2026-46331) - Sub-second root shell, no crypto needed - skb_shift (CVE-2026-43503) - 13 years of kernels affected (3.9-7.1-rc5) - GRO Flag Loss h

    @khadafigans_

    3 Aug 2026

    91 Impressions

    1 Retweet

    3 Likes

    0 Bookmarks

    0 Replies

    0 Quotes

  3. Done with all page-cache frenzy? Introducing Dirty-Pedit (CVE-2026-46331)! https://t.co/VGpf8gVuyU A true semantic variant with a novel in-place writer from the entire dirty bug class! Two other variants (CVE-2026-43503) that got collided: skb_shift and gro are in the repo.

    @z3ta_rjt

    22 Jul 2026

    191 Impressions

    0 Retweets

    2 Likes

    0 Bookmarks

    1 Reply

    0 Quotes

  4. CVE-2026-43503: Linux Kernel Socket Buffer Flaw - What It Means for Your Business and How to Respond https://t.co/vUv8oSPxBz

    @integ_sec

    19 Jul 2026

    30 Impressions

    0 Retweets

    0 Likes

    0 Bookmarks

    0 Replies

    0 Quotes

  5. CVE-2026-43503: Linux Kernel — net/skbuff: shared-frag marker not propagated through frag-transfer helpers (DirtyClone) CVE: CVE-2026-43503 PT ID: PT-2026-42878 Vendor: Linux Product: Linux Kernel (net/skbuff, XFRM/IPsec) CVSS: 8.8 Credits: JFrog Security Research…

    @lyrie_ai

    18 Jul 2026

    37 Impressions

    0 Retweets

    0 Likes

    0 Bookmarks

    1 Reply

    0 Quotes

  6. CVE-2026-43503: 🚨 Successful PoC for Linux Kernel CVE-2026-43503 (DirtyFrag variant) 🚨 JFrog researchers successfully developed a privilege escalation exploit for CVE-2026-43503, a newly discovered DirtyFrag variant we dubbed "DirtyClone". The vulnerability was patched…

    @lyrie_ai

    17 Jul 2026

    57 Impressions

    0 Retweets

    0 Likes

    0 Bookmarks

    1 Reply

    0 Quotes

  7. Added 4 new LPE exploits to lpe-toolkit: - PEdit COW CVE-2026-46331 - DirtyClone CVE-2026-43503 - Bad Epoll CVE-2026-46242 - FUSE OOB CVE-2026-31694 https://t.co/BmdCcmBkWK

    @portbuster1337

    6 Jul 2026

    10226 Impressions

    48 Retweets

    211 Likes

    137 Bookmarks

    2 Replies

    1 Quote

  8. Tails 7.9.1 is out: https://t.co/1TZmZC8BtT It fixes CVE-2026-43503 (*DirtyClone*) and CVE-2026-46331 (*PACKET_EDIT_MEME*).

    @Tails_live

    1 Jul 2026

    4751 Impressions

    25 Retweets

    93 Likes

    6 Bookmarks

    2 Replies

    1 Quote

  9. CISO Daily Briefing: Amazon Q Developer CVE-2026-12957 (CVSS 8.5) — MCP auto-execution, no user interaction required, Miasma worm across 73 GitHub repos; Linux LPEs CVE-2026-46331 + CVE-2026-43503 bypass file integrity monitoring entirely in memory. Fable 5/Mythos 5 suspended f

    @cloudsa

    28 Jun 2026

    428 Impressions

    0 Retweets

    0 Likes

    1 Bookmark

    0 Replies

    0 Quotes

  10. Open-source defensive toolkit against #DirtyClone (CVE-2026-43503) and #peditCOW (CVE-2026-46331). While patching remains the ultimate solution, this toolkit helps you close the gap while you patch. https://t.co/2ETRhoK5oU

    @douglasmun

    28 Jun 2026

    234 Impressions

    0 Retweets

    0 Likes

    0 Bookmarks

    0 Replies

    0 Quotes

  11. Acaba de confirmarse: una nueva vulnerabilidad en el núcleo de Linux llamada DirtyClone, que permite a los atacantes escalar privilegios y reescribir ejecutables en memoria sin dejar rastro en el disco, con un exploit ya disponible para CVE-2026-43503. DirtyClone está https://

    @BotBauR

    27 Jun 2026

    126 Impressions

    0 Retweets

    0 Likes

    0 Bookmarks

    0 Replies

    0 Quotes

  12. - Copy Fail (CVE-2026-31431) - DirtyFrag (CVE-2026-43284 and CVE-2026-43500) - Fragnesia (CVE-2026-46300) - DirtyClone(CVE-2026-43503)&lt;- New https://t.co/dHXh8SMFHa

    @hakkadaikon

    27 Jun 2026

    1203 Impressions

    0 Retweets

    2 Likes

    3 Bookmarks

    0 Replies

    1 Quote

  13. CVE-2026-46331 CVE-2026-43503 アルマリナックス対応済み

    @hacker_infra

    26 Jun 2026

    206 Impressions

    0 Retweets

    2 Likes

    0 Bookmarks

    0 Replies

    0 Quotes

  14. 🚨 Successful PoC for Linux Kernel CVE-2026-43503 (DirtyFrag variant). @JFrogSecurity researchers successfully developed a privilege escalation exploit for CVE-2026-43503, a newly discovered DirtyFrag variant we dubbed "DirtyClone". The vulnerability was patched and merged in

    @jfrog

    26 Jun 2026

    410 Impressions

    1 Retweet

    1 Like

    0 Bookmarks

    0 Replies

    0 Quotes

  15. Three high-severity CVEs hit enterprise and dev stacks today: CVE-2026-12957 lets a malicious repo silently execute code via Amazon Q Developer's MCP config, exfiltrating AWS credentials; CVE-2026-43503 (DirtyClone, CVSS 8.8) gives Linux local users root via cloned network

    @XavierRiveraX

    26 Jun 2026

    76 Impressions

    0 Retweets

    0 Likes

    0 Bookmarks

    0 Replies

    0 Quotes

  16. Our CTI team identified a lot of activities targeting Linux Kernel (CVE-2026-43503) https://t.co/8mR3ngQvwi

    @vuldb

    24 May 2026

    72 Impressions

    1 Retweet

    1 Like

    0 Bookmarks

    0 Replies

    0 Quotes

Configurations

  1. In the Linux kernel, the following vulnerability has been resolved: cgroup: Avoid iteration of dying tasks with zero refcount The commit 260fbcb92bbea ("cgroup: Move dying_tasks cleanup from cgroup_task_release() to cgroup_task_free()") extended the lifetime of tasks on the dying_tasks list. The iterators have provision to go through dying_tasks because of dying threadgroup leaders or explicit CSS_TASK_ITER_WITH_DEAD, however, it was expected that such tasks can obtain a new reference (that is possible before cgroup_task_release()/put_task_struct_rcu_user()). The tasks after cgroup_task_release() and before cgroup_task_free() are subject to race when they may or may not have ->usage count > 0. The race window is between css_task_iter_next() invocations when css_set_lock is released and we may arrive at a new ->task_pos. The iterator should not attempt to resurrect tasks whose ->usage count dropped to zero. (When that happens, __put_task_struct_rcu_cb() is already imminent and the returned task_struct would could be used after free.) As for the fix, we cannot simply check the signal->live count of a task on the dying list because that won't distinguish regular zombies waiting to be reaped from RCU remnant tasks that are going to be free'd. Therefore add an extra check to rule out ->usage==0 tasks from any iteration. The repeat: loop in css_task_iter_advance() doesn't consider ->usage count, so add a new loop to css_task_iter_next() to skip de-used tasks on the dying_list. Rough illustration of the possible race R (reader of cgroup.procs) T (thread) L (group leader) --------------------------------- -------------------------------- -------------------------------- L exits, signal->live > 0 cgroup_task_dead(L) css_set_skip_task_iters() // skips only cset->tasks list_add_tail(&L->cg_list, &cset->dying_tasks) css_task_iter_next() take css_set_lock css_task_iter_advance() leader && signal->live != 0 => it->task_pos = &L->cg_list release css_set_lock T exits --signal->live == 0 cgroup_task_dead(T) // css_set_lock release_task(T) cgroup_task_release(T) release_task(L) // zap_leader cgroup_task_release(L) put_task_struct_rcu_user(L) ...RCU... put_task_struct(L) L->usage = 0 /* L still on dying_tasks */ ...RCU... __put_task_struct(L) css_task_iter_next() // another iteration take css_set_lock it->task_pos = &L->cg_list get_task_struct(L) => addition on 0 drop css_set_lock cgroup_task_free(L) css_set_skip_task_iters() // dying skip comes too late free_task(L) cgroup_procs_show() task_pid_vnr(L)•CVE-2026-98163

References

Sources include official advisories and independent security research.