flawopen.com/Ruby YAML/Ruby YAML
Apakah YAML.load aman untuk input yang tidak tepercaya?
Periksa versi Psych yang benar-benar dimuat aplikasi: Psych 4, yang disertakan dalam Ruby 3.1, mengubah YAML.load agar memakai deserialisasi aman secara default. Versi Psych sebelumnya membangun objek secara bebas; Psych juga dapat diperbarui terpisah dari Ruby. YAML.unsafe_load dan Marshal.load mendeserialisasi objek Ruby dan tidak boleh menerima masukan yang tidak tepercaya.
# Psych < 4: YAML.load used unsafe # object construction by default. YAML.load(params[:config]) # Every Psych version: explicitly unsafe. YAML.unsafe_load(user_input) Psych.unsafe_load(user_input) # Marshal has no restricted safe-load API. Marshal.load(cookie_value)
# Explicit restricted types; keep this list minimal. require "yaml" require "date" data = YAML.safe_load( input, permitted_classes: [Date], permitted_symbols: [], aliases: false ) # For ordinary external data, prefer JSON and # validate its shape, values, and input size. data = JSON.parse(input)
Mengapa YAML dapat berbahaya
Tag YAML dapat dipetakan Psych menjadi objek Ruby. Saat pemuatan tidak aman, dokumen bertag dapat meminta konstruksi sebuah kelas dan memberikan nilai untuk status serialisasinya; dampaknya bergantung pada kelas yang tersedia dan perilakunya. Ini menjadi dasar rantai gadget deserialisasi. Gunakan pemuatan aman untuk YAML tidak tepercaya dan validasi data hasilnya secara terpisah. Risiko umum serupa berlaku pada Python pickle, PHP unserialize, dan Ruby Marshal.load.
Rails dan aplikasi lain dapat memuat banyak dependensi, sehingga kelas dan perilaku yang tersedia bagi rantai deserialisasi tidak aman bertambah. Hal ini bergantung pada penerapan tertentu dan bukan sifat semua aplikasi Rails atau dokumen YAML.
Mengapa perubahan versi membingungkan
Psych 4 mengubah YAML.load agar memakai pemuatan aman secara default dan menambahkan unsafe_load untuk perilaku konstruksi objek sebelumnya. Ruby 3.1 menyertakan Psych 4, tetapi aplikasi dapat memilih versi gem Psych lain. Audit dependensi yang benar-benar terpasang dan runtime, bukan hanya versi Ruby. Pemuatan aman dapat menolak kelas khusus aplikasi atau alias; migrasikan dengan daftar izin eksplisit yang minimal, bukan beralih ke unsafe_load.
Jika pembaruan memperkenalkan unsafe_load, anggap itu temuan keamanan bila masukan dapat dipengaruhi dari luar batas deployment tepercaya. Utamakan safe_load dengan daftar minimum permitted_classes; jangan memperluasnya hanya demi menghilangkan kesalahan kompatibilitas.
FAQ
Apakah YAML.safe_load sepenuhnya aman?
Bagaimana jika saya memuat file konfigurasi sendiri?
Apakah Marshal dapat diterima?
Risiko Ruby yang terpisah: Marshal.load
Terpisah dari YAML, dokumentasi Ruby menyatakan bahwa Marshal.load dapat membangun kembali hampir semua kelas yang dimuat dalam proses dan dapat menyebabkan eksekusi kode jarak jauh jika datanya tidak tepercaya. Simpan data Marshal di dalam batas kepercayaan; jangan pernah mendeserialisasi byte dari pengguna atau yang dapat dipengaruhi penyerang.
Referensi
- Ruby documentation — Psych (YAML)
- Psych 4.0 — Ruby 3.1 API documentation
- Ruby documentation — Marshal security considerations
- CVE-2024-35221 — YAML alias denial of service in RubyGems metadata
- CWE-502 — Deserialization of Untrusted Data
- Is Python's pickle safe for untrusted data?
- Is PHP's unserialize() safe on user input?
- Dokumentasi Ruby — peringatan keamanan Marshal.load