Node.js, JavaScript çalıştırmak için kullanılan popüler bir çalışma zamanı ortamıdır. Node.js’e yönelik saldırılar, genellikle aşağıdaki gibi çeşitli türlerde olabilir:
Node JS DDoS Saldırıları (Distributed Denial of Service)
Node.js sunucuları, diğer sunucularla ağır trafikle bombardımana tutularak hizmet dışı bırakılabilir. Bu, sunucunun kaynaklarını tüketerek normal trafiği işlemesini engeller.
HTTP Server’a DOS Saldırıları
DOS saldırıları, bir uygulamanın çalışamaz hale geldiği saldırı türüdür. Türkçesi “Hizmet Reddi” olarak geçen Denial of Servise, HTTP istekleri yapılarak sunucunun çökmesini amaçlar.
Diğer sunucu tabanlı yazılımlarda olduğu gibi HTTP istekleri Node JS projelerinde de HTTP sunucusu tarafından alınır ve daha sonra kayıtlı request handler aracılığıyla uygulama koduna iletilir. Bu noktada gerçekleşen saldırı Node JS ile doğrudan ilgili değildir yani herhangi bir Node JS açığından kaynaklanmaz.
Web Sunucusunun soket hatalarını düzgün bir şekilde işlediğinden emin olun. Örneğin, bir hata işlemi olmadan bir sunucu oluşturulursa, DoS saldırılarına açık olur;
const net = require('net');
const server = net.createServer(function (socket) {
// socket.on('error', console.error) // bu sunucunun çökmesini önler
socket.write('Echo server\r\n');
socket.pipe(socket);
});
server.listen(5000, '0.0.0.0');
Slowloris adlı bir DoS saldırısı, istekleri yavaşça ve parçalara bölünmüş şekilde göndererek hedeflenen sunucunun kaynaklarını tüketir. Bu saldırıda, isteğin içeriğiyle ilgili bir değişiklik yapılmaz, ancak isteklerin zamanlaması ve düzenlemesi kullanılır.
Saldırganlar, sunucunun bu yavaş ve yarım istekleri beklemek zorunda kalacağını ve bu istekler için kaynaklar ayırmak zorunda kalacağını bilirler. Yeterli sayıda bu tür yavaş istekler aynı anda gönderilirse, sunucu tüm kaynaklarını bu bekleyen isteklere ayırır ve yeni bağlantılara hizmet veremez. Bu sonuçta, sunucunun tüm mevcut bağlantıları kabul etmeyi reddetmesine ve hizmet verilemez hale gelmesine yol açar.
Node JS’de DOS Ataklarından Kaçınma Yöntemleri
Ters Proxy Kullanımı
Node.js.org, uygulamanızı korumak için bir ters proxy kullanmayı önermektedir. Ters proxyler, gelen istekleri alır ve ardından bu istekleri Node.js uygulamanıza ileterek önemli avantajlar sağlar. Bu avantajlar arasında önbellekleme, yük dengeleme, IP kara listeleme ve daha fazlası yer alır. Ters proxyler, DoS saldırılarının etkili olma olasılığını azaltabilir.
Sunucu Zaman Aşımını Doğru Ayarlayın
Sunucunun zaman aşımını doğru bir şekilde yapılandırın. Bu, boşta bekleyen veya isteklerin yavaş geldiği durumları belirleyerek gereksiz kaynak tüketimini önler. Özellikle HTTP belgelerinde bulunan headersTimeout, requestTimeout, timeout ve keepAliveTimeout gibi zaman aşımı ayarlarını kontrol edin.
Açık Soket Sayısını Sınırlayın
Her ana bilgisayar için ve toplamda açık soket sayısını olabildiğince sınırlayın. Bu, sunucunun kaynakları etkili bir şekilde yönetmesine yardımcı olur ve fazla bağlantıların sunucuyu aşırı yüklemesini önler. Bu bağlamda agent.maxSockets, agent.maxTotalSockets, agent.maxFreeSockets ve server.maxRequestsPerSocket gibi ayarlar kontrol edilmelidir.
- Güvenlik açıklarını düzeltmek için güncel ve güvenilir kütüphaneler kullanmak.
- Veri doğrulama ve temizleme için güvenilir yöntemler kullanmak (örneğin, SQL sorgularında parametreler kullanmak).
- Express gibi web uygulama çerçevelerinin güvenlik önlemlerinden yararlanmak.
- DoS ve DDoS saldırılarına karşı koruma için ağ seviyesinde önlemler almak (CDN kullanımı, trafik izleme ve sınırlama, vb.).
- Güçlü kimlik doğrulama ve erişim kontrolleri uygulamak.
Node JS SQL Injection (SQL Enjeksiyonu)
SQL Injection, genellikle web uygulamalarına girilen verilerin doğru bir şekilde işlenmediği durumlarda ortaya çıkan bir saldırı türüdür. Node.js gibi sunucu taraflı bir dilde SQL Injection saldırılarını önlemek için çeşitli önlemler alınabilir:
Parametreli Sorgular Kullanma: SQL sorgularını oluştururken asla string birleştirme yöntemini tercih etmeyin. Bunun yerine parametreli sorguları kullanın. Örneğin, Node.js’de MySQL modülü kullanarak yapılan bir sorguda parametreli kullanım şu şekildedir
var sql = "SELECT * FROM users WHERE username = ?"; connection.query(sql, [username], function (err, results) { // Sorgu işlemleri });
ORM (Object-Relational Mapping) Kullanımı: ORM kütüphaneleri (örneğin, Sequelize, TypeORM) veritabanı işlemlerini daha güvenli bir şekilde yapmanıza olanak sağlar. Bu kütüphaneler genellikle güvenlik açıklarını azaltmak için parametreli sorguları otomatik olarak oluşturur.
Input Doğrulama ve Temizleme: Kullanıcı girişi veya dış veriler, veritabanına gönderilmeden önce doğrulanmalı ve temizlenmelidir. Özel karakterler veya SQL komutları içeren girişlerden kaçınılmalıdır. Bunun için veri doğrulama ve temizleme işlemleri yapılabilir.
Veritabanı Kullanıcı Yetkileri: Veritabanı kullanıcılarına sadece gereken minimum yetkileri tanımlayın. Uygulamanın çalışması için gerekli olan işlemleri yapacak yetkileri sınırlandırın.
Güvenlik İncelemesi ve Testler: Uygulamalarınızı düzenli olarak güvenlik açıklarını kontrol etmek ve sızma testleri yapmak için denetleyin. Bu, potansiyel zayıf noktaları tespit etmenize ve düzeltmenize olanak sağlar.
Güvenlik İncelemesi ve Testler: Uygulamalarınızı düzenli olarak güvenlik açıklarını kontrol etmek ve sızma testleri yapmak için denetleyin. Bu, potansiyel zayıf noktaları tespit etmenize ve düzeltmenize olanak sağlar.
Node JS Cross-Site Scripting (XSS) Saldırıları
XSS (Cross-Site Scripting), web uygulamalarında yaygın olarak görülen bir güvenlik açığıdır ve kullanıcıların tarayıcılarında kötü amaçlı JavaScript kodlarının çalışmasına izin verir. Node.js gibi sunucu taraflı bir dilde XSS saldırıları, genellikle kullanıcı girdilerinin yeterince doğrulanmadığı veya temizlenmediği durumlarda ortaya çıkar.
Node.js uygulamalarında XSS saldırılarına karşı korunmak için şu adımları takip etmek gerekir;
Kullanıcı Girdilerini Doğrulama ve Temizleme: Kullanıcı tarafından sağlanan tüm girdiler, güvenli olmayan içeriği temizlemek veya filtrelemek için doğrulanmalıdır. Özel karakterler, HTML etiketleri veya JavaScript kodu içeren girişler filtrelenmelidir.
HTML Encode / Escape Yöntemleri: Kullanıcı girişi, tarayıcıda HTML kodu olarak yorumlanmadan önce özel karakterlere dönüştürülmelidir. Bu, kullanıcı girdilerinin metin olarak ele alınmasını sağlar ve kötü amaçlı JavaScript kodlarının çalışmasını önler.Örneğin, güvenli bir şekilde göstermek için kullanıcı girişlerini HTML encode etmek için şu gibi yöntemler kullanılabilir.
const userContent = "<script>alert('XSS Attack!');</script>"; // Kullanıcıdan alınan içerik const encodedContent = escapeHtml(userContent); // HTML encode işlemi function escapeHtml(unsafe) { return unsafe.replace(/</g, "<").replace(/>/g, ">"); } // Daha sonra bu 'encodedContent' değişkenini ekranda gösterme
Content Security Policy (CSP) Kullanımı: CSP, tarayıcıda hangi kaynakların (örneğin, JavaScript, CSS, resimler) çalıştırılabileceğini veya yüklenip yüklenemeyeceğini kontrol eden bir mekanizmadır. Node.js uygulamalarında CSP kullanarak tarayıcıda çalışan içeriği sınırlamak ve XSS saldırılarını önlemek mümkündür.
Helmet.js gibi Güvenlik Modülleri Kullanımı: Node.js için çeşitli güvenlik modülleri vardır. Örneğin, Helmet.js, Node.js uygulamaları için çeşitli HTTP başlıkları ekleyerek güvenlik sağlar ve XSS gibi saldırılara karşı koruma sağlar.
Node JS Brute Force Saldırıları
Node.js sunucularına yönelik şifreleri deneyerek, erişim bilgilerini bulmaya çalışan saldırganlar, oturum açma mekanizmalarını kırabilirler.
Node JS DNS Rebinding
DNS rebinding, web tarayıcılarının ağdaki diğer cihazlara (genellikle ev ağındaki cihazlara) erişmesini sağlayan bir saldırı türüdür. Bu saldırı, saldırganın kurbanın tarayıcısında JavaScript kodu çalıştırmasını ve kurbanın ağında bulunan diğer cihazlara erişmesini mümkün kılar.
- Saldırganın Oluşturduğu Web Sayfası: Saldırgan, kötü amaçlı bir web sayfası oluşturur ve bu sayfayı kurbanın tarayıcısında çalıştırmak için bir yol bulmaya çalışır.
- DNS Cevapları Değiştirme: Saldırgan, DNS yanıtlarını kontrol ederek, önce kurbanın tarayıcısını kendi sunucusuna yönlendirir.
- IP Adresinin Değiştirilmesi: Ardından, saldırganın sunucusundan gelen cevaplar, saldırganın sunucusu yerine başka bir cihazın IP adresini içerecek şekilde değiştirilir.
- İkinci Aşama Yönlendirmesi: Tarayıcı, başlangıçta saldırganın sunucusuna yönlendirilen istekleri, bu kez saldırganın belirlediği diğer IP adresine gönderir.
- JavaScript Kodunun Çalıştırılması: Bu süreçte, tarayıcıda çalışan JavaScript kodu, başlangıçta saldırganın sunucusuna yönlendirilen ancak şimdi başka bir cihazın IP’sine yönlendirilen istekler üzerinden bu cihaza erişebilir. Bu, ağdaki diğer cihazlara erişimi sağlar.
Node.js Güvenlik Araçları;
- Node Security Platform (NSP): Node.js paketlerindeki güvenlik açıklarını tespit etmek için kullanılır.
- Nmap ve Nikto: Node.js sunucularındaki açık portları ve güvenlik açıklarını tespit etmek için kullanılabilir.
- Fail2ban: SSH ve diğer servisler üzerinde aşırı deneme hatalarına karşı koruma sağlar.