Selamlar,
LiteLLM 1.107.0'ın zararlısı neden "litellm import etmeden" çalıştı? Cevap Python'un site başlangıç mekanizmasında. Bu yazıda resmi site modülü belgelerine dayanarak .pth dosyaları, sitecustomize ve yeni .start dosyalarının nasıl çalıştığını, neden tedarik zinciri saldırılarında bu kadar sevildiğini anlatıyorum.
Konuda anlatılacaklar
- site modülü ne zaman yüklenir?
- .pth dosyalarında "import" satırları
- sitecustomize ve usercustomize
- Python 3.15+ .start dosyaları
- Savunma: kendi ortamınızda nasıl tararsınız?
site modülü ne zaman yüklenir?
Python belgelerine göre site modülü yorumlayıcı başlatılırken otomatik içe aktarılır. -S seçeneğiyle bu otomatik içe aktarma bastırılabilir. Modül, sys.prefix / sys.exec_prefix altındaki site-packages dizinlerini sys.path'e ekler ve o dizinlerdeki yapılandırma dosyalarını işler.
.pth dosyaları
name.pth dosyaları site-packages içinde bulunur. Her satır normalde sys.path'e eklenecek bir yoldur. Ama geriye dönük uyumluluk için "import" ile başlayan satırlar exec() ile çalıştırılır. LiteLLM olayındaki cook.pth dosyası yalnızca şunu içeriyordu: import cook. Yani her Python başlangıcında cook.py çalışıyordu.
Belgeler ayrıca diyor ki: yürütülebilir satırlar (pth içindeki import satırları ve .start giriş noktaları), belirli bir modülün gerçekten kullanılıp kullanılmayacağından bağımsız olarak başlangıçta her zaman çalışır; -S verilmedikçe.
Python 3.15'te pth içindeki import satırları kullanımdan kaldırıldı (deprecated); 3.20'de kaldırılacak. Yerine .start dosyaları geliyor.
sitecustomize
Yol manipülasyonlarından sonra site modülü sitecustomize adlı bir modülü içe aktarmaya çalışır. Bu dosya tipik olarak sistem yöneticisi tarafından site-packages'e konur ve keyfi özelleştirme yapabilir. ImportError (name='sitecustomize') sessizce yok sayılır. LiteLLM olayında saldırgan sitecustomize.py'yi wheel'in .data/purelib/ dizinine koyarak pip'in onu site-packages köküne kopyalamasını sağladı; böylece her başlangıçta arka plan yükleyici ayağa kalkıyordu.
Lab: zararsız bir gösterim
# Yalnızca kendi venv'inizde deneyin
python3 -m venv /tmp/sitedemo && source /tmp/sitedemo/bin/activate
SP=$(python -c "import site; print(site.getsitepackages()[0])")
# Zararsız bir isaretleyici
cat > "$SP/demo_hook.py" <<'E'
print("[demo_hook] calisti - bu satiri uretimde GORMEK istemezsiniz")
E
echo "import demo_hook" > "$SP/demo_hook.pth"
python -c "print('merhaba')"
# Temizlik
rm -f "$SP/demo_hook.py" "$SP/demo_hook.pth"Savunma taraması
# Tum site-packages icinde supheli pth / sitecustomize
python - <<'PY'
import site, pathlib
paths = list(site.getsitepackages())
if site.ENABLE_USER_SITE and site.USER_SITE:
paths.append(site.USER_SITE)
for p in paths:
root = pathlib.Path(p)
if not root.is_dir():
continue
for f in root.glob("*.pth"):
text = f.read_text(errors="replace")
if any(ln.lstrip().startswith("import ") for ln in text.splitlines()):
print("PTH_IMPORT", f)
for name in ("sitecustomize.py", "usercustomize.py"):
t = root / name
if t.exists():
print("CUSTOMIZE", t)
PYÜretim imajlarınızda pth/sitecustomize taraması var mı? Script'inizi paylaşırsanız herkes faydalanır.
Yasal uyarı
Bu yazı bilgilendirme ve savunma amaçlıdır. Anlatılan kontrolleri yalnızca kendi sistemlerinizde veya yazılı izinle yapın. İzinsiz erişim, tarama ve sömürü girişimleri TCK 243-245 kapsamında suçtur. TurkTeam white-hat bir topluluktur; çalıntı veri, hesap, combo/log paylaşımı ve hack hizmeti talepleri forum kurallarına aykırıdır.
Kaynaklar