TIPC heap overflow (CVE-2021-43267)¶
Attacker'ın kontrol ettiği
keylen'i, payload boyutundan allocate edilen buffer'ı aşan özel hazırlanmış bir TIPCMSG_CRYPTOmesajı gönder; kernel heap'inde birkmallocchunk'ını overflow et — yerel veya uzaktan, kimlik doğrulamasız.
Mechanism¶
Note
TIPC (Transparent Inter-Process Communication), cluster node'larının AEAD cryptographic
key'leri değiş tokuş etmesine olanak tanıyan bir MSG_CRYPTO mesaj tipini destekler.
Receive path, mesajın payload uzunluğundan boyutlandırılan (packet sınırlarına karşı
doğrulanan) bir heap buffer allocate eder, ama sonra key'i allocation'a karşı asla
bounds-check edilmeyen ayrı, attacker'ın kontrol ettiği bir keylen field'ını kullanarak
kopyalar. Kırılan invariant: kopyalanan byte sayısı (keylen), payload boyutundan allocate
edilen buffer'ı aşmamalıdır. Küçük bir gövdeye ama büyük bir keylen'e sahip bir packet,
memcpy'nin kmalloc'lanmış object'in çok ötesine yazmasını sağlar — klasik bir heap buffer
overflow (CVSS 9.8); TIPC'nin UDP bearer'ı (port 6118) üzerinden kimlik doğrulamasız, uzaktan
erişilebilir.
Walkthrough¶
Tel üzerindeki mesaj gövdesi:
struct tipc_aead_key {
char alg_name[TIPC_AEAD_ALG_NAME]; /* 32 bytes */
unsigned int keylen; /* attacker-controlled */
char key[];
};
Açıklı tipc_crypto_key_rcv (net/tipc/crypto.c), allocation'ı payload'dan boyutlandırır ama
keylen byte'ı hiçbir validation olmadan kopyalar:
u16 size = msg_data_sz(hdr); /* payload size from header */
skey = kmalloc(size, GFP_ATOMIC); /* allocation sized from payload */
skey->keylen = ntohl(*((__be32 *)(data + TIPC_AEAD_ALG_NAME)));
memcpy(skey->key, data + TIPC_AEAD_ALG_NAME + sizeof(__be32),
skey->keylen); /* OOB write when keylen > size */
Fix, keylen'i mesaj boyutuna ve bir maksimuma bağlayan kopyalama-öncesi bir bound check ekler:
if (unlikely(size != keylen + sizeof(struct tipc_aead_key) ||
keylen > TIPC_AEAD_KEY_SIZE_MAX)) {
pr_debug("%s: invalid MSG_CRYPTO key size\n", rx->name);
goto exit;
}
Warning
Etkilenen: kernel'ler 5.10 ile 5.15 arası (MSG_CRYPTO desteği ~Eylül 2020'de geldi); 5.15'te düzeltildi ve backport edildi.
Detection¶
- TIPC expose denetimi. Çoğu sistem TIPC'yi hiç kullanmaz;
tipcmodülü yüklüyse veya operasyonel bir neden olmadan bir bearer etkinse, bu başlı başına bir bulgudur.tipcmodül yüklemesi vetipc bearer enableüzerine alert ver. - Ağ imzaları. TIPC over UDP yaygın olarak port 6118 kullanır; beklenmedik TIPC trafiğini ve
bildirilen
keylen'i packet uzunluğuyla tutarsız olanMSG_CRYPTOmesajlarını işaretle. - Kernel oops / heap corruption. TIPC aktivitesiyle ilişkili slab redzone veya
freelist-corruption panic'leri (instrumented kernel'lerde
tipc_crypto_key_rcv'de KASAN out-of-bounds write raporları) doğrudan kanıttır.
Mitigation¶
tipcmodülü otomatik yüklenmez — TIPC kullanılmıyorsa, yüklü olmadığından emin ol (lsmod | grep tipc) ve/veya blacklist'e al (install tipc /bin/true); böylece surface tamamen kalkar.- Düzeltilmiş bir kernel ≥ 5.15'e (veya distro backport'una) patch'le.
- Bearer'ı kısıtla. TIPC gerekliyse, onu güvenilir L2 segment'lerine sınırla ve UDP bearer portunu firewall'la.
- Defense in depth hardening. slab-freelist-hardening, test filolarında KASAN ve structure-layout randomization, overflow'u kontrole çevirmenin maliyetini artırır.