hacktricks/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md
2024-02-10 18:14:16 +00:00

8 KiB
Raw Blame History

CGroup Adı Alanı

AWS hacklemeyi sıfırdan kahramanla öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'i desteklemenin diğer yolları:

Temel Bilgiler

CGroup adı alanı, bir ad alanı içinde çalışan süreçlerin cgroup hiyerarşilerini izole etme sağlayan bir Linux çekirdek özelliğidir. Cgroups, kontrol grupları anlamına gelen bir çekirdek özelliğidir ve CPU, bellek ve I/O gibi sistem kaynakları üzerinde sınırlamaları yönetmek ve uygulamak için süreçleri hiyerarşik gruplara organize etmeyi sağlar.

Cgroup adı alanları, diğer ad alanı türleri (PID, mount, ağ vb.) gibi ayrı bir ad alanı türü değildir, ancak ad alanı izolasyonu kavramıyla ilişkilidir. Cgroup adı alanları, cgroup hiyerarşisinin görünümünü sanallaştırır, böylece cgroup adı alanında çalışan süreçler, ana bilgisayarda veya diğer ad alanlarında çalışan süreçlerle karşılaştırıldığında hiyerarşinin farklı bir görünümünü elde eder.

Nasıl Çalışır:

  1. Yeni bir cgroup adı alanı oluşturulduğunda, oluşturan sürecin cgroup'una dayalı bir cgroup hiyerarşisi görünümüyle başlar. Bu, yeni cgroup adı alanında çalışan süreçlerin, oluşturan sürecin cgroup'ının kökünde yer alan cgroup alt ağacıyla sınırlı olan tüm cgroup hiyerarşisinin bir alt kümesini göreceği anlamına gelir.
  2. Bir cgroup adı alanı içindeki süreçler, kendi cgroup'larını hiyerarşinin kökü olarak görürler. Bu, ad alanı içindeki süreçlerin bakış açısından, kendi cgroup'ları kök olarak görünür ve kendi alt ağaçlarının dışındaki cgroup'ları göremez veya erişemezler.
  3. Cgroup adı alanları, kaynakların doğrudan izolasyonunu sağlamaz; yalnızca cgroup hiyerarşisi görünümünün izolasyonunu sağlar. Kaynak kontrolü ve izolasyonu, cgroup alt sistemleri (örneğin, cpu, bellek vb.) tarafından hala uygulanır.

Daha fazla CGroups bilgisi için:

{% content-ref url="../cgroups.md" %} cgroups.md {% endcontent-ref %}

Lab:

Farklı Ad Alanları Oluşturma

CLI

sudo unshare -C [--mount-proc] /bin/bash

--mount-proc parametresini kullanarak /proc dosya sisteminin yeni bir örneğini bağladığınızda, yeni bağlama alanının o ad alanına özgü işlem bilgilerinin doğru ve izole bir görünümünü sağlarsınız.

Hata: bash: fork: Bellek tahsis edilemedi

unshare komutu -f seçeneği olmadan çalıştırıldığında, Linux'un yeni PID (Process ID) ad alanlarını nasıl işlediği nedeniyle bir hata oluşur. Ana ayrıntılar ve çözüm aşağıda belirtilmiştir:

  1. Sorun Açıklaması:
  • Linux çekirdeği, bir işlemin unshare sistem çağrısını kullanarak yeni ad alanları oluşturmasına izin verir. Ancak, yeni bir PID ad alanının oluşturulmasını başlatan işlem (unshare işlemi olarak adlandırılır) yeni ad alanına girmez; sadece çocuk işlemleri girer.
  • %unshare -p /bin/bash% komutunu çalıştırmak, /bin/bash'i unshare ile aynı işlemde başlatır. Sonuç olarak, /bin/bash ve çocuk işlemleri orijinal PID ad alanında bulunur.
  • Yeni ad alanındaki /bin/bash'in ilk çocuk işlemi PID 1 olur. Bu işlem çıkış yaptığında, eğer başka işlem yoksa ad alanının temizlenmesini tetikler, çünkü PID 1 yetim işlemleri benimseme özel rolüne sahiptir. Linux çekirdeği daha sonra o ad alanında PID tahsisini devre dışı bırakır.
  1. Sonuç:
  • Yeni bir ad alanındaki PID 1'in çıkışı, PIDNS_HASH_ADDING bayrağının temizlenmesine neden olur. Bu, yeni bir işlem oluştururken alloc_pid işlevinin yeni bir PID tahsis edememesine ve "Bellek tahsis edilemedi" hatasının oluşmasına yol açar.
  1. Çözüm:
  • Sorun, unshare ile -f seçeneğini kullanarak çözülebilir. Bu seçenek, unshare'in yeni bir PID ad alanı oluşturduktan sonra yeni bir işlem çatallamasını sağlar.
  • %unshare -fp /bin/bash% komutunu çalıştırmak, unshare komutunun kendisinin yeni ad alanında PID 1 haline gelmesini sağlar. /bin/bash ve çocuk işlemleri bu yeni ad alanında güvenli bir şekilde sınırlanır, PID 1'in erken çıkışını önler ve normal PID tahsisine izin verir.

unshare komutunun -f bayrağıyla çalıştığından emin olarak, yeni PID ad alanı doğru bir şekilde korunur ve /bin/bash ve alt işlemleri bellek tahsis hatasıyla karşılaşmadan çalışabilir.

Docker

docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash

Hangi ad alanında olduğunuzu kontrol edin

Bir sürecin hangi ad alanında olduğunu kontrol etmek için aşağıdaki komutu kullanabilirsiniz:

cat /proc/$$/cgroup

Bu komut, mevcut sürecin ad alanını gösteren bir çıktı verecektir. Ad alanı, /sys/fs/cgroup dizinindeki bir dosyada listelenir.

ls -l /proc/self/ns/cgroup
lrwxrwxrwx 1 root root 0 Apr  4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'

Tüm CGroup isim alanlarını bulun

{% code overflow="wrap" %}

sudo find /proc -maxdepth 3 -type l -name cgroup -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name cgroup -exec ls -l  {} \; 2>/dev/null | grep <ns-number>

{% code %}

Bir CGroup ad alanına giriş yapın

nsenter -C TARGET_PID --pid /bin/bash

Ayrıca, başka bir işlem ad alanına yalnızca root olarak girebilirsiniz. Ve başka bir ad alanına bir tanımlayıcı olmadan (örneğin /proc/self/ns/cgroup) giremezsiniz.

Referanslar

AWS hackleme konusunda sıfırdan kahraman olmak için htARTE (HackTricks AWS Red Team Expert)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları: