net/sched tcx ingress/clsact 0-day capability pivot (CVE-2024-41010)¶
net/sched
tcxingress/clsact path'inde bir use-after-free (CVE-2024-41010): bir shared traffic-control block, birtcx_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:
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ındantcx/miniqingress fast path'inde KASANuse-after-free. - Davranışsal: bir unprivileged process'in bir tc block paylaşan
ingress/
clsactqdisc'leri oluşturup sonra aktif instance'ı replace etmesi anormaldir; user namespace'leri içindentc qdisc add/replace clsact'ı izleyin.
Mitigation¶
miniq_active'irtnlaltında bir refcount'a çevirerek düzeltildi (commit'ler230bb13650b0f186f540500fd5f5f7096a822a2a,f61ecf1bd5b562ebfd7d430ccb31619857e80857,1cb6f0bae50441f4b4b32a28315853b279c7404e).- tc/qdisc yüzeyine giden unprivileged
CAP_NET_ADMINpath'ini kaldırmak için unprivileged namespace'leri kısıtlayın (kernel.unprivileged_userns_clone=0).