HG PHP GüvenliğiEl Kitabı
Bölümler 28 / 38

İçindekiler/Altyapı Sertleştirme

Bölüm 28

Linux İzinleri (Permissions & Privilege)

15 dk okuma3.139 kelimePHP 8.1+
Ön koşul

Bölüm 1 (en az yetki), Bölüm 19 (web shell yürütme), Bölüm 25 (world-readable sırlar), Bölüm 26 (FPM kullanıcısı). İleri referanslar: Bölüm 29 (container), Bölüm 34 (web shell).

Bu bölümün kazanımı

Unix izin modelini (kullanıcı/grup/diğer, rwx, sahiplik); web sunucusu kullanıcısının neden düşük yetkili olması gerektiğini; dosya izinlerinin bir web shell'in kalıcılığını nasıl belirlediğini; ve SUID ikili dosyalarının bir yetki-yükseltme yüzeyi olduğunu (PwnKit) göreceksiniz.

1. Giriş

Bir saldırgan bir web shell (Bölüm 19, 34) elde ettiğinde, hikâye bitmez — başlar. O shell, web sunucusunun kullanıcısı (www-data, nginx, ya da FPM havuz kullanıcısı — Bölüm 26) yetkisiyle çalışır. Saldırganın sonraki hedefi iki yönlüdür: (1) yatay olarak diğer dosyalara/sitelere erişmek, (2) dikey olarak root'a yükselmek. Her ikisi de doğrudan Linux dosya izinleri ve yetki modeliyle belirlenir.

İzinler, bu kitabın "en az yetki" (Bölüm 1) ilkesinin işletim sistemi seviyesindeki uygulamasıdır. İyi yapılandırılmış izinler, bir web shell'i "sınırlı, geçici bir sıkıntıya"; kötü yapılandırılmışlar ise "tam sistem devrine" dönüştürür. Örneğin web dizini www-data tarafından yazılabilir değilse, saldırgan kalıcı bir arka kapı bırakamaz veya kodu değiştiremez; sırlar 640 izinliyse www-data onları okuyamaz.

Dikey yükseltmenin en çarpıcı örneği PwnKit'tir (CVE-2021-4034, Bölüm 11): Qualys'in 2022'de açıkladığı, neredeyse her büyük Linux dağıtımında öntanımlı bulunan pkexec (bir SUID-root program) açığı, herhangi bir düşük yetkili kullanıcının root olmasına izin veriyordu. Bir web shell (www-data) + PwnKit = tam kök erişimi. Bu bölüm, izin modelini ve bu tür yükseltme zincirlerini nasıl kıracağınızı ele alır.


2. Temel Teori

Unix izin modeli. Her dosyanın bir sahibi (user), bir grubu (group) ve üç izin kümesi vardır: sahip / grup / diğerleri (other), her biri için r (oku), w (yaz), x (çalıştır/dizin için gir). Sekizlik (octal) gösterim: rwxr-x--- = 750 (sahip: rwx=7, grup: r-x=5, diğer: ---=0). chown sahipliği, chmod izinleri değiştirir.

Web güvenliği için kritik ilkeler:

İlke Uygulama
Web kullanıcısı düşük yetkili www-data/FPM kullanıcısı; asla root çalışmaz (Bölüm 26)
Kod, web kullanıcısınca yazılamaz Web dosyaları deploy kullanıcısına ait, www-data'ya yazma yok → web shell kalıcılığını engeller
Yükleme dizini yazılabilir ama çalıştırılamaz Yükleme yazılabilir ama PHP çalıştıramaz (Bölüm 19, 27)
Sırlar sıkı izinli .env/config 640/600, world-readable değil (Bölüm 25)
World-writable yok 777/o+w tehlikeli; herkes değiştirir

umask. Yeni oluşturulan dosyaların öntanımlı izinlerini belirler. Güvenli bir umask (ör. 027), yeni dosyaların "diğerleri" için okunamaz/yazılamaz olmasını sağlar; gevşek bir umask (000) world-readable/writable dosyalar üretir.

SUID / SGID — yetki yükseltme yüzeyi. Normalde bir program, onu çalıştıran kullanıcının yetkisiyle çalışır. SUID (Set User ID) biti ayarlı bir ikili dosya ise, sahibinin (genelde root) yetkisiyle çalışır. Bu, passwd gibi meşru araçlar için gereklidir (parola değiştirmek /etc/shadow'a yazma ister). Ama bir SUID-root ikilisinde bir açık varsa, onu çalıştıran düşük yetkili kullanıcı root olur — PwnKit tam olarak budur. Bu yüzden SUID ikilileri denetlenmeli (find / -perm -4000), gereksizler kaldırılmalı ve güncel tutulmalıdır.

Yetki yükseltme zinciri. Tipik saldırı: (1) uzaktan RCE / web shell → www-data (düşük yetki); (2) yerel keşif — SUID ikilileri, world-writable dosyalar, zayıf izinler, çekirdek/paket açıkları; (3) yükseltme (PwnKit gibi SUID açığı) → root. Her adım bir izin/yetki savunmasıyla kırılabilir (Bölüm 1, derinlemesine savunma).


3. Mimarisel Bakış

 YETKİ YÜKSELTME ZİNCİRİ:
   Uzaktan RCE (Bölüm 8/19) → web shell → www-data (düşük yetki)
        ↓  yatay: world-readable sırlar? diğer siteler yazılabilir?
        ↓  dikey: SUID-root ikilisinde açık? (PwnKit)
   pkexec (SUID-root) + CVE-2021-4034 → root → TAM DEVİR

 GÜVENLİ (izin katmanları zinciri kırar):
   web shell → www-data
        ✗ kod dizini www-data'ya yazılamaz → kalıcılık/değişiklik yok
        ✗ sırlar 640 (deploy:app) → www-data okuyamaz (Bölüm 25)
        ✗ yükleme dizini noexec / .php çalışmaz (Bölüm 19, 27)
        ✗ gereksiz SUID ikilileri kaldırılmış + güncel → PwnKit yolu yok
   → web shell "sınırlı, geçici" kalır (en az yetki, Bölüm 1)

 İZİN MODELİ:
   rwx rwx rwx  →  sahip / grup / diğer   (octal: 750 = rwxr-x---)
   chown deploy:app · chmod 640 .env · umask 027 · find / -perm -4000

Kritik gözlem: izinler, her yükseltme adımını ayrı ayrı kırabilen katmanlardır; iyi izinler bir web shell'in etkisini kaynağında sınırlar.


4. Güvensiz Kod

Gerçekçi (güvensiz) izin yapılandırması:

# ⚠️ GÜVENSİZ izinler
# Web sunucusu root çalışıyor
# (Apache/nginx/FPM 'root' olarak — bir açık doğrudan root RCE demek)

chmod -R 777 /var/www/app          # her şey world-writable (web shell kalıcı)
chown -R www-data:www-data /var/www/app   # kod, web kullanıcısınca yazılabilir

chmod 644 /var/www/app/.env        # sırlar world-readable (Bölüm 25)
chmod 777 /var/www/app/uploads     # yükleme world-writable (+ çalıştırılabilir)

umask 000                          # yeni dosyalar world-rwx

# SUID ikilileri denetlenmemiş; gereksizler kaldırılmamış; polkit güncel değil (PwnKit)

5. Açığın Analizi

Web sunucusu root çalışıyor — En tehlikeli hata. Web sunucusu/FPM root olarak çalışırsa, herhangi bir RCE (Bölüm 8, 19) doğrudan root erişimi verir — yetki yükseltmeye bile gerek kalmaz. Web süreci daima düşük yetkili bir kullanıcıyla çalışmalı (Bölüm 26).

chmod -R 777 + kod www-data'ya ait — İki kat felaket. (1) World-writable kod: Herhangi bir kullanıcı (ve bir web shell) kod dosyalarını değiştirebilir → kalıcı arka kapı, koda enjeksiyon. (2) Kod, web kullanıcısınca yazılabilir: Bir web shell (www-data) uygulamanın PHP dosyalarını değiştirip kalıcılık kurar. Kod, www-data'ya yazılamaz olmalı (deploy kullanıcısına ait, www-data yalnızca okur).

.env world-readable (644) — Sırlar (Bölüm 25) tüm kullanıcılarca okunabilir; bir web shell (hatta başka bir düşük yetkili kullanıcı) DB/API anahtarlarını okur. .env 640 (deploy:app) olmalı, www-data okumamalı — ya da sır yöneticisinde (Bölüm 25).

uploads 777 — Yükleme dizini world-writable ve çalıştırılabilir; yüklenen bir .php (Bölüm 19) hem yazılır hem çalışır. Yükleme dizini yazılabilir olmalı ama çalıştırma engellenmeli (noexec / web sunucusu PHP çalıştırmamalı, Bölüm 27).

umask 000 — Yeni dosyalar world-rwx oluşur; uygulama çalışırken oluşturduğu dosyalar (log, cache, upload) herkese açık olur. Güvenli umask (027) gerekir.

SUID denetlenmemiş + polkit güncel değil — Gereksiz SUID-root ikilileri ve yamasız pkexec (PwnKit) bulunuyorsa, bir web shell root'a yükselir. SUID denetlenmeli ve sistem güncel tutulmalı.

Kök sorun: web kullanıcısı aşırı yetkili/root, izinler gevşek (777/644/000), ve yükseltme yüzeyi (SUID) denetlenmemiş. Çözüm: düşük yetkili web kullanıcısı + sıkı izinler + SUID hijyeni + güncelleme.


6. Hacker Bakış Açısı

Saldırgan bir web shell sonrası ne yapar?

Bağlamını belirler. id/whoami ile hangi kullanıcı olduğunu (umarım düşük yetkili www-data) görür. root çalışan bir web sunucusu bulursa, zaten kazanmıştır.

Yatay erişim arar. World-readable sırları (.env, config, ~/.aws, SSH anahtarları), diğer sitelerin/kullanıcıların dosyalarını, world-writable dizinleri (find / -perm -2 -type f) arar. Bir sır bulursa (Bölüm 25) doğrudan başka sistemlere yayılır.

Kalıcılık kurar. Kod dizini yazılabilirse, bir arka kapı bırakır veya mevcut PHP dosyalarını değiştirir (Bölüm 34). Kod www-data'ya yazılamazsa, kalıcılık zorlaşır.

Dikey yükseltme dener. Yerel keşif: SUID ikilileri (find / -perm -4000 2>/dev/null), yazılabilir cron/servis dosyaları, sudo yapılandırması, çekirdek/paket sürümleri. Bilinen bir yükseltme açığı (PwnKit, DirtyPipe, Sudo Baron Samedit vb.) varsa root'a çıkar. PwnKit özellikle çekicidir çünkü neredeyse her dağıtımda öntanımlı ve trivial biçimde sömürülebilir.

Yeteneklerini kullanır. root olduğunda; tüm veri, kalıcılık (rootkit), yanal hareket, log temizleme.

Savunmacı dersi: Saldırgan bir web shell'i bir başlangıç olarak görür ve izin/yetki zayıflıklarını sistematik arar. Her zayıflık (root web sunucusu, world-writable kod, world-readable sır, yamasız SUID) bir yükseltme basamağıdır. En az yetki + sıkı izinler + SUID hijyeni bu basamakları kaldırır.


7. Exploit Mantığı

Bu bölüm çalıştırılabilir yükseltme betiği içermez. İzinlerin neden belirleyici olduğu kavramsaldır:

  • En az yetki, etkiyi belirler. Bir web shell'in yapabilecekleri, web kullanıcısının yetkisi kadardır. Root çalışan sunucu = anında tam devir; düşük yetkili sunucu + sıkı izinler = sınırlı, geçici erişim. Bu, Bölüm 1/21/25'in ISO seviyesindeki tekrarıdır.
  • Yazılabilirlik = kalıcılık. Bir arka kapının kalıcı olabilmesi, saldırganın bir yere yazabilmesine bağlıdır. Kod dizini web kullanıcısınca yazılamazsa, kalıcılık ciddi biçimde zorlaşır.
  • SUID = yükseltme yüzeyi. SUID-root ikilileri, düşük yetkiden root'a köprüdür. Birinde bir açık (PwnKit) varsa, tüm izin izolasyonu çöker. Bu yüzden SUID yüzeyi minimal ve güncel tutulmalıdır.
  • Zincir doğası. Tam devir genellikle bir zincirdir: RCE → web shell → yerel keşif → SUID yükseltme → root. Her halka bir izin/yetki savunmasıyla kırılabilir (derinlemesine savunma).

Araştırmacının çerçevesi: (a) web kullanıcısı düşük yetkili mi (root değil), (b) kod/sırlar web kullanıcısınca yazılamaz/okunamaz mı, (c) SUID yüzeyi minimal ve güncel mi. Savunma zinciri her halkada kırar.


8. Güvenli Kod

Sıkı izin yapılandırması:

# ✅ GÜVENLİ izinler
# 1) Web sunucusu/FPM DÜŞÜK YETKİLİ kullanıcıyla (Bölüm 26); asla root
#    (nginx: user nginx;  php-fpm pool: user = app_php)

# 2) Kod: deploy kullanıcısına ait, web kullanıcısına YAZMA YOK
chown -R deploy:app_php /var/www/app
find /var/www/app -type d -exec chmod 750 {} \;   # dizinler rwxr-x---
find /var/www/app -type f -exec chmod 640 {} \;   # dosyalar rw-r-----
# → app_php (FPM) grubu OKUR ama YAZAMAZ → web shell kodu değiştiremez

# 3) Yükleme dizini: web kullanıcısı yazar ama ÇALIŞTIRAMAZ
chown deploy:app_php /var/www/app/storage/uploads
chmod 770 /var/www/app/storage/uploads
mount -o remount,noexec /var/www/app/storage    # (mümkünse) noexec
# + web sunucusu bu dizinde PHP çalıştırmaz (Bölüm 27) + web-dışı sakla (Bölüm 19)

# 4) Sırlar: sıkı izin, web kullanıcısı OKUYAMAZ (Bölüm 25)
chown deploy:deploy /var/www/app/.env
chmod 600 /var/www/app/.env                       # yalnızca deploy okur
# (ideali: sır yöneticisi — Bölüm 25)

# 5) Güvenli umask
umask 027                                          # yeni dosyalar: diğer=--- 

# 6) SUID hijyeni: gereksizleri denetle/kaldır, sistemi güncel tut
find / -perm -4000 -type f 2>/dev/null             # SUID ikililerini listele
# gereksizleri: chmod u-s <ikili>
apt-get update && apt-get upgrade polkit           # PwnKit yaması (CVE-2021-4034)

Öne çıkan modern pratikler: - Web sunucusu/FPM düşük yetkili kullanıcı (Bölüm 26): Asla root; bir RCE'nin doğrudan root vermesini engeller. - Kod web kullanıcısınca yazılamaz: Deploy kullanıcısına ait, web kullanıcısı yalnızca okur → web shell kalıcılığını/kod değişimini engeller (Bölüm 34). - Yükleme dizini yazılabilir ama çalıştırılamaz: noexec + web sunucusu PHP çalıştırmaz (Bölüm 27) + web-dışı sakla (Bölüm 19). - Sırlar sıkı izinli (600/640), web kullanıcısı okuyamaz — ya da sır yöneticisinde (Bölüm 25). - Güvenli umask (027): Yeni dosyalar varsayılan olarak korunur. - World-writable yok: 777/o+w kaçınılır; düzenli denetlenir (find / -perm -2). - SUID hijyeni: find / -perm -4000 ile denetle, gereksizleri kaldır (u-s), sistemi güncel tut (PwnKit). - Derinlemesine savunma (Bölüm 1): Her katman bir yükseltme basamağını kaldırır.


9. Patch Analizi

Neden işe yarar? Düşük yetkili web kullanıcısı, bir RCE'nin root yerine sınırlı bir bağlamda kalmasını sağlar. Kodun web kullanıcısınca yazılamaması, kalıcılığı ve kod-enjeksiyonunu engeller. Sırların web kullanıcısınca okunamaması, yatay yayılımı (Bölüm 25) keser. SUID hijyeni + güncelleme, dikey yükseltme yolunu (PwnKit) kapatır. Bunlar birlikte, RCE→web shell→root zincirini her halkasında kıran bir en-az-yetki katmanları dizisidir (Bölüm 1).

İzin karşılaştırması:

Varlık Yanlış Doğru
Web sunucusu root Düşük yetkili kullanıcı
Kod dizini 777/www-data'ya ait 640/750, deploy'a ait, web okur-yazamaz
Yükleme dizini 777 (çalıştırılabilir) Yazılabilir + noexec + PHP çalışmaz
Sırlar 644 (world-readable) 600/640 / sır yöneticisi
umask 000 027
SUID Denetlenmemiş/yamasız Denetli, minimal, güncel

PwnKit özel notu: SUID-root ikilileri kaçınılmaz olarak vardır (passwd, sudo, pkexec). Savunma, yüzeyi minimize etmek (gereksizleri kaldırmak) ve güncel tutmaktır. PwnKit, 12 yıl gizli kalmış bir açığın nasıl tüm izin izolasyonunu çökertebildiğini gösterir — bu yüzden yama yönetimi (Bölüm 30) izin hijyeninin ayrılmaz parçasıdır.

Performans: İzin ayarlarının çalışma-zamanı maliyeti yoktur. noexec mount'un etkisi ihmal edilebilir. Güvenlik kazancı — blast radius daralması — çok büyüktür.


10. Gerçek Hayat Senaryosu

Kurgu — bir e-ticaret sunucusu. Kolaylık için tüm web dizini chmod 777 yapılmış, .env 644, ve sunucu bir süredir güncellenmemiş (polkit yamasız). Bir dosya yükleme açığı (Bölüm 19) web shell'e dönüşünce, saldırgan (www-data): (1) world-readable .env'den ödeme sağlayıcı API anahtarlarını okur (Bölüm 25); (2) world-writable kod dizinine kalıcı bir arka kapı yazar (Bölüm 34); (3) find / -perm -4000 ile yamasız pkexec'i bulup PwnKit ile root'a yükselir → tam sistem devri, tüm müşteri verisi. Doğru izinlerle: kod yazılamaz (kalıcılık yok), .env okunamaz (sır yok), polkit güncel (root yok) — web shell "sınırlı, geçici" kalırdı. Dersler: (1) 777 ve world-readable sır felakettir; (2) kod web kullanıcısınca yazılamamalı; (3) SUID güncelliği (yama, Bölüm 30) yükseltmeyi engeller.


11. Gerçek CVE Analizi — PwnKit: pkexec SUID Yetki Yükseltme (CVE-2021-4034)

Qualys danışması, Red Hat/Ubuntu güvenlik bültenleri ve MITRE/NVD ile doğrulanmıştır. Silahlaştırılmış payload verilmez.

Özet. 25 Ocak 2022'de Qualys, Polkit'in pkexec aracında bir yerel yetki yükseltme açığı (CVE-2021-4034, "PwnKit") açıkladı. pkexec, her büyük Linux dağıtımında öntanımlı kurulu bir SUID-root programdır (düşük yetkili süreçlerin ayrıcalıklı işlemler yapmasını sağlar, sudo'ya benzer). Açık sayesinde herhangi bir düşük yetkili yerel kullanıcı, öntanımlı yapılandırmada tam root yetkisi kazanabiliyordu. Açık 2009'daki ilk sürümden beri (12+ yıl) gizli kalmıştı ve tüm pkexec sürümlerini etkiliyordu. CVSS 7.8; Qualys, Ubuntu/Debian/Fedora/CentOS öntanımlı kurulumlarında bağımsız olarak doğruladı.

Teknik neden — argüman işleme ve SUID. Kök neden, pkexec'in komut satırı argüman sayısını (argc) düzgün doğrulamamasıydı: hiç argüman geçilmediğinde (argc=0), programın main() fonksiyonunda bir sınır-dışı (out-of-bounds) okuma/yazma oluşuyordu. Saldırgan, ortam değişkenlerini (özellikle GCONV_PATH) manipüle ederek bu belleği kontrol edip root yetkisiyle keyfi kod çalıştırabiliyordu. Kritik nokta izin modeliyle ilgilidir: pkexec SUID-root olduğundan (yani onu çalıştıran düşük yetkili kullanıcı için bile root yetkisiyle çalıştığından), içindeki bu bellek hatası doğrudan root'a yükselmeye dönüşüyordu. SUID biti olmasaydı, aynı hata yalnızca kullanıcının kendi yetkisinde kalırdı.

Bu, SUID ikililerinin neden bir yetki-yükseltme yüzeyi olduğunun ders kitabı örneğidir: SUID-root bir programdaki herhangi bir kod çalıştırma açığı, çalıştıran kullanıcıyı root yapar. OpenBSD'nin savunmasız olmaması öğreticidir — çünkü execve'yi boş argc ile çağırmaya izin vermez (savunmacı bir tasarım kararı).

Web bağlamıyla zincir. PwnKit'in web güvenliğiyle bağı, yükseltme adımıdır: bir saldırgan uzaktan RCE / web shell (Bölüm 8, 19) ile düşük yetkili www-data erişimi elde ettiğinde, PwnKit ile root'a yükselir. Qualys ve analistler bunu "Log4Shell gibi uzaktan RCE açıklarının mükemmel tamamlayıcısı" olarak nitelendirdi — uzaktan giriş + yerel yükseltme = tam devir.

Etki. Neredeyse tüm Linux sistemleri; trivial ve güvenilir sömürü; herhangi bir yerel kullanıcıdan root. Yama hızla yayıldı.

Düzeltme ve mitigasyon. Dağıtımlar polkit'i yamaladı. Yama uygulanamıyorsa geçici çözüm: pkexec'ten SUID bitini kaldırmak (chmod 0755 /usr/bin/pkexec) — bu, aracın root çalıştırma yeteneğini kaldırır ama açığı kapatır.

Çıkarılacak dersler: 1. SUID ikilileri bir yetki-yükseltme yüzeyidir. Denetle (find / -perm -4000), gereksizleri kaldır, güncel tut. 2. Yama yönetimi (Bölüm 30) izin hijyeninin parçasıdır. 12 yıllık bir açık, güncelleme olmadan izin izolasyonunu çökertir. 3. En az yetki zinciri kırar. Web kullanıcısı düşük yetkili + sıkı izinler + minimal/güncel SUID = RCE'den root'a giden yol kapanır (Bölüm 1). 4. Savunmacı tasarım (OpenBSD). Kenar durumları (boş argc) reddetmek, bütün bir açık sınıfını önleyebilir (secure by default, Bölüm 3).


12. Detection

Sistem incelemede:

find / -perm -4000 -type f 2>/dev/null        # SUID ikilileri
find / -perm -2 -type f 2>/dev/null           # world-writable dosyalar
find /var/www -type f -perm -o+w 2>/dev/null  # world-writable web dosyaları
ls -la /var/www/app/.env                       # sır izinleri (600/640 mı?)
ps aux | grep -E 'nginx|apache|php-fpm' | awk '{print $1}' | sort -u  # kullanıcı root mu?
stat -c '%U %a' /var/www/app                   # kod sahibi/izni
pkexec --version                               # polkit güncel mi (PwnKit)?

Kontroller: web sunucusu root mu? Kod www-data'ya yazılabilir mi? Sırlar world-readable mi? Gereksiz SUID var mı? Sistem güncel mi?

SAST/yapılandırma tarama: İzin denetimi (CIS Benchmark, Lynis); world-writable, aşırı-izinli sır ve gereksiz SUID için kurallar.

FIM (Dosya Bütünlüğü İzleme): Kod dizinindeki değişiklikler (web shell/backdoor — Bölüm 34), izin değişiklikleri (chmod), yeni SUID dosyaları.

Loglar/SIEM: www-data sürecinden beklenmeyen alt süreçler (yükseltme denemesi); pkexec/sudo anormal çağrıları; SUID ikili yürütmeleri; yeni SUID dosyası oluşumu; ve id/whoami/find -perm gibi keşif komutları. Web kullanıcısından root süreçlerine geçiş en kritik yükseltme sinyalidir.


13. Prevention

  • Web sunucusu/FPM düşük yetkili kullanıcı (Bölüm 26): Asla root.
  • Kod web kullanıcısınca yazılamaz: Deploy'a ait, web yalnızca okur (640/750) → kalıcılık engeli (Bölüm 34).
  • Yükleme yazılabilir ama çalıştırılamaz: noexec + PHP çalışmaz (Bölüm 27) + web-dışı (Bölüm 19).
  • Sırlar sıkı izinli / sır yöneticisi (Bölüm 25): Web kullanıcısı okuyamaz.
  • Güvenli umask (027); world-writable yok.
  • SUID hijyeni: Denetle, gereksizleri kaldır, minimal tut.
  • Yama yönetimi (Bölüm 30): PwnKit gibi yükseltme açıklarını kapat.
  • En az yetki (Bölüm 1) + FIM + izin denetimi (Lynis/CIS).

14. Mitigation

  • Acil: Web sunucusunu düşük yetkiliye indir; 777/world-writable'ı düzelt; sır izinlerini sıkılaştır; polkit/paketleri yamala (PwnKit); gereksiz SUID'leri kaldır.
  • Geçici: FIM/loglardan web shell/backdoor ve yükseltme izlerini tara (Bölüm 34); ele geçirilmiş kimlikleri/sırları döndür (Bölüm 25); root erişimi olduysa sistemi yeniden inşa etmeyi değerlendir.
  • Kalıcı: İzin standardını (kod okunur-yazılamaz, sır sıkı, umask 027) baseline yap; SUID denetimini ve yama yönetimini otomatikleştir; FIM + izin taramasını CI/CD ve çalışma zamanına ekle.

15. Checklist

  • [ ] Web sunucusu/FPM düşük yetkili kullanıcıyla mı çalışıyor (root değil — Bölüm 26)?
  • [ ] Kod dizini web kullanıcısınca yazılamaz mı (deploy'a ait, web okur)?
  • [ ] Yükleme dizini yazılabilir ama çalıştırılamaz mı (noexec + PHP çalışmaz — Bölüm 19, 27)?
  • [ ] Sırlar sıkı izinli (600/640) ve web kullanıcısınca okunamaz mı (Bölüm 25)?
  • [ ] umask güvenli mi (027); world-writable dosya yok mu?
  • [ ] SUID ikilileri denetlendi, gereksizler kaldırıldı mı (find / -perm -4000)?
  • [ ] Sistem/paketler güncel mi (PwnKit vb. — Bölüm 30)?
  • [ ] FIM kod dizinini ve izin/SUID değişimlerini izliyor mu?
  • [ ] En az yetki her katmanda uygulanıyor mu (Bölüm 1)?

16. Laboratuvar

Lab 28.1 — İzin modeli. İzole ortamda chmod/chown ile bir dosyanın user/group/other izinlerini değiştir; farklı kullanıcılarla okuma/yazma/çalıştırmayı test et. Octal gösterimi (750/640/600) pekiştir.

Lab 28.2 — Yazılamaz kod. Kod dizinini www-data'ya yazılamaz yap; bir "web shell" (izole test) ile dosya yazmayı dene ve engellendiğini gözlemle. Yazılabilir yapıp farkı gör (Bölüm 34'e bağla).

Lab 28.3 — SUID keşfi. find / -perm -4000 ile SUID ikililerini listele; her birinin neden SUID olduğunu araştır. Gereksiz bir test SUID ikilisi oluşturup u-s ile kaldır.

Lab 28.4 — World-readable sır. .env'i 644 yap ve farklı bir kullanıcıyla oku; 600'e indirip erişimin kapandığını doğrula (Bölüm 25'e bağla).


17. Quiz

  1. Unix izin modelini (user/group/other, rwx, octal) açıklayın. 750 ve 640 ne demektir?
  2. Web sunucusu neden asla root çalışmamalıdır?
  3. Kodun web kullanıcısınca yazılamaz olması neyi (web shell kalıcılığı) engeller?
  4. Yükleme dizini neden yazılabilir ama çalıştırılamaz olmalıdır (Bölüm 19, 27)?
  5. .env'in world-readable olması hangi açığa (Bölüm 25) yol açar?
  6. umask nedir ve güvenli bir değer neden önemlidir?
  7. SUID biti ne yapar ve neden bir yetki-yükseltme yüzeyidir?
  8. PwnKit'te SUID biti nasıl bir rol oynadı? SUID olmasaydı sonuç ne olurdu?
  9. Tipik bir yetki yükseltme zincirini (RCE→root) adımlarıyla açıklayın.
  10. find / -perm -4000 ne bulur ve neden düzenli çalıştırılmalıdır?
  11. PwnKit, yama yönetiminin (Bölüm 30) izin hijyeninin neden parçası olduğunu nasıl gösterir?
  12. OpenBSD PwnKit'e neden savunmasız değildi ve bu hangi ilkeyi (Bölüm 3) örnekler?

18. Kaynakça

  • OWASP, File Permissions ve Least Privilege rehberleri; CIS Linux Benchmark; Lynis denetim aracı.
  • MITRE, CWE-732: Incorrect Permission Assignment for Critical Resource; CWE-250: Execution with Unnecessary Privileges; CWE-269: Improper Privilege Management.
  • MITRE / NVD, CVE-2021-4034 (PwnKit); Qualys Research, PwnKit: Local Privilege Escalation in polkit's pkexec (2022); Red Hat RHSB-2022-001.
  • chmod, chown, umask, find, stat man sayfaları; Linux SUID/SGID dokümantasyonu.
  • PHP-FPM pool user dokümantasyonu (Bölüm 26); web sunucusu düşük-yetki çalıştırma rehberleri.