FlawOpen

flawopen.com/Mass Assignment/Penjelasan

Mass Assignment: risiko dan allowlist field yang aman

CWE-915: Improperly Controlled Modification of Dynamically-Determined Object AttributesHalaman referensi
Jawaban singkat

Bayangkan model sebagai formulir dengan field pengguna dan kontrol khusus staf. Mengikat seluruh permintaan membiarkan pelanggan mengisi pemilik akun, persetujuan, atau peran. Tentukan field yang dapat diedit di server, lalu otorisasi record dan operasi secara terpisah.

VULNERABLE
# Rails: request keys reach model attributes
User.new(params[:user])

// Node / Mongoose: request object used as update
await User.findByIdAndUpdate(id, req.body);

// Express + Sequelize: request object used as create values
await User.create(req.body);

# Django: request keys passed as model fields
User.objects.create(**request.POST.dict())
FIXED
# Rails — permit only user-editable fields
attrs = params.require(:user).permit(:name, :email)
user = User.new(attrs)

// Node — construct an allowlisted update
const { name, email } = req.body;
await User.findByIdAndUpdate(id, { name, email });

# Django — explicit ModelForm fields
class UserForm(ModelForm):
    class Meta:
        model = User
        fields = ["name", "email"]

// .NET — bind a DTO, then map explicitly
user.Name = input.Name;
user.Email = input.Email;

Mengapa allowlist sisi server penting

Daftar blokir “terima semua kecuali role” dapat gagal saat field sensitif baru muncul. Dengan allowlist, field baru tidak dapat diedit sampai diizinkan kode. Rails Strong Parameters menolak atribut yang tidak diizinkan saat mass assignment; controller tetap harus membatasi field untuk tindakan itu. DTO atau daftar eksplisit memberikan batas serupa.

Allowlist membatasi atribut yang dapat ditetapkan permintaan, bukan izin mengubah record. Batasi record pada principal terautentikasi, otorisasi operasi, dan pisahkan perubahan istimewa ke alur server.

Kategori field sensitif

Periksa atribut model, serializer bertingkat, dan endpoint pembaruan:

Pertanyaan umum

Apakah ini sama dengan prototype pollution?

Ini kelemahan berbeda. Mass assignment menetapkan atribut tak dimaksud pada objek yang dibuat atau diperbarui. Prototype pollution mengubah properti prototipe dan dapat memengaruhi pencarian properti objek lain. Penggabungan tak aman dapat membuka jalur itu; dampak mass assignment bergantung pada penggunaan propertinya. Lihat prototype pollution.

Apakah GraphQL menghindari masalah ini?

Tidak. Mutasi GraphQL dapat menerima input terlalu luas. Batasi tipe input ke field yang boleh diubah klien dan otorisasi objek serta operasi di resolver atau layanan.

Apakah formulir server melindungi saya?

Tidak. Formulir tidak membatasi klien HTTP. Anggap semua field dikendalikan penyerang, validasi struktur di server, dan terima hanya field untuk tindakan itu.

Referensi

Lihat juga Kebocoran state serverless: isolasi data per permintaan PHP == dan perbandingan Magic Hash Apakah blok unsafe Rust tetap aman bagi memori? Apakah strncpy() lebih aman daripada strcpy()? CWE vs CVE: apa bedanya?