Skip to content

TIPC heap overflow (CVE-2021-43267)

Attacker'ın kontrol ettiği keylen'i, payload boyutundan allocate edilen buffer'ı aşan özel hazırlanmış bir TIPC MSG_CRYPTO mesajı gönder; kernel heap'inde bir kmalloc chunk'ı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; tipc modülü yüklüyse veya operasyonel bir neden olmadan bir bearer etkinse, bu başlı başına bir bulgudur. tipc modül yüklemesi ve tipc 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 olan MSG_CRYPTO mesajları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

  • tipc modü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.

References