Mobil uygulamalarda güvenlik, kullanıcı verilerinin korunması açısından büyük önem taşır; bu bağlamda JavaScript injection, geliştiricilerin dikkatle ele alması gereken kritik bir tehdit unsuru olarak öne çıkar. Bu yazıda, JavaScript Injection’ın ne olduğu, neden tehlikeli olduğu ve bu tür açıkların nasıl önlenebileceği ele alınmaktadır.
JavaScript Injection Nedir ?
JavaScript Injection, cross-application scripting veya cross-site scripting (XSS) bir çeşidi olarak da bilinir, saldırganların mobil uygulamasına kötü amaçlı JavaScript kodu enjekte ettiği bir güvenlik açığıdır.
Geleneksel XSS saldırılarının aksine, bu tür bir güvenlik açığı genellikle doğrulanmamış veya temizlenmemiş JavaScript işlendiğinde bir mobil uygulamanın WebView’inde istismar edilir. Bu tür saldırılar veri hırsızlığı, kod enjeksiyonu veya hassas kullanıcı bilgilerinin manipüle edilmesiyle sonuçlanabilir. Bu güvenlik açığı WebView yanlış yapılandırmasından kaynaklanmaktadır.
Doğal (native) mobil uygulamalarda JavaScript injection riskleri, genellikle web tarayıcı bileşenlerine dayanmamaları nedeniyle daha az görülür. Ancak, WebView gibi web içeriğini render eden tarayıcı benzeri bileşenleri içeren mobil uygulamalar, JavaScript injection’a karşı savunmasız hale gelir. WebView, geliştiricilerin HTML, CSS ve JavaScript’i doğrudan uygulama arayüzüne entegre etmesini sağlar ve böylece zengin, web benzeri deneyimler sunar. Bu yetenek, dikkatli bir şekilde güvenlik önlemleri alınmadan kullanıldığında, saldırganların bu güvenlik açıklarından yararlanmasına olanak tanır.
Güvenlik ve işlevsellik açısından çeşitli yapılandırmaları destekleyen yaygın bileşenler, Android için WebView ve iOS için WKWebView’dir. UIWebView ise iOS uygulamaları için artık önerilmemektedir, çünkü JavaScript’i devre dışı bırakma gibi sınırlı güvenlik seçeneklerine sahiptir. Bu nedenle, tasarımı gereği JavaScript enjeksiyon saldırılarına açıktır.
Kötü niyetli JavaScript, WebView içinde çalıştığında, ana uygulama ile aynı izinlere sahip olur. Bu da saldırganların uygulama izinlerini kötüye kullanarak hassas kullanıcı verilerine erişmesine veya yetkisiz işlemler yapmasına olanak tanır.
Mitigation Teknikleri:
JavaScript injection’ı önlemenin temel yolu, WebView’in güvenlik odaklı şekilde yapılandırılmasıdır. Geliştiriciler, yalnızca gerekli olan minimum işlevselliği etkinleştiren ve gereksiz veya potansiyel olarak zararlı özellikleri devre dışı bırakan bir yaklaşım benimsemelidir. Aşağıda JavaScript enjeksiyonu risklerini azaltmaya yönelik temel stratejiler yer almaktadır:
-
JavaScript Kullanımının Minimalize Edilmesi
JavaScript yalnızca kesinlikle gerekliyse WebView’da etkinleştirilmelidir. En yaygın saldırı vektörlerinden biri olduğundan, varsayılan olarak devre dışı bırakılması kritik bir savunma mekanizmasıdır. JavaScript kullanılması gerekiyorsa, kapsamını belirli güvenilir içerik ve bağlamlarla sınırlandırılmalıdır. -
Native Bridge Kullanımından Kaçınmak
WebView’daki JavaScript’in yerel kod aracılığıyla cihaz özellikleriyle etkileşime girmesine izin veren Native Bridge’ler önemli güvenlik riskleri oluşturur. Kesinlikle gerekli olmadıkça Native Bridge kullanmaktan kaçınılmalıdır. Native Bridge önemli olduğunda, WebView’dan gelen tüm girdileri doğrulanmalı ve temizlenmelidir. İletişimi güvenilir, izin verilen URL’lerle sınırlandırılmalı ve köprüyü yalnızca gerekli işlevlerle sınırlandırılmalıdır. -
Giriş verilerinin doğrulanması ve temizlenmesi
WebView tarafından işlenen tüm girdiler, kötü amaçlı verilerin yürütülmesini önlemek için sıkı doğrulama ve temizlemeden geçmelidir. Giriş doğrulaması, yalnızca beklenen, doğru biçimlendirilmiş verilerin WebView’e iletilmesini sağlar. Temizleme, özel karakterleri kodlayarak veya güvenli olmayan öğeleri kaldırarak girdiye gömülü potansiyel olarak zararlı komut dosyalarını etkisiz hale getirmeye yardımcı olur. -
URL izin listesi uygulanması
WebView’u yalnızca güvenilir etki alanlarından içerik yüklemeye kısıtlamak, kötü amaçlı içeriğe maruz kalmayı azaltmanın etkili bir yoludur. Bir URL izin listesi, uygulamanın WebView içinde yükleyebileceği onaylı etki alanlarını belirtmelidir. Güvenilmeyen URL’ler, potansiyel olarak güvenli olmayan içeriği izole etmek için sistemin varsayılan tarayıcısına yönlendirilmelidir. Ayrıca, her URL’nin WebView’a yüklenmeden önce şemasını, ana bilgisayar adını ve parametrelerini doğrulamak, kaynağın meşru olduğundan emin olunmasını sağlar. -
Content Security Policy (CSP) kullanılması
Sunucu tarafında bir İçerik Güvenlik Politikası (CSP) uygulamak, WebView veya sistemin varsayılan tarayıcısı içinde yürütülebilecek kaynakları ve betikleri sınırlar. Bir CSP, yetkisiz betiklerin yürütülmesini ve güvenilmeyen kaynakların yüklenmesini önlemeye yardımcı olur ve JavaScript enjeksiyonu riskini daha da azaltır.
Insecure Kod Örneği:
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
public class SupportHelper {
public static void openSupportPage(Activity context, String supportUrl) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(supportUrl)); // Güvenlik kontrolü yok
context.startActivity(intent); // Kullanıcı yönlendiriliyor
}
}
Burada bulunan sorunlar:
-
supportUrl
doğrudan kullanılıyor. -
Şema (
http
,file
,javascript
) kontrol edilmiyor. -
Query parametreleri temizlenmeden ekleniyor.
-
Potansiyel olarak kullanıcıyı zararlı bir siteye yönlendirme riski var.
Secure Kod Örneği:
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.net.UrlQuerySanitizer;
import android.util.Log;
public class SupportHelper {
private static final String TAG = "SUPPORT";
private static final String SECURE_SCHEME = "https";
private static final String BASE_URL = "https://support.example.com";
public static boolean openSupportPage(Activity context, String queryParams) {
// Temel destek URL'si kontrol ediliyor
Uri baseUri = Uri.parse(BASE_URL);
if (!SECURE_SCHEME.equals(baseUri.getScheme())) {
Log.e(TAG, "Support URL must use HTTPS.");
return false;
}
// Query parametrelerini sanitize ederek ekleme
Uri.Builder builder = baseUri.buildUpon().clearQuery();
UrlQuerySanitizer sanitizer = new UrlQuerySanitizer("https://dummy.com?" + queryParams);
for (UrlQuerySanitizer.ParameterValuePair pair : sanitizer.getParameterList()) {
builder.appendQueryParameter(pair.mParameter, pair.mValue);
}
// Intent başlatma
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(builder.build());
context.startActivity(intent);
return true;
}
}
Çözüm yöntemleri:
https
kontrolü ile Güvenli bağlantı zorunlu hale getirmek.UrlQuerySanitizer
kullanımı Parametrelerde XSS/Injection riskini azaltır.clearQuery()
+appendQuery
Sadece temiz verilerle URL oluşturulur.- Loglama ile Hatalı URL’ler kayıt altına alınır.