ALPC port and message-handling attack surface¶
ALPC,
ntoskrnliçindekiNtAlpc*system-call yüzeyi, port object'leri ve message/attribute handling ile RPC'yi ve pek çok privileged Windows servisini besler; bu port object lifecycle ve message parsing kodu, low-integrity / AppContainer'dan reachable olduğu için tekrar tekrar ring0 LPE ve sandbox-escape kaynağı olmuştur (örn. CVE-2023-21674, ALPC use-after-free, in-the-wild).
Mechanism¶
Neden bu boundary defalarca kırılıyor — bir bug class olarak ALPC object/message handling
ALPC (Advanced Local Procedure Call), Windows'un çekirdek IPC transport'u:
RPC/LRPC, çoğu privileged servis ve UMDF gibi altyapılar bunun üzerinden
konuşur. Model şöyle: bir process bir ALPC port object'i oluşturur
(NtAlpcCreatePort), client'lar NtAlpcConnectPort ile bağlanır, ve iki taraf
NtAlpcSendWaitReceivePort ile mesaj alışverişi yapar. Mesajların gövdesine ek
olarak attribute'lar taşınabilir — handle, security context, view (shared
section), data view, token attribute gibi. Bu attribute'ları kernel tarafında
tutan yapılar (port object, message object, PORT_MESSAGE, reserve object'ler)
referans sayımı ve state machine ile yönetilir.
Korunması gereken invariant iki katmanlı:
-
Lifetime / ownership. Bir port veya message'a bağlı kernel object'in lifetime'ı, onu tutan handle'lar ve pending mesajlar boyunca doğru reference-count'lanmalı. Client, disconnect / close / cancel'ı asenkron olarak ve kendi seçtiği sırayla tetikleyebildiği için, bir code path object'i free ederken başka bir path hâlâ ona pointer tutuyorsa UAF (CWE-416) doğar. CVE-2023-21674 tam olarak bu sınıftan bir ALPC use-after-free'dir.
-
Attribute type/size doğrulaması. Attacker attribute tiplerini, sayılarını ve boyutlarını kontrol eder; kernel bunları parse ederken beklenen tip ile gerçek buffer'ı karıştırırsa type confusion, boyut hesabını yanlış yaparsa OOB, handle attribute'ı yanlış duplicate/refcount ederse handle-management bug'ı çıkar.
Yüzeyin tehlikeli olmasının sebebi reachability: NtAlpc* çağrıları
low-integrity ve AppContainer içinden (browser/renderer sandbox dahil)
ulaşılabilir, çünkü sandbox'lı process'in dış dünya ile konuşması için ALPC'ye
ihtiyacı vardır. Böylece bir renderer, kernel'de attacker-influenced bir object
lifecycle'ı sürebilir. Bir UAF'i kontrollü hale getirmek için attacker, free
edilen ALPC object'in pool slot'unu kendi kontrol ettiği bir yapı ile
reclaim eder (klasik pool grooming), sonra dangling pointer üzerinden
okuma/yazma veya bir function-pointer/callback hijack'ine çevirir. Bu, Linux'taki
"socket/IPC object UAF → pool reclaim → arbitrary R/W" kalıbının Windows ALPC
karşılığıdır; kaldıraç sandbox-reachable IPC + asenkron lifetime.
Walkthrough¶
Altitude
Aşağıdakiler public, patch'li malzemeden (NVD/Tenable + genel ALPC internals) türetilmiş kavramsal adımlardır. Struct offset, gadget chain veya kopyala-çalıştır exploit yok — sadece bir defender'ın anlaması için mantık zinciri.
Step 1 — attack surface'e ulaş. Sandbox-reachable NtAlpc* yüzeyini kullan: bir
port'a connect ol ve message + attribute akışını sür. Yüksek seviyede:
// Conceptual only — real handles/attributes elided.
NtAlpcConnectPort(&hPort, &portName, ...); // connect to a server port
// build a message that carries attributes (handle / view / context)
NtAlpcSendWaitReceivePort(hPort, flags, &msg, &attrs, &recv, &recvAttrs, ...);
Step 2 — race / mis-order the object lifecycle. Bir object'i (ör. bir message veya bağlı bir reserve/view object) free eden operation ile ona hâlâ referans tutan bir operation'ı, disconnect/cancel/close'u asenkron tetikleyerek çakıştır. Amaç: kernel object free edilmiş ama bir code path'te dangling pointer kalması — yani UAF pencasi.
thread A: <op that releases / frees the ALPC object>
thread B: <op that still dereferences the same object> // window → UAF
Step 3 — free'lenen slot'u reclaim et (pool grooming). Free edilen pool allocation'ının boyutuna uyan, attacker-kontrollü içerikli yapıları spray ederek dangling pointer'ın artık attacker verisine bakmasını sağla. Bu, corruption'ı "deterministik" kılan adımdır.
free(ALPC object) → spray objects of matching pool size → dangling ptr now
points at attacker-shaped data
Step 4 — primitive'e çevir. Reclaim edilen içeriğe göre dangling deref bir data-only read/write ya da bir kernel pointer / callback hijack'i verir; buradan token stealing veya kernel R/W gibi bilinen post-exploitation primitive'lerine gidilir. CVE-2023-21674 zincirinde bu, Chromium sandbox'ından çıkıp kernel seviyesinde execution ile sonuçlandı (Tenable, in-the-wild zero-day).
Neden ALPC bu bug class'ı için verimli bir yer
ALPC message/attribute modeli attacker'a çok sayıda serbestlik derecesi verir: kaç attribute, hangi tip, hangi boyut, handle attribute'da hangi object, view attribute'da hangi section — ve bunların hepsi asenkron connect/disconnect/cancel state machine'i ile birleşir. Bu kombinatorik, lifetime ve type/size invariant'larını el ile korumayı zorlaştırır; tarihsel olarak bug'lar object refcount'unun yanlış yerde düşmesi, bir attribute'ın yanlış tiple yorumlanması ya da bir view/handle'ın çift-serbest bırakılması şeklinde tekrarlamıştır. Defender açısından önemli olan: yüzey sandbox içinden erişilebilir, yani tek bir renderer RCE bile bu yüzey üzerinden kernel'e köprü kurabilir.
Detection¶
- ETW ALPC tracing. NT Kernel Logger
EVENT_TRACE_FLAG_ALPCflag'i ALPC send/receive/wait event'lerini (ALPC_Send_Message,ALPC_Receive_Message, …) üretir; anormal derecede yüksek connect/disconnect veya cancel oranı, ya da beklenmedik bir sandbox'lı process'ten yoğunNtAlpc*trafiği bir grooming/race denemesinin sinyali olabilir. - Sandbox → kernel köprüsü. Bir AppContainer / low-integrity process'in (ör. bir browser renderer) hemen ardından SYSTEM/kernel seviyesinde beklenmedik bir child process, token değişimi veya integrity-level sıçraması EDR için güçlü bir korelasyondur.
- Crash telemetri. ALPC object'lerine dokunan path'lerde
ntoskrnliçi bugcheck / pool corruption (special pool, Driver Verifier açıkken) tekrarlıysa, UAF/OOB denemesi olabilir; WER/kernel dump'ları toplayın. - KEV/threat-intel eşleşmesi. CVE-2023-21674 CISA KEV'de in-the-wild olarak listelendi; ilgili exploit/campaign IOC'leri ile host telemetrisini eşleştirin.
Mitigation¶
- Patch. CVE-2023-21674 için Ocak 2023 kümülatif update'ini uygulayın; ALPC
bug'ları düzenli olarak Patch Tuesday'de kapanır, bu yüzden ALPC/
ntoskrnldüzeltmelerini öncelikleyin. - Attack-surface reduction. Sandbox'lardan (AppContainer, browser broker) ulaşılabilen ALPC endpoint'lerini minimuma indirin; gereksiz servisleri kapatın, RPC/ALPC interface'lerine sıkı ACL uygulayın.
- Exploit-mitigation. Kernel tarafında kCFG / CET shadow stack, pool hardening (segment heap, pool quota / type isolation) ve Driver Verifier'ın special pool'u, UAF/type-confusion sınıfını istismar etmeyi zorlaştırır.
- Genel invariant. IPC transport'ları client-controlled attribute'ları parse ederken tip/boyutu strict doğrulamalı ve asenkron connect/disconnect/cancel altında object lifetime'ını tek bir sahiplik modeliyle refcount'lamalı.