Skip to content

SCTP cgroups escape (CVE-2019-3874)

SCTP socket-buffer belleği memory cgroup'a charge edilmez; dolayısıyla container içindeki bir process, cgroup limitinin ötesinde kernel belleği allocate edip host'u tüketebilir.

Mechanism

Memory cgroup controller'ı, bir task grubunun ne kadar kernel ve user belleği tüketebileceğini sınırlar. Bunun geçerli olması için, bir task'ın sürebileceği her önemli allocation'ın cgroup'una account (charge) edilmesi gerekir. SCTP socket-buffer'ları bu accounting'de bir boşluktu.

Note

Bir process bir SCTP socket (IP protocol 132) üzerinden veri gönderdiğinde veya kuyruğa aldığında kernel socket-buffer'lar allocate eder, ancak bu allocation'lar cgroups subsystem tarafından account edilmez. Memory limitli bir cgroup içindeki task bu yüzden memory.limit_in_bytes'a hiç sayılmayan keyfi büyüklükte SCTP socket-buffer allocation'ları sürebilir; izolasyon sınırından kaçar ve host RAM'ini tüketir — bir denial-of-service.

Bu bug bir memory-corruption kusuru değil, bir accounting boşluğudur: privilege escalation yoktur, sadece resource-isolation bypass vardır (CVSS ~5.3).

Walkthrough

Bu escape, process'i SCTP socket'leri açabilen bir container'dan erişilebilirdir (tipik olarak namespace içinde root olarak çalışır):

// Inside a memory-cgroup-limited container.
int s = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);  // proto 132
// Establish an association and queue large amounts of unsent/unacked data so
// the kernel grows SCTP socket buffers that are never charged to the cgroup.

Beklenen sonuç: container'ın resident kernel belleği, cgroup kullanımı hiç raporlamadan cgroup memory.limit_in_bytes değerini aşar ve sonunda host'u baskı altına alır ya da OOM'a sokar.

Detection

Container içinden SCTP socket oluşturma/binding'i izle — ör. container context'lerinde protocol number 132 ile socket()/bind() eşleştiren bir Falco/eBPF kuralı, artı hiçbir cgroup'un raporladığı kullanıma karşılık gelmeyen host memory pressure.

Mitigation

  • Düzeltilmiş kernel'i uygula (Red Hat fix'i RHSA-2019:3517'de yayınladı; accounting boşluğu upstream'de kapatıldı, böylece SCTP socket-buffer belleği cgroup'a charge edilir). İlgili upstream patch'leri sctp: implement memory accounting on tx path ve sctp: implement memory accounting on rx path'tir; etkilenen branch'ler 3.10.x ve 4.18.x'i içerir (Fedora bunu 5.2 tabanlı rebase'lerde aldı).
  • Patch mevcut olmadığında: protokolün kullanılamaması için SCTP modülünü blacklist'e al/devre dışı bırak (reboot gerektirir) ya da non-root SCTP socket oluşturmayı yasaklamak için SELinux policy'si kullan.
# disable the module on hosts that don't need SCTP
echo "install sctp /bin/true" | sudo tee /etc/modprobe.d/disable-sctp.conf

References

Not: bu CVE bazen yanlışlıkla "info disclosure / OOB" olarak etiketlenir; o framing yanıltıcıdır — bkz. SCTP info disclosure / OOB (aynı bug, doğru karakterizasyon: memory-accounting / cgroup-escape).