🐹 Mustafa ile Öğreniyorum #22: Bulut Mimarilerinin Korkulu Rüyası: SSRF (Server-Side Request Forgery)
Modern web uygulamaları; üçüncü taraf API'lardan veri çekmek, PDF oluşturmak veya dış bağlantılardan görsel indirmek için sürekli HTTP istekleri yapar. Saldırganların sunucuyu bir piyon gibi kullanarak iç ağdaki gizli servislere veya bulut altyapılarına erişmesini sağlayan zafiyete SSRF (Server-Side Request Forgery) diyoruz.
📌 SSRF Saldırı Vektörleri ve Tehlike Boyutu
Bulut Metadata Sızıntıları (AWS/Azure/GCP): Saldırganlar, sunucunun iç IP erişimini kullanarak metadata adresine ([http://169.254.169.254](http://169.254.169.254)) istek attırabilir. AWS IMDSv1 gibi korumasız yapılarda IAM rol yetkileri ve geçici API anahtarları kolayca çalınabilir.
İç Ağ Taraması (Port Scanning): Dış dünyaya kapalı olan iç ağdaki microservice'ler, Redis, Elasticsearch veya localhost (127.0.0.1:8080) üzerindeki yetkisiz yönetim panelleri taranıp ele geçirilebilir.
Filtre Atlama (Bypass) Teknikleri: Geliştiriciler localhost veya 169.254.169.254 metinlerini engellediğinde; saldırganlar IP kodlama (2130706433), IPv6 ([::]), yönlendirmeler (HTTP Redirect) veya DNS Rebinding kullanarak filtreleri aşabilir.
🛡 SSRF Zafiyetine Karşı 3 Altın Savunma Katmanı
IMDSv2'ye Geçiş: AWS ortamlarında oturum tabanlı (token zorunlu) IMDSv2 kullanımını zorunlu kılın. GET isteğiyle metadata okuyan klasik SSRF vektörleri bu sayede etkisiz hale gelir.
Ağ Seviyesinde İzolasyon (Egress Filtering): Uygulama sunucularının iç ağdaki hassas servislere ve metadata IP adresine erişimini firewall/SG kurallarıyla tamamen engelleyin.
Sıkı Beyaz Liste (Allowlist) ve IP Kontrolü: Sadece izin verilen alan adlarına (domain) erişim tanıyın. Kullanıcıdan alınan URL çözümlendikten sonra elde edilen IP adresinin özel ağ aralıklarında, localhost, link-local ve diğer hassas adreslerde olmadığını doğrulayın.
💻 Zafiyetli vs. Güvenli URL İstek Örneği (Python)
---
Python
import socket
import urllib.parse
import requests
import ipaddress
# ❌ ZAFİYETLİ
# Doğrudan kullanıcının verdiği URL'e istek atıyor
def fetch_user_url_bad(url: str):
return requests.get(url).text
# ✅ DAHA GÜVENLİ
# IP çözümlemesi ve özel ağ kontrolü yapılıyor
def is_private_ip(ip_address: str) -> bool:
ip = ipaddress.ip_address(ip_address)
return (
ip.is_private
or ip.is_loopback
or ip.is_link_local
or ip.is_reserved
)
def fetch_user_url_secure(url: str):
parsed_url = urllib.parse.urlparse(url)
# Sadece HTTP/HTTPS protokolüne izin ver
if parsed_url.scheme not in ["http", "https"]:
raise ValueError("Geçersiz protokol!")
# DNS çözümlemesi yap ve hedef IP'yi kontrol et
ip_address = socket.gethostbyname(parsed_url.hostname)
if is_private_ip(ip_address):
raise PermissionError("İç ağ adreslerine erişim yasaktır!")
return requests.get(
url,
timeout=5,
allow_redirects=False
).text
---
O zaman 💬 Mustafa soruyor: Bulut altyapılarınızda SSRF riskine karşı IMDSv2 zorunluluğu uyguluyor musunuz? Uygulama seviyesinde URL doğrulama yaparken filtre bypass tekniklerine karşı nasıl önlemler alıyorsunuz? Düşüncelerinizi yorumlarda paylaşın! 👇
Okuduğunuz için teşekkürler! Kendinize, verilerinize ve dijital zırhınıza çok iyi bakın! 🌼
Henüz yorum yok. İlk yorumu sen yap!

