Mengapa perlindungan CSRF diperlukan untuk add-to-cart?

15

Magento sejak versi baru-baru ini form_keysebagai bagian dari tindakan add to cart, untuk melindungi dari serangan CSRF.

Jadi sekarang saya bertanya-tanya, apakah itu benar-benar diperlukan untuk tempat ini, dan mengapa atau lebih baik dikatakan, terhadap skenario spesifik mana yang harus dilindungi.

Flyingmana
sumber
1
Saya ingin jawaban yang lebih baik daripada ini magento.stackexchange.com/questions/59153/…
Claudiu Creanga

Jawaban:

14

Saya percaya akan sulit untuk menemukan jawaban yang pasti untuk pertanyaan ini mengapa token CSRF "diperlukan" di Magento's add to cart GET action. Saya akan berusaha menafsirkan tujuannya. Saya bukan ahli keamanan dan ini adalah interpretasi saya terhadap CSRF dalam konteks khusus ini.

Konteks

Dari owasp.org

Pemalsuan Permintaan Lintas Situs (CSRF) adalah serangan yang memaksa pengguna akhir untuk melakukan tindakan yang tidak diinginkan pada aplikasi web di mana mereka saat ini diautentikasi. Serangan CSRF secara khusus menargetkan permintaan yang diubah negara, bukan pencurian data, karena penyerang tidak memiliki cara untuk melihat respons terhadap permintaan yang dipalsukan.

Salah satu contoh serangan ini adalah menyematkan gambar tersembunyi di email atau halaman web alternatif:

<img src="http://shop.com/cart/add?sku=sprocket&qty=5" width="0" height="0" border="0">

Server web tidak akan membedakan dari mana permintaan itu berasal dan dengan setia akan menambahkan item ke keranjang pengguna itu.

Tujuan mencegah serangan CSRF adalah untuk mencegah permintaan yang berubah negara . Menambahkan item ke troli akan dianggap sebagai perubahan status. Secara umum, saya akan mempertimbangkan ini adalah perubahan keadaan tidak berbahaya dibandingkan dengan mengirimkan pesanan, mentransfer dana atau memperbarui alamat email.

Mengenai perubahan status dan metode HTTP, RFC 2616 mengatakan yang berikut:

Secara khusus, konvensi telah ditetapkan bahwa metode GET dan HEAD TIDAK HARUS memiliki signifikansi untuk mengambil tindakan selain pengambilan. Metode-metode ini harus dianggap "aman".

Magento dan CSRF

Magento menerapkan mekanisme pencegahan CSRF untuk admin dan area frontend dengan menggunakan token (form key). Saya berasumsi bahwa tujuan Magento, sebagai platform yang dimaksudkan untuk dibangun oleh pengembang lain, adalah untuk mengamankan semua permintaan yang diubah oleh negara. Alasannya adalah bahwa mereka tidak tahu apa yang mungkin diungkapkan oleh pengembang pelaksana atau ekstensi pihak ketiga. Lebih aman untuk mengamankan semua permintaan perubahan negara daripada memiliki sesuatu yang diekspos oleh modul pihak ke-3 dan menjadi PR buruk untuk platform. Saya sebenarnya tidak tahu apakah semua permintaan perubahan negara diamankan dari serangan CSRF.

Satu hal yang perlu diperhatikan adalah bahwa Magento tidak selalu menggunakan kunci formulir untuk melindungi permintaan perubahan negara. Misalnya, permintaan Hapus Dari Keranjang ( /checkout/cart/delete/id/{ID}) dan Hapus Alamat Pelanggan ( /customer/address/delete/id/{ID}) keduanya adalah MENDAPATKAN permintaan yang lulus dalam ID Entitas. Pengontrol (atau model) kemudian menangani memastikan bahwa pengguna berwenang untuk menghapus catatan entitas tersebut (mengubah keadaan). Ini adalah dua contoh di mana Magento tidak mengikuti RFC 2616 . Agar adil, untuk beberapa kasus penggunaan mungkin tidak praktis atau perlu dilakukan.

Tampaknya pemeriksaan formulir kunci dalam Mage_Checkout_CartController::addActionmetode telah ditambahkan di versi 1.8. Dari catatan rilis kami memiliki yang berikut untuk dimatikan:

Mengatasi masalah yang bisa mengakibatkan Pemalsuan Permintaan Lintas Situs (CSRF) di toko web.

Sayangnya bahasanya tidak jelas dan "bisa saja" membuat saya percaya itu karena asumsi yang saya sebutkan sebelumnya: permintaan perubahan keadaan yang aman. Mungkin ada kemungkinan mengirim parameter tambahan yang menyebabkan semacam perilaku yang tidak diinginkan:/checkout/cart/add/product/337/email/[email protected]/password/l33tp4ssw0rd

Idenya adalah bahwa dengan menambahkan sesuatu ke keranjang ada beberapa kode (inti atau pihak ke-3) yang kebetulan dipicu saat menambahkan ke keranjang, misalnya melalui beberapa acara yang dikirim.

Tampaknya tidak mungkin bahwa kerentanan semacam itu ada di luar kotak dan jika memang ada yang berharap Magento akan melakukan pekerjaan yang lebih baik untuk mengungkapkan rincian / risiko. Satu risiko yang bisa saya lihat adalah bahwa Magento secara buta menyimpan parameter permintaan selama menambahkan ke keranjang di product_optionskolom tabel item pesanan penjualan (lihat info_buyRequest:). Secara teori seseorang dapat mengelabui sekelompok pengguna untuk menambahkan item ke keranjang mereka dengan parameter kueri aneh dan itu akan disimpan ke dalam sales_flat_quote_item_optiontabel dan akhirnya sales_flat_order_itemtabel jika mereka juga bisa membuat para pengguna untuk mengkonversi. Ini tampaknya sangat tidak mungkin bagi saya dalam banyak kasus.

Tambahkan ke Masalah Kunci Formulir Keranjang

Salah satu masalah besar yang dihadapi orang dengan implementasi FPC dan token CSRF adalah mereka akhirnya di-cache. Klien pertama yang menghangatkan cache menghasilkan token, ketika klien kedua mendapatkan cache HIT mereka sekarang telah diberi halaman dengan token pengguna pertama. Saat mengirimkan formulir, token tidak akan cocok.

Magento Enterprise menggunakan placeholder untuk menemukan / mengganti kunci formulir di halaman yang di-cache. Implementasi pernis akan menyukai menggunakan ESI ke mana pun kunci formulir digunakan.

Saya ingin tahu apakah ekstensi "ajax cart" yang lebih populer akhirnya memeriksa token CSRF selama penambahan permintaan ke keranjang.

Satu permintaan fitur di mana saya akhirnya melepaskan token CSRF untuk tindakan add to cart memungkinkan kemampuan membuat tautan add to cart untuk digunakan dalam email atau situs web lainnya (media sosial). Terkadang pemasaran ingin agar pengguna langsung menambahkan item ke troli dan mengarahkan ulang ke troli atau checkout segera. Ini tidak dapat dengan mudah dilakukan jika token CSRF diperlukan. Saya hanya akan merekomendasikan ini jika Anda merasa nyaman dengan tingkat risiko dan percaya pada kode Anda sendiri dan pihak ketiga mana pun.

beeplogic
sumber
4

Prinsip pengembangan web mengatakan segala bentuk pemalsuan permintaan lintas situs (CSRF) atau skrip lintas situs (XSS) tidak diinginkan dan harus selalu dihindari.

Apa artinya? Untuk CSRF, Anda tidak dapat memiliki URL apa pun yang mengubah data yang ada di negara mereka. Kalau tidak, seorang penyerang dapat memanipulasi isi keranjang seseorang, atau menambah / menghapus item dari daftar keinginan atau perbandingan mereka, hanya dengan menipu mereka agar mengklik atau mengunjungi URL itu (pengalihan, bahkan).

Kunci formulir adalah cara mereka menyiasatinya. Magento menghasilkan hash yang khusus untuk sesi, dan mengharuskannya dikirimkan bersama dengan setiap permintaan perubahan data.

Apakah menambahkan / menghapus item keranjang merupakan vektor serangan yang parah? Mungkin tidak, untuk sebagian besar situs. Tapi tetap saja itu CSRF, dan CSRF itu buruk. Itu sebabnya adaform_key nilai sekarang (pada CE 1.8).

Ryan Hoerr
sumber