90’larda internet tamamen gri arka planlar ve donuk metin kutularından ibaretti. Ancak JavaScript tüm bunları değiştirdi ve performanstan ödün vermeden dinamik metinlerin, etkileşimli web sitelerinin ve tıklanabilir öğelerin keyfini çıkarmamıza olanak tanıdı. JavaScript günümüzde en yaygın kullanılan programlama dillerinden biridir.
Ancak saldırganlar, oturum yeniden yönlendirmeleri, hassas veri toplama (uyum ihlalleri) ve bilgi tahrifatı gibi çok çeşitli manipülasyonlar oluşturmak için kötü amaçlı komut dosyaları ve oturum ele geçirme saldırılarıyla JavaScript uygulamalarındaki güvenlik açıklarından yararlanıyor. Magniber, Vjw0rm ve GootLoader gibi birçok fidye yazılımı çeşidi JavaScript kodundaki boşluklardan yararlanır. MageCart grubu, Modernizr kütüphanesini yönetmek için yalnızca 22 satır kod kullanarak British Airways’in güvenliğini ihlal etti.
Peki JavaScript’i nasıl daha güvenli hale getirirsiniz? Siteler arası komut dosyası oluşturma (XSS), oturum ele geçirme, işletim sistemi komut enjeksiyonu, düzenli ifade (Regex) istismarları ve yayılmış operatör enjeksiyonu gibi karşı konulması zor saldırılar da dahil olmak üzere, saldırganların JS güvenlik açıklarından yararlanmanın düzinelerce yolu vardır. Yerleşik güvenlik alışkanlıkları bu saldırılardan bazılarını engelleyebilir. Bazı saldırı tekniklerine ve bunları azaltmak için en iyi siber güvenlik uygulamalarına daha yakından bakalım.
Yaygın Saldırılar ve Onlara Karşı Nasıl Savunma Yapılır?
SQL enjeksiyonları (SQLi). SQL enjeksiyon saldırıları, kötü amaçlı veritabanı komutlarını yürütmek için kodlama prosedürleri ve uygunsuz doğrulama gibi güvenlik açıklarını hedefler.
Riskleri en aza indirmek için: Tüm girişleri doğrulayın. Kodda açık SQL sorguları kullanmaktan uzaklaşıp nesne ilişkisel haritalamayı (ORM’ler) kullanın. Pek çok harika seçenek var ama TİPORM’u seviyorum.
Siteler arası komut dosyası çalıştırma (XSS). Saldırganlar, kötü amaçlı kod eklemek için web uygulamalarındaki doğrulama eksikliği veya kodlama gibi güvenlik açıklarından yararlanır. Kirlenmiş uygulama, kodu kullanıcıya tarayıcı tarafı bir komut dosyası olarak gönderir ve bu da saldırganların oturum belirteçlerine, çerezlere, şifrelere ve diğer kişisel bilgilere erişmesine olanak tanır. Günümüzde kullanılan farklı XSS saldırı türleri vardır; Yansıtılmış (Kalıcı Olmayan) XSS, Depolanmış XSS ve DOM Tabanlı XSS en yaygın varyasyonlardır.
Riskleri en aza indirmek için: Yalnızca kullanıcılardan aktarılan içeriğe güvenip onu çalıştırmayın; vardığınızda filtreleyin. Tarayıcıların yanıtları istediğiniz şekilde yorumlamasını sağlamak için, sunucunuzun döndürdüğü içeriğin eşleşen içerik türü başlıklarını uyguladığından emin olun. Web sitenizde hangi içeriğin yayınlanacağını ve bu içerikle ilgili hangi kaynaklara güveneceğinizi kontrol etmek için mümkün olan her zaman ve her yerde bir içerik güvenliği politikası uygulayın.
Siteler arası istek sahteciliği (CSRF). CSRF saldırıları günümüzde oldukça yaygındır. Bu istismarlar, son kullanıcıları Web uygulamalarını kullanırken kötü amaçlı eylemler gerçekleştirmeleri ve yürütmeleri için kandırır. Bu, kimlik doğrulaması yapıldıktan ve kullanım başladıktan sonra gerçekleşir. Burada kullanılan ana teknik, genellikle kötü amaçlı e-postalar veya normal görünümlü bağlantılara sahip SMS mesajları olan sosyal mühendisliktir. Bağlantıya tıklandığında yük yürütülür.
Riskleri en aza indirmek için: Yerleşik CSRF korumasıyla birlikte gelen çerçeveleri kullanın. Ayrıca CSRF belirteçlerini eylemlere (durum değişikliği) neden olan tüm isteklere uygulayabilir ve bunları arka ucunuzda doğrulayabilirsiniz.
Yol geçiş saldırıları. Dizin geçiş saldırıları olarak da bilinen yol geçiş saldırıları, web kök klasörünün dışında (oldukça dikkatsizce) saklanan dizinlere, yapılandırma dosyalarına ve hassas parolalara yetkisiz erişim sağlamak için kullanılır.
Riskleri en aza indirmek için: Hassas dosyaları web kök klasörünüzün dışında depolamaktan kaçının. Dosya sistemi çağrılarını kullanırken kullanıcı girişi olmadan çalışın. Ayrıca, kullanıcının, kullanıcı girişini kendi yol kodunuzla çevreleyerek yolun tüm bölümlerini sağlayamayacağından emin olun. Son olarak, dosyaların nereden alınabileceğini veya kaydedilebileceğini kısıtlamak için güçlü kod erişim politikaları (chrooted hapishanelerle) uygulayın.
Sunucu tarafı istek sahteciliği (SSRF). SSRF saldırıları, hassas kaynaklara (AWS meta verileri) erişmek, dahili hizmetlere bağlanmak, verileri değiştirmek ve hatta güvenli satıcılardan gelen verilere erişmek veya müşteri bilgilerini uzak sunuculara kanalize etmek için URL’leri değiştirmek gibi çok çeşitli yetkisiz etkinlikleri gerçekleştirmek için sunucu tarafındaki güvenlik açıklarından yararlanır. SSRF saldırıları, HTTP protokollerini kullanmanın yanı sıra FTP, SMTP ve SMB’yi de kullanabilir.
Riskleri en aza indirmek için: Verileri ve bağlamları doğrulayın. V4 ve V6 adreslerini arayın. Sağlanan IP adreslerini güvenilir satıcının IP adresleriyle çapraz kontrol edin. Verileri sunuculara kaydetmeyin; bunun yerine S3 paketlerini ve blob’ları tercih edin. Güvenilir ve tanımlanmış alan adlarından oluşan büyük/küçük harfe duyarlı bir beyaz liste oluşturun. Ve asla kullanıcılardan gelen URL’lerin tamamını kabul etmeyin; bunların doğrulanması zordur.
Hassas çerezlere maruz kalma. Hassas verilerin açığa çıkması güvenlik açıklarının pek çok çeşidi vardır, ancak hepsinde ortak bir tema vardır: şifrelenmesi gereken bilgilerin açığa çıkması. Bilgisayar korsanları ayrıca güçlü ASIC’ler ve GPU’lar tarafından desteklenen kaba kuvvet saldırılarıyla zayıf kriptografik anahtarlardan (örneğin, artık güvenli kabul edilmeyen MD5 şifre karma algoritması) yararlanmayı da seviyor.
Riskleri en aza indirmek için: Saklanan, işlenen ve iletilen tüm verileri düzenleyici gereksinimlerinize göre sınıflandırın ve kontrolleri buna göre uygulayın. Gereksiz hassas verileri atın. PFS şifreleri ve diğer güvenli parametrelerle birlikte, beklemedeki ve aktarım halindeki tüm verileri TLS protokolüyle şifreleyin. HSTS’yi kullanın. Hassas bilgiler içeren yanıtlar için tüm önbelleğe almayı devre dışı bırakın.
Özetle: En İyi Uygulamalar
JavaScript, çok yönlülüğü ve esnekliği sayesinde gerçek bir nimettir. İşletmelerin güçlü kullanıcı deneyimleri oluşturmasına ve gelişmiş işlevsellik elde etmesine yardımcı olur. Ancak aynı zamanda dikkate almanız gereken güvenlik gereksinimlerini de sunar. Yalnızca proaktif bir yaklaşım, kesinti süresi, iyileştirme maliyetleri, marka hasarı, iş kaybı gibi sorunlardan uzak durmanıza ve gizlilik düzenlemelerine uyumlu kalmanıza yardımcı olabilir.
İşte sahip olmanız gereken en iyi uygulamalardan bazıları:
- Uzak dur değerlendirme() kodunuzdaki komut, çünkü herhangi bir normal JS ifadesinde olduğu gibi iletilen bir bağımsız değişkeni kolayca yürütebilir.
- Şifreleme protokollerine öncelik verin ve ayrıca tüm çerezlerinizi, kullanımlarını sınırlamak ve bilgisayar korsanlarının bunları kötüye kullanmasını önlemek için “güvenli” olarak ayarlayın.
- API erişim anahtarlarını ayarlamayı alışkanlık haline getirin. Son kullanıcılara bireysel tokenlar atamaya başladığınızda yasa dışı erişim otomatik olarak reddedilebilir.
- innerHTML, kendilerine aktarılan değerleri sınırlamayan veya bunlardan kaçmayan çok güçlü bir DOM işleme yöntemidir. Bunun yerine innerText’i kullanın.
Ayrıca, güvenlik açıklarını mümkün olduğu kadar erken tespit etmek için güvenli bir şekilde kodlama yapmak ve bir kaynak kodu analizi (SCA) çözümüne sahip olmak da iyi bir fikirdir. Trafik ayrıca kanıtlanmış ve test edilmiş bir web uygulaması güvenlik duvarından (WAF) geçmelidir. Konu JavaScript güvenliği olduğunda her ikisi de sihirli değnekler olmasa da (siber bağışıklık genel olarak bir efsanedir), birden fazla kalkan katmanıyla her zaman daha güvendesiniz.