Sepete ekle için CSRF koruması neden gereklidir?


15

Magento, son sürümlerden beri form_keyCSRF saldırılarına karşı korumak için sepete ekle eyleminin bir parçası olarak bulunuyor.

Şimdi merak ediyorum, bu yer için gerçekten gerekli mi ve neden veya daha iyi söylendi, hangi spesifik senaryolara karşı korunması gerekiyor.


Yanıtlar:


14

Magento'nun Sepete Ekle eylemine neden bir CSRF jetonunun neden "gerekli" olduğu sorusuna kesin bir cevap vermenin zor olacağına inanıyorum. Amacını yorumlamaya çalışacağım. Hiçbir şekilde bir güvenlik uzmanı değilim ve bu benim CSRF'yi bu bağlamda yorumlamam.

bağlam

Gönderen owasp.org

Siteler Arası İstek Sahteciliği (CSRF), son kullanıcıyı şu anda kimliği doğrulanmış oldukları bir web uygulamasında istenmeyen eylemler yürütmeye zorlayan bir saldırıdır. CSRF saldırıları, veri hırsızlığını değil, durum değiştiren istekleri özellikle hedefler, çünkü saldırganın sahte isteğin yanıtını görmesi mümkün değildir.

Bu saldırıya bir örnek, gizli bir resmi bir e-postaya veya alternatif bir web sayfasına yerleştirmektir:

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

Web sunucusu, isteğin nereden geldiğini ayırt etmez ve öğeyi bu kullanıcının sepetine sadakatle ekler.

CSRF saldırılarını önlemenin amacı, durumu değiştiren talepleri önlemektir . Bir alışveriş sepetine öğe eklemek durum değişikliği olarak kabul edilir. Genel olarak, bunun bir sipariş gönderme, para transferi veya bir e-posta adresini güncelleme ile karşılaştırıldığında zararsız bir durum değişikliği olduğunu düşünürüm.

Durum değişiklikleri ve HTTP yöntemleri ile ilgili olarak, RFC 2616 şunları söyler:

Özellikle, GET ve HEAD yöntemlerinin geri alma dışında bir işlem yapmanın önemine sahip OLMAMASI gerektiği anlaşılmıştır. Bu yöntemler "güvenli" olarak kabul edilmelidir.

Magento ve CSRF

Magento, bir simge (form anahtarı) kullanarak hem yönetici hem de ön uç alanlar için CSRF önleme mekanizması uygular. Magento'nun amacının, diğer geliştiriciler tarafından inşa edilmesi gereken bir platform olarak, tüm devlet değişen taleplerini güvence altına almak olduğunu varsayacağım . Bunun nedeni, uygulayıcı geliştiricilerin veya 3. taraf uzantılarının yanlışlıkla neyi ortaya çıkarabileceğine dair hiçbir fikirleri olmamasıdır. Tüm taraf değiştirme taleplerini güvence altına almak, üçüncü taraf bir modülün maruz kaldığı bir şeye sahip olmak ve platform için kötü bir PR olmaktan daha güvenlidir. Aslında tüm devlet değişikliği taleplerinin CSRF saldırılarından korunup korunmadığını bilmiyorum .

Dikkat edilmesi gereken bir nokta, Magento'nun durum değiştiren istekleri korumak için her zaman bir form anahtarı kullanmamasıdır. Örneğin, Sepetten Sil ( /checkout/cart/delete/id/{ID}) ve Müşteri Adresini Sil ( /customer/address/delete/id/{ID}) isteklerinin her ikisi de Varlık Kimliğinden geçen GET istekleridir. Daha sonra denetleyici (veya modeller) kullanıcının bu varlık kayıtlarını kaldırma (durum değiştirme) yetkisine sahip olmasını sağlar. Bunlar Magento'nun RFC 2616'yı takip etmediği iki örnektir . Adil olmak gerekirse, bazı kullanım durumlarında bunu yapmak pratik veya gerekli olmayabilir.

Mage_Checkout_CartController::addActionYöntemdeki form anahtarı denetimi 1.8 sürümünde eklenmiş gibi görünüyor. Sürüm notlarından aşağıdakileri yapmak için aşağıdakilere sahibiz:

Web mağazasında Siteler Arası İstek Sahteciliği (CSRF) ile sonuçlanabilecek sorunlar çözüldü.

Ne yazık ki dil belirsiz ve "olabilirdi" bana daha önce belirttiğim varsayım nedeniyle olduğuna inanmamı sağlıyor: güvenli devlet değiştirme talepleri. Bir tür istenmeyen davranışa neden olan ek parametreler gönderme olasılığı olabilir:/checkout/cart/add/product/337/email/new@address.com/password/l33tp4ssw0rd

Fikir, sepete bir şey ekleyerek, sepete ekleme sırasında tetiklenen bazı kodların (çekirdek veya 3. taraf), örneğin gönderilen bir olay aracılığıyla olmasıdır.

Kutunun dışında böyle bir güvenlik açığının olması olası görünmüyor ve eğer yaparsa Magento'nun detayları / riskleri açıklamak için daha iyi bir iş yapmasını umuyor. Görebildiğim bir risk, Magento'nun product_optionssipariş parametrelerini müşteri sipariş kalemleri tablosunun sütununa körü körüne saklaması (bkz:) info_buyRequest. Teoride birisi garip sorgu parametreleri ile sepete ürün ekleyen içine bir grup kullanıcıyı kandırmak ve içine saklanan alacağı sales_flat_quote_item_optionmasaya ve sonunda sales_flat_order_itemonlar eğer tablo da dönüştürmek söz konusu kullanıcıları elde edebilir. Çoğu durumda bu benim için pek olası görünmüyor.

Sepete Ekle Formu Önemli Konular

İnsanların bir FPC uygulaması ve CSRF tokenleri ile karşılaştıkları büyük sorunlardan biri, önbelleğe alınmalarıdır. Önbelleği ısıtan ilk istemciye belirteci oluşturur, ikinci istemciye bir önbellek HIT'si alındığında, şimdi ilk kullanıcı belirtecinin bulunduğu bir sayfa verilir. Formu gönderirken jetonlar eşleşmez.

Magento Enterprise, önbelleğe alınmış sayfalardaki form anahtarlarını bulmak / değiştirmek için yer tutucular kullanır. Vernik uygulamaları bir form anahtarının kullanıldığı her yerde bir ESI kullanacaktır.

Bazı daha popüler "ajax sepeti" uzantılarının alışveriş sepetine ekleme istekleri sırasında CSRF jetonunu kontrol edip etmediklerini merak ediyorum.

Sepete ekle eylemi için CSRF belirtecinden önce geldiğim bir özellik isteği, e-postalarda veya diğer web sitelerinde (sosyal medya) kullanılmak üzere sepet sepetine bağlantılar oluşturma yeteneğine izin veriyor. Bazen pazarlama, kullanıcıların doğrudan sepete bir öğe eklemesini ve hemen sepete veya kasaya yönlendirmesini istemektedir. Bir CSRF jetonu gerekirse bu kolayca yapılamaz. Bunu yalnızca risk düzeyinden memnunsanız ve kendi kodunuza ve herhangi bir 3. taraf koduna güveniyorsanız tavsiye ederim .


4

Web geliştirme ilkeleri, herhangi bir siteler arası istek sahteciliği (CSRF) veya siteler arası komut dosyası oluşturmanın (XSS) istenmeyen bir durum olduğunu ve her zaman kaçınılması gerektiğini söylüyor.

Bu ne anlama geliyor? CSRF için, kendi içinde durum bilgisi olan verileri değiştiren URL'leriniz olamaz. Aksi takdirde, bir saldırgan bir kişinin sepetinin içeriğini değiştirebilir veya istek listesine veya karşılaştırmalarına öğe ekleyebilir / kaldırabilir;

Form anahtarları bununla nasıl başa çıktıklarını gösterir. Magento, oturuma özgü bir karma oluşturur ve her veri değiştirme talebiyle birlikte gönderilmesini gerektirir.

Alışveriş sepeti öğelerini eklemek / kaldırmak ciddi bir saldırı vektörü mü? Muhtemelen hayır, çoğu site için. Ancak yine de CSRF ve CSRF kötü. Bu yüzden form_keyşimdi değerler var (CE 1.8'den itibaren).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.