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

Zafiyetli
import pickle

@app.post("/import")
def import_settings():
    settings = pickle.loads(request.data)
    return apply(settings)
Güvenli
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

Güncellendi 2026-10-11