v2.5.2
Giriş yap

eval kullanımında güvenlik üzerine beyin fırtınası

ebykdrms
250 defa görüntülendi

Sorumu kolay anlaşılması için bir senaryo ile anlatayım.
Kendi sunucumda bir metin dosyası oluşturuyorum.
Bu metin dosyasına string halde bir js fonksiyonu yazıyorum:

alert("merhaba dünya");

Sonra React Native ile geliştirdiğim mobil uygulamamdan bu sunucuya istek atıp yukarıdaki string'i okuyorum.
Okuduğum string'i eval() fonksiyonu yardımıyla çalıştırıyorum.

eval() tehlikeli bir fonksiyon. Çünkü içine ne yazarsanız onu çalıştırıyor.
Eğer kötü niyetli biri yardımcı bir uygulama ile benim attığım isteği yakalar, manipüle eder ve başka bir js komutu ile değiştirip uygulamama yanıt olarak dönerse (man-in-the-middle saldırısı) uygulamama sızmış olur.

Bundan nasıl korulabileceğim üzerine ChatGPT'yle uzun uzun tartıştım. Sonuç olarak bana, isteklerimi https ile atmamı, böylece başkalarının isteğimi okuyamayacağını ve güvenli bir ssl sertifikası kullanmam gerektiğini söyledi. Ama ısrarla eval() fonksiyonunun tehlikeli olduğunu da söyledi.
Bu ısrarına yönelik ChatGPT'ye şunu sordum:
Eğer
- isteği attığım sunucuya https ile bağlanıyorsam,
- https sayesinde istek manipülasyonundan kurtulabiliyorsam,
- isteği attığım sunucudaki fonksiyonu bizzat ben yazıyorsam,
biri benim sunucuma sızmadığı sürece benim fonksiyonum güvenlidir ve mobil uygulamamda bu fonksiyonu eval() ile çalıştırmamda bir sakınca yoktur. Doğru mu anladım?
ChatGPT bana kısaca şöyle yanıt verdi:
Sonuç olarak, kendi yazdığınız fonksiyona güvenmeniz durumunda eval ile çalıştırılan fonksiyonun güvenlik açığı içermemesi olasıdır. Ancak, eval fonksiyonunun genel olarak riskli olduğunu ve alternatif güvenli yaklaşımları dikkate almanız gerektiğini unutmayın.

Şimdi size soruyorum. eval() fonksiyonunu kullanırsam nasıl bir saldırıya uğrayabilirim?

Cevap yaz
Cevaplar (3)
devepdogukan
329 gün önce

Eval kullanmaman bütün sitelerde yazar hatta "eval is evil" diye anılır, bunun sebebi çok uzun zaman önce JavaScript, çoğu şeyin yalnızca eval ile yapılabildiği, oldukça zayıf bir dildi. İnsanların halen bunu tercih etmesinin sebebi yenilikleri takip etmeyip eskiye takılı kalmalarıdır.
Web kısmında kullanıcılar "her şeyi" manipüle edebilir. Yani sen kullanıcıya bizzat yazdığın fonksiyonu teslim etmiş üstüne düzenlenebilir halde veriyorsun.
Eğer eval ile projen ilerliyorsa o kurduğun yapıyı tamamen bozman gerekir. Çok rahat bir kullanımı var ama insan o rahatlık konforundan çıkmazsa hiçbir şeyi kendisine katamaz

devepdogukan
328 gün önce

eval back-end'de çalışan bir kod değildir. Zaten bu açıklar client tarafda oluşması muhtemel sorunlardır. Yani kullanıcının gördüğü html sayfasını (client'ı) manipüle etmesidir olay. Backend'e müdahele söz konusu bile olamaz (sunucuna sızmazsa).

ebykdrms
329 gün önce

Teşekkürler @devepdogukan.
Evet, web üzerinde olsa kullanıcılar her şeyi manipule edebilirler. Diyelim ki bir şekilde mobil uygulamayı da web gibi manipüle edebiliyor olsunlar. O zaman web üzerinden örnek verelim.
Diyelim ki back-end kısmında PHP ile kod yazıyorum. Kendi yönettiğim başka bir ssl sertifikalı web servis sunucuma PHP ile istek atıp string haldeki kodları alıyorum. Bu kodları yine PHP tarafında eval() fonksiyonuyla çalıştırıyorum diyelim.
Yani isteği atan da alan da işleten de tamamen back-end kısmı.
Bu durumda PHP ile eval() kullanmamın sakıncası ne olabilir?

eval() tehlikeli bir komut. Ayrıca ben projemde eval'ın da uygun olmadığını daha güvenli başka yollar geliştirmek zorunda kaldım.
Yine de merak ediyorum. Web için back-end, mobil için uygulama içi (kullanıcıya gösterilmeyen) bölümde, eval fonksiyonuna yine kendime ait bir (ssl sertifikalı) web servis sunumumdan kendi yazdığım fonksiyonu gönderdiğimde nasıl bir sorunla karşılaşırım?
Yani kullanıcılar https sayesinde iki sunucum arasındaki iletişime dahil olamıyorlarsa başka nasıl eval() fonksiyonuma sızabilirler?

Bunun bir yolu, web servis barındıran sunucuma sızmaları olabilir. Böylece endpoint'imden döndürdüğüm fonksiyonu kendi fonksiyonuyla değiştirebilir.
Ama zaten web servisime sızıldıysa fonksiyonumu değiştirmekten çok daha fazlasını yapabilir. Yani servis sunucuma sızılması apayrı bir konu.

Peki başka nasıl eval()'a gönderdiğim değere müdahale edilebilirdi?