Güvensiz deserialization: kod olarak çalışan veri
Bazı serileştirme formatları davranışı olan nesneleri tarif edebilir. Bunlardan birini güvenilmeyen bir kaynaktan yüklemek, onu yazan kişinin yükleme sırasında neyin çalışacağına karar vermesini sağlar.
Örnek
import pickle
@app.post("/import")
def import_settings():
settings = pickle.loads(request.data)
return apply(settings)import json
@app.post("/import")
def import_settings():
settings = json.loads(request.data)
validate(settings) # check the shape and the types
return apply(settings)Nasıl oluşur
Python'un pickle'ı, güvenli yükleyici olmadan yaml.load, Java'nın ObjectInputStream'i, PHP'nin unserialize'ı ve node-serialize, kurulum kodu çözme sırasında çalışan nesneler oluşturabilir. Oturum verileri, önbellek kayıtları, içe aktarma özellikleri ve mesaj kuyrukları bu tür verinin dışarıdan geldiği tipik yerlerdir.
Nasıl düzeltilir
Yalnızca veri taşıyan bir format kullan.
- JSON kullan ve şeklini ve türlerini doğrula
- yaml.load yerine yaml.safe_load kullan
- Kullanıcının etkileyebileceği veriyi asla unpickle etme; gidip gelmesi gereken veriyi imzala
- node-serialize ve benzeri kütüphaneleri kaldır
RepoVerse bunu nasıl bulur
- Yüksekİstek girdisi canlı nesnelere deserialize ediliyor
Fonksiyonları yeniden kuran serileştiriciler, çözme sırasında saldırganın seçtiği kodu çalıştırır.
veri akışı · CWE-502
- YüksekGüvenilmeyen veri nesneye çevriliyor
`pickle`, `marshal` ve çıplak `yaml.load`, verilen baytlardan keyfi Python nesnesi — yani keyfi kod — üretir.
örüntü
- YüksekGüvenilmeyen veri nesneye çevriliyor
`node-serialize`, `serialize-javascript` unserialise ve `vm.runInNewContext` yalnızca veriyi değil davranışı da geri kurar.
örüntü
Sorular
- JSON.parse güvenli mi?
- JSON.parse yalnızca düz veri oluşturur, kod çalıştıramaz. Sonuç yine doğrulanmalıdır; dikkatsizce nesnelere birleştirmek prototype pollution'a yol açabilir.
- Serileştirilmiş veriyi imzalamak yeterli mi?
- Sunucu tarafı bir anahtarla imzalamak, anahtar gizli kaldığı sürece kurcalamayı önler. Yalnızca veri taşıyan formatlar yine daha güvenli varsayılandır.
İlgili
- Kod injection: eval'e verilen istek girdisiİstek verisi üzerinde eval, new Function ve string timer'ların neden uzaktan kod çalıştırma (CWE-95) anlamına geldiği, OWASP NodeGoat'tan gerçek bir örnek ve çözüm.
- Komut injection: bir parametre shell komutu çalıştırdığındaKomut injection (CWE-78) bir istek parametresini nasıl ikinci bir shell komutuna çevirir, güvenli execFile kalıbı ve girdiyle beslenen exec çağrılarını bulma.
- Kod, secret ve bağımlılıklar için GitHub güvenlik taramasıGitHub reposunu injection açıkları, sızmış secret'lar ve zafiyetli bağımlılıklar için tara. İstekten tehlikeli çağrıya veri akışı izi ve çözüm önerileri.
Güncellendi 2026-10-11