SCTP cgroups escape (CVE-2019-3874)¶
SCTP socket-buffer belleği memory
cgroup'a charge edilmez; dolayısıyla container içindeki bir process,cgrouplimitinin ö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'lerisctp: implement memory accounting on tx pathvesctp: 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¶
- Red Hat Bugzilla 1686373 — CVE-2019-3874
- Detecting and preventing cgroups escape via SCTP — CVE-2019-3874 (Sysdig)
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).