Skip to content

net/sched tcx ingress/clsact 0-day capability pivot (CVE-2024-41010)

net/sched tcx ingress/clsact path'inde bir use-after-free (CVE-2024-41010): bir shared traffic-control block, bir tcx_entry'nin çok erken release edilmesine izin verir ve açıklayan exploit ("Unleashing a 0day: Pivoting Capabilities") bunu Linux capability'lerini pivot ederek zincirler ve unprivileged bir başlangıçtan kernel'i fetheder.

Warning

Bu not'un slug/alias'ı bunu "nf_tables" olarak etiketler, ama doğrulanan CVE-2024-41010 kaydı, nf_tables değil, bir net/sched tcx (ingress/clsact) use-after-free tanımlar. "Capability pivot", bu CVE ile ilişkili Unleashing a 0day konuşmasındaki Pedro Pinto'nun exploitation tekniğine atıfta bulunur. Bu not, doğrulanmış tcx_entry bug'ını ve capability-pivoting fikrini belgeler; herhangi bir nf_tables çerçevelemesini root cause değil, bir alias olarak ele alın.

Mechanism

Note

tcx, traffic control için modern ingress/egress hook katmanıdır. Bir ingress ya da clsact qdisc, per-attachment bir tcx_entry'ye reference verir ve bir miniq (mini qdisc), o entry'nin aktif olup olmadığını izler. Birden çok qdisc aynı shared tc block'a işaret edebilir. Lifecycle invariant'ı — "herhangi bir qdisc hâlâ reference verirken tcx_entry canlı kalmalıdır" — yalnızca, birden çok sharer'ı sayamayan bir boolean miniq_active ile enforce edilir. Yani shared tc block'lu aktif bir eski-stil ingress/clsact qdisc, başka bir ingress/clsact instance'ı ile replace edildiğinde, tcx_entry hâlâ reference verilirken çok erken release edilir: bir use-after-free. Fix, miniq_active'i bir boolean'dan bir reference counter'a (rtnl mutex ile korunan) çevirir, böylece entry yalnızca son sharer onu drop ettiğinde free edilir.

"Capability pivoting", exploitation katmanıdır: doğrudan root'a atlamak yerine, exploit önce UAF'ı kendisine ek Linux capability'leri vermek için kullanır, sonra bunları (örneğin CAP_NET_ADMIN/CAP_SYS_ADMIN-gated yüzeyleri) daha fazla escalate etmek için kullanır — tam kernel kontrolüne ulaşmak için capability model'i üzerinden pivot eder.

Walkthrough

Bug, yeni netns üzerinde CAP_NET_ADMIN veren bir unprivileged user+net namespace'inden reachable'dır:

unshare(CLONE_NEWUSER | CLONE_NEWNET);   /* CAP_NET_ADMIN in new netns */

Kavramsal olarak trigger, bir shared tc block kurar, bir ingress/clsact qdisc attach eder, sonra erken-release edilen tcx_entry dereference edilsin diye onu replace eder:

# attach clsact/ingress using a *shared* tc block, then replace it
tc qdisc add dev lo clsact
# ... share the block across attachments, then replace the active instance
tc qdisc replace dev lo clsact

Tam weaponize edilmiş replace dizisi ve offset'leri yalnızca yazarın konuşmasında ayrıntılandırıldığından, tekrar üretilebilir, public kısım yukarıdaki kavramsal path artı crash imzasıdır: shared-block bir ingress/clsact qdisc'i, başka biri aynı tcx_entry'ye reference verirken replace etmek, tcx/miniq fast path'inde bir KASAN use-after-free üretir. Tam capability-pivot chain'i Pedro Pinto'nun slide'larında ve kaydında belgelenmiştir.

Detection

  • Bir shared tc block üzerinde bir tc qdisc replace'in ardından tcx/miniq ingress fast path'inde KASAN use-after-free.
  • Davranışsal: bir unprivileged process'in bir tc block paylaşan ingress/clsact qdisc'leri oluşturup sonra aktif instance'ı replace etmesi anormaldir; user namespace'leri içinden tc qdisc add/replace clsact'ı izleyin.

Mitigation

  • miniq_active'i rtnl altında bir refcount'a çevirerek düzeltildi (commit'ler 230bb13650b0f186f540500fd5f5f7096a822a2a, f61ecf1bd5b562ebfd7d430ccb31619857e80857, 1cb6f0bae50441f4b4b32a28315853b279c7404e).
  • tc/qdisc yüzeyine giden unprivileged CAP_NET_ADMIN path'ini kaldırmak için unprivileged namespace'leri kısıtlayın (kernel.unprivileged_userns_clone=0).

References