JavaScript'i kesmek ne kadar kolaydır (bir tarayıcıda)?


37

Benim sorum JavaScript güvenliği ile ilgili.

Omurga veya AngularJS gibi bir JavaScript çerçevesi kullandığınız ve güvenli uç noktalara ihtiyacınız olduğu bir kimlik doğrulama sistemi hayal edin . Bu bir problem değildir, çünkü sunucu her zaman son kelimeye sahiptir ve istediğinizi yapmaya yetkili olup olmadığınızı kontrol edecektir.

Peki ya sunucuyu dahil etmeden biraz güvenceye ihtiyacınız varsa? Mümkün mü?

Örneğin, müşteri tarafında bir yönlendirme sisteminizin olduğunu ve oturum açan kullanıcılar için korunacak bir somut yolun olmasını istediğinizi varsayalım. Böylece, sunucuya ping uygulayarak korumalı rotaları ziyaret etmenize izin verilip verilmediğini sorabilirsiniz. Sorun şu ki, sunucuya ping yaparken, yanıtı değişkende saklarsınız, bu yüzden bir dahaki sefere özel bir rotaya gittiğinizde, önceden giriş yapmışsanız (sunucuya ping atmadan) ve Tepki üzerine gider ya da gitmez.

Bir kullanıcının bu değişkeni değiştirmesi ve erişmesi ne kadar kolaydır?

Güvenlik (ve JavaScript) bilgim mükemmel değil. Ancak bir değişken global kapsamda değilse ve sadece alıcıları olan, ancak ayarlayıcıları olmayan bir modül modelinin özel kısmındaysa, bu durumu bile kesebilir misiniz?


29
Bütün bu uzun cevaplar. Kısacası, size "çok hackable" başlığı yanıtlamak için. İlk 2 sorunuzu birbirleriyle aynı satırda cevaplamak için, "sunucu olmadan, güvenliğini yitirdiniz" && "Hayır". 3., "Çok kolay" ve son olarak, "Evet, kolaylıkla" cevaplamak için. İşte gidiyorsun. Bütün sorular cevaplandı. : P
SpYk3HH

Birinci örnek, herhangi bir web sayfasına jQuery ekleme ile ilgili blog gönderime bakın. spyk3lc.blogspot.com/2013/05/… Şimdi, genç padawan, öne çık ve dene. JQuery'yi zaten bulunmayan herhangi bir siteye eklemenin ne kadar kolay olduğunu görün, ardından jquery'yi, uzun javascript çizgileri olmadan görmenin herhangi bir bölümünü kolayca değiştirmek için kullanın. Boom!
SpYk3HH

7
Bir kez, bir alan adı için kayıt yaparken, telefon numarası gerekli bir alandı, ancak bu sadece javascript'te uygulandı - sunucu tarafında değil. Böylece, bir işlevi (Firebug kullanarak) yeniden tanımlayarak ve voilà! Telefon numaram yok.
Izkata

8
manipulate any part of the sight without long lines site vs görme
mplungjan

8
Profesyonel web programcılarının böyle bir şeyi doğru yapmaları gerekir. Lütfen. Bu bir dilbilgisi nazi şey daha fazla utanç verici :) plus.google.com/u/0/+MonaNomura/posts/h9ywDhfEYxT
mplungjan

Yanıtlar:


26

Lütfen bunu okumadan önce Joachim'in cevabını okuyun . Müşteri tarafında güvenlik açığının ardındaki genel nedenleri kapsar. Şimdi, bir öneri için, bu problemi nasıl çözebileceğiniz ...

Her talepte sunucu ile manuel olarak kimlik doğrulaması yapmak zorunda kalmadan istemci-sunucu iletişimi için güvenli bir şema:

Sunucunun son söz sahibi olmasına hala izin veriyorsunuz ve sunucunun hala müşterinin söylediği her şeyi doğrulaması gerekiyor, ancak şeffaf olarak gerçekleşiyor.

Ortadaki adam saldırılarını (MITMA) önlemek için HTTPS protokolünü kullanın .

  • Müşteri ilk kez sunucuyla el sıkışır ve sunucu müşteri için ortak bir anahtar oluşturur ve bir asimetrik şifreleme düzeni kullanarak özel bir tane tutar. İstemci, sunucunun "genel" anahtarını, hiçbir yerde kaydetmediğiniz güvenli bir parola ile şifrelenmiş yerel depoda saklar.

  • İstemci şimdi çevrimdışı. Müşteri güvenilir işlemler yapmak istiyor. İstemci şifresini girer ve sunucunun ortak anahtarını alır.

  • Şimdi istemci eylemleri gerçekleştirir bu verilerin kendi bilgiye dayalı ve istemci sunucunun genel anahtar ile gerçekleştiren her eylem şifreler o müşteri için .

  • Müşteri çevrimiçi olduğunda, müşteri kimliğini gönderir ve müşterinin yaptığı tüm eylemler, sunucunun ortak anahtarıyla şifrelenmiş sunucuya gönderilir.

  • Sunucu eylemlerin şifresini çözer ve doğru biçimde ise istemciden kaynaklandığına güvenir.

Not:

  • Müşterinin şifresini hiçbir yerde saklayamazsınız, aksi takdirde bir saldırgan anahtarı alabilir ve eylemleri kendi olarak imzalayabilir. Bu programın güvenliği yalnızca sunucunun istemci için oluşturduğu anahtarın bütünlüğüne dayanır. İstemcinin, o anahtar için sorulduğunda sunucunun kimliğini doğrulaması gerekir.

  • Aslında istemciye değil , güvenlik için sunucuya güveniyorsunuz . Her eylem istemcisi gerçekleştirir gerekir sunucuda doğrulamak.

  • Web çalışanlarında harici scriptler çalıştırmak mümkündür . Unutmayın her JSONP sahip isteği artık çok daha büyük bir güvenlik sorunudur. Her ne pahasına olursa olsun anahtarı korumalısınız. Kaybettikten sonra bir saldırgan kullanıcıyı taklit edebilir.

  • Bu, 'sunucuya ping işlemi yapmama' talebini karşılar. Saldırgan, anahtarı bilmediği taktirde sahte bir HTTP isteğini taklit edemez.

  • Joachim'in cevabı hala doğru . Aslında hala, sunucudaki tüm kimlik doğrulamasını yapıyorsunuz . Buraya kaydettiğiniz tek şey, sunucuyla her seferinde parola doğrulama ihtiyacıdır. Şimdi yalnızca güncellemek istediğinizde sunucuyu dahil etmeniz veya güncelleştirilmiş verileri çekmeniz gerekir. Burada yaptığımız tek şey, müşteri tarafında güvenilir bir anahtarın kaydedilmesi ve müşterinin tekrar doğrulaması.

  • Bu, tek sayfa uygulamalar için (örneğin, AngularJS ile) oldukça yaygın bir şemadır.

  • RSA gibi programlarda ne anlama geldiğinden sunucunun genel anahtarını "public" olarak adlandırıyorum , ancak aslında programdaki hassas bilgilerdir ve korunmaları gerekir.

  • Şifreyi hiçbir yerde hafızada tutmam. Çevrimdışı kod çalıştırmaya başladığında, kullanıcının 'çevrimdışı' şifresini göndermesini sağlardım.

  • Kendi şifrelemenizi kullanmayın - kimlik doğrulaması için Stanford'ınki gibi bilinen bir kitaplık kullanın.

  • Bu tavsiyeyi olduğu gibi alın . İş dünyasında kritik öneme sahip bir uygulamada bu tür bir kimlik doğrulaması yapmadan önce bir güvenlik uzmanına danışın . Bu hem acı verici hem de yanlış anlaşılması kolay olan ciddi bir konudur .

Diğer hiçbir komut dosyasının sayfaya erişememesi çok önemlidir . Bu, yalnızca web çalışanlarıyla dış komut dosyalarına izin verdiğiniz anlamına gelir. Kullanıcı girdiğinde parolanızı etkileyebilecek diğer harici komut dosyalarına güvenemezsiniz.

Bir kullan promptve yok değil tamamen emin değil erteleme onun yürütme yaparsanız bir satır içi Şifre alanını (olduğunu, olması gerektiği olaylar bu bilgilere erişimi ama sadece senkronizasyon kodu var bir noktaya canlı değil). Ve aslında şifreyi bir değişkende saklamayın - yine, bu yalnızca kullanıcının bilgisayarının tehlikeye girmediğinden emin olmanız durumunda işe yarar (her şey bir sunucuya karşı doğrulama için de geçerlidir).

Müşteriye hala güvenmediğimizi tekrar eklemek isterim . Sen olamaz yalnız müşteri güven ve ben Joachim cevabı çivi bunu düşünüyorum. Çalışmaya başlamadan önce sadece sunucuya ping atmamak zorunda kaldık.

İlgili materyal:


3
"Kriptolarınızı yuvarlamayın", ilkellerin yaptığı kadar protokoller için de geçerlidir, çünkü dahası olmasa da, çünkü insanlar genellikle ilkellerini yapacak kadar aptal olmasa da, iyi bir protokol oluşturabileceklerini düşünüyorlar. . Ayrıca burada RSA'nın neden gerekli olduğunu anlamıyorum. HTTPS kullandığınızdan beri, neden yalnızca 16-32 bayt paylaşılan bir sır oluşturmak ve gelecekteki isteklerle gönderilmesini gerektirmiyor? Elbette, bunu yaparsanız, ipte zamanla değişmeyen eşitlik kontrolü kullandığınızdan emin olun ...
Reid

2
+1 @Reid Evet, kısa bir süre önce bununla ilgili bir uzmanla konuştum. Buradaki ilkel şemayı kabaca, öğrendiğim bir protokole dayandırdım (Rabin IIRC tarafından) ancak en azından spesifikasyonları bulana kadar (ve örneğin bu durumda neden asimetrik şifrelemenin gerekli olduğunu haklı çıkartabilirim). Öncelikle bir güvenlik uzmanına danışmadan bu cevapta önerilen planı kullanmayın . Bu yaklaşımı birkaç yerde kullandım, ancak pratikte bu çok az anlamına gelir, eğer bir şey varsa. Bunu geliştirmek için cevabı da değiştirdim.
Benjamin Gruenbaum

Bir istemi kullanmak çok az güvenlik sağlar. Saldırgan window.prompt, geçiş deyimini kesmek için yöntemi geçersiz kılabilir veya kendi bilgi istemini başlatabilir (muhtemelen bir iframe içinde!). Bir şifre alanının ek bir faydası vardır: karakterler gösterilmez.
Rob W

@RobW Tabii ki, sayfa tehlikeye girdiyse bu şema değersizdir. Saldırgan, sayfadaki JavaScript'i çalıştırma erişimine sahipse, mahvolduk. Bilgi istemi arkasındaki fikir engelliyordu ama haklısın, sağladığı her türlü güvenlik avantajı şüpheli. Listedeki son bağlantıya bakın.
Benjamin Gruenbaum

1
Her şeyden önce. Müthiş cevap, başka bir şey isteyemeyeceğimi düşünüyorum. Öte yandan, benim için (ve tabii ki onu kullanmak isteyenlere) evcil hayvan projeleri yapmak istedim ve belki de bu fazla pişmiş (ya da belki değil). Demek istediğim, ciddi bir şey yapmamak istiyorum ve korkarım ki açıkladığın türden bir bilgi edemezsin, bilgi eksikliği. Sanırım basit bir 401 çekimi alacağım ya da herhangi bir isteğim yoksa, bu rotalara her erişimimde sadece ping işlemi yapıyorum. Yetkilendirme jetonu da bir seçenektir (ve burada AFAIK'ta anlattıklarınızla ilgili en yakın şey). Teşekkürler :)
Jesus Rodriguez

89

Çok basit: müşteriye yalnızca yapmasını istediğiniz şeyi yapmaya çalışan herhangi bir güvenlik mekanizması, bir saldırgan istemci üzerinde kontrol sahibi olduğunda tehlikeye girebilir.

Sen olabilir istemci üzerinde güvenlik kontrolleri var, ama sadece etkili için (istemci zaten cevap "hayır" olacağını biliyorsa sunucuya pahalı bir ring seferi yapmaktan kaçınmaya) bir "cache" olarak görev yapar.

Bilgileri bir kullanıcı grubundan saklamak istiyorsanız, bu kullanıcıların istemcisinin asla bu bilgilere ulaşmadığından emin olun . Bu "gizli verileri" talimatlarla birlikte "gönderirseniz, ancak lütfen görüntülemeyin", bu isteği denetleyen kodu devre dışı bırakmak önemsiz hale gelir.

Gördüğünüz gibi, bu cevap herhangi bir JavaScript / Tarayıcı özelliğinden bahsetmiyor. Çünkü bu konsept aynı, müşteriniz ne olursa olsun aynı. Gerçekten önemli bir müşteri (sunucu / sunucu uygulaması), eski bir web uygulaması veya geniş bir müşteri tarafı JavaScript'i içeren tek sayfalık bir uygulama olması önemli değil.

Verileriniz sunucudan ayrıldıktan sonra, bir saldırganın ona tam erişimi olduğunu varsaymalısınız.


Teşekkür ederim. Bunu biraz daha açıklarsan çok iyi olur, güvenlik bilgim o kadar iyi değil ve anladığım tek şey yanlış olduğum: P. Önbelleğe alma hakkında konuştuğunuzda, sadece sunucu hayır deyince önbellekleme yapılır mı? Demek istediğim, eğer sunucu bir kere evet dedi, önbellekleyemezsin, değil mi?
Jesus Rodriguez

3
Bunun eklemek gibi olur ise özellikle :) bir hata ayıklayıcı ile, (senin belirtilen modül desen gibi) tarayıcıda erişim kapatma değişkenlere mümkün
Benjamin Gruenbaum

2
@BenjaminGruenbaum: Bunu, şeylerin JS tarafına odaklanan bir cevap haline getirmek için çekinmeyin. Ben sadece burada yüksek seviyeli, teknoloji-agnostik genel bakışı verdim. JS'nin kendisine odaklanan bir cevap da iyi olurdu!
Joachim Sauer

1
Kısacası, eğer bir javascript değişkenine bağlı olarak bazı bilgiler / rota / erişilebilecek şeyler varsa, bu her durumda güvenli olmaz çünkü bu değişkeni o özel maddeye erişmek için neye ihtiyacınız olduğunu söylemek için kolayca değiştirebilirsiniz.
Jesus Rodriguez,

4
@JoachimSauer Güzel bir şekilde çivilenmiş bu sorunun noktasını kaçıracağını düşünüyorum. Müşterinin aldığı güvenlik önlemi ne olursa olsun, iletişimi tehlikeye atmak mümkündür . JavaScript'te çok sağlam kimlik doğrulama sistemleri oluşturabilirsiniz, ancak diğer istemcilerin de bir gerçekliğin kaynağı olarak gördükleri bir sunucuya iletişim kurduğunuzda hiçbir önemi yoktur. Kaynak kodun tümü istemci tarafına gönderilir, akıllı bir saldırgan onu okuyabilir ve sunucuya bir HTTP isteği taklit edebilir. Biri, sunucuda doğrulanmadıkça, istemciden kaynaklanan her şeyi güvenilir olmayan olarak değerlendirmelidir.
Benjamin Gruenbaum

10

Oyun dünyasında bir söz var: " Müşteri düşmanın elinde.". Sunucu gibi güvenli bir alanın dışında çalışan herhangi bir kod savunmasızdır. En temel senaryoda, ilk etapta çalıştırılmaya karşı savunmasızdır. Müşterinin," güvenlik kodunuzu "çalıştırma kararı ve kullanıcı sadece "vazgeç" dir. Yerel kodla, en azından otomatik olarak bir gizleme zorunluluğuna ve bir saldırganın manipüle etmek için iyi bir programcı olması gerektiğine bağlı olarak ek bir koruma katmanına sahip olsanız da JS normal olarak düzensiz ve düz metin olarak gelir. Saldırıya ihtiyacınız olan tek şey bir proxy sunucusu ve bir metin editörü gibi ilkel araçlardır Saldırganın programlamaya ilişkin belirli bir eğitim düzeyine ihtiyacı olacaktır, ancak herhangi bir metin düzenleyiciyi kullanarak bir komut dosyasını değiştirmek için yürütülebilir bir kod enjekte etmekten çok daha kolaydır.


Meclis bir şaşırtmaca değildir ve başka türlü savaş oyunu oynamamış olduğuna inanan bir
kimse

@ miniBill: Orta derecede deneyimli bir saldırganın birleştirilmiş kodla bir sorunu olmazken, çok basit bir yüksek geçirgen filtre sağlayacak. (Maalesef, bu akademik, senaryo çocuklarını
ayıklamaktan

1

Bu, JavaScript kırma meselesi değildir. Uygulamanıza saldırmak isteseydim, trafiği yakalamama, değiştirmeme ve tekrar oynatmamı sağlayacak özel bir proxy kullanırdım. Önerilen güvenlik planınız buna karşı herhangi bir korumaya sahip görünmüyor.


0

Özellikle Açısal hakkında konuşma:

Bir rota istemcisi tarafını korumak sadece mevcut değil. Bu rotaya bir düğme 'gizleseniz' bile, kullanıcı her zaman yazabilir, Angular şikayet eder, ancak müşteri bunu kodlayabilir.

Bir noktada, kontrol cihazınız sunucunuzdan görünümü oluşturmak için gereken verileri istemesi gerekecektir, kullanıcı bu verilere erişme yetkisine sahip değilse, bu verileri sunucu tarafında koruduğunuz için alamazlar. , ve Angular uygulamanızın 401'i uygun şekilde işlemesi gerekir.

Ham verileri korumaya çalışıyorsanız, müşteri tarafında olamazsınız, yalnızca belirli bir kullanıcının yalnızca ortak verileri belirli bir şekilde görüntüleyebilmesini istiyorsanız, göndermek yerine sunucuda 'görünümler' verilerini oluşturun istemciye ham veriler ve yeniden düzenlemesini sağlamak (zaten zaten performans nedenleriyle bunu yapmalısınız).

Yan not: Angular'ın istediği, görüntüleme şablonlarında yerleşik olan hiçbir şeyin hassas olmaması gerekir. Eğer çılgınca bir sebepten dolayı, sunucu tarafında görüntü oluşturma işlemini yaptığınız gibi, sunucu tarafında bu görünüm şablonlarını korumanız gerekir.

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.