Skip to content

ALPC port and message-handling attack surface

ALPC, ntoskrnl içindeki NtAlpc* 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ı:

  1. 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.

  2. 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_ALPC flag'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ğun NtAlpc* 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 ntoskrnl iç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/ntoskrnl dü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ı.

References