Code Injection, bir saldırganın uygulamanın giriş verileri aracılığıyla kötü amaçlı kod ileterek yetkisiz işlemler gerçekleştirdiği bir saldırı türüdür. OWASP, 2024'e göre, enjeksiyonlar en kritik güvenlik açıkları arasında ilk üçte yer almaktadır. Kod enjeksiyonu mekanizmalarını anlamak, geliştiricilerin geliştirmenin ilk gününden itibaren güvenli sistemler tasarlamasını sağlar.
Önemli Noktalar
Code Injection, bir saldırganın güvenilmeyen giriş verileri aracılığıyla uygulamaya yürütülebilir kod enjekte ettiği bir saldırı sınıfıdır. Mobil uygulamalarda, giriş alanları, derin bağlantılar, push bildirimleri, QR kodları ve dosya alışverişi yoluyla saldırı mümkündür.
İşletim sistemi düzeyindeki saldırıların aksine, Code Injection uygulamanın kendi kodundaki mantıksal hataları kullanır: kaçış karakteri eksikliği, güvensiz dize birleştirme veya harici veri kaynaklarına güven. Positive Technologies (2025) raporuna göre, finans sektöründeki mobil uygulamalardaki tüm güvenlik açıklarının %23'ü enjeksiyonlardır.
Code Injection'ın ana tehlikesi tam veri ihlalidir: bir saldırgan veritabanına, cihaz dosya sistemine veya diğer kullanıcıların hesaplarına erişebilir. Ödeme verileri veya tıbbi bilgilerle çalışan mobil uygulamalar için sonuçlar kritik olabilir.
Geliştiricilerin enjeksiyon türlerini anlaması ve veri girişinden görüntüleme ve depolamaya kadar tüm seviyelerde koruma mekanizmaları uygulaması gerekir. Modern çerçeveler yerleşik güvenlik araçları sağlar, ancak bunların kullanımı bilinçli bir yaklaşım gerektirir.
Code Injection sınıflandırması, mobil geliştirme bağlamında üç ana saldırı türünü içerir. Her tür, uygulamanın farklı bileşenlerini kullanır ve belirli koruma yöntemleri gerektirir.
SQL Injection (SQLi), yerel veya uzak bir veritabanına sorgu parametreleri aracılığıyla kötü amaçlı SQL kodu enjekte edilmesidir. Mobil uygulamalarda, cihazda SQLite ile güvensiz bir şekilde çalışırken veya dize birleştirme ile REST API'sine HTTP istekleri oluştururken güvenlik açığı ortaya çıkar.
Tipik bir saldırı vektörü, değeri doğrudan bir SQL sorgusunda değiştirilen bir arama veya filtre alanıdır. Geliştirici parametreli sorgular yerine doğrudan birleştirme kullanırsa, bir saldırgan 1' OR '1'='1 gibi bir dize iletebilir. OWASP Mobile Top 10 (2024)'e göre SQL Injection, güvensiz veri depolama kategorisinde mobil uygulamalarda en sık görülen ikinci kritik güvenlik açığı olmaya devam etmektedir.
SQLi'ye karşı koruma üç düzeyde oluşturulur: parametreli sorgular kullanma (Java'da PreparedStatement, Android'de bindArgs ile rawQuery), istemci ve sunucu tarafında giriş doğrulaması ve minimum veritabanı ayrıcalıkları.
Mobil uygulamalardaki XSS saldırıları, HTML içeriğini görüntüleyen yerleşik bir tarayıcı olan WebView bileşenini hedef alır. Bir uygulama, temizleme yapmadan WebView'a harici kaynaklardan veri yüklerse, bir saldırgan uygulama bağlamında yürütülen JavaScript kodu enjekte edebilir.
İki alt türü vardır: Depolanmış XSS — kötü amaçlı betik sunucuda kaydedilir ve her sayfa görüntülemede yürütülür; Yansıtılmış XSS — kod URL veya POST parametreleri aracılığıyla iletilir ve bir kez yürütülür. Mobil uygulamalarda, WebView'da diğer kullanıcılara görüntülenen yorumlar, incelemeler veya kullanıcı içeriği yoluyla Depolanmış XSS özellikle tehlikelidir.
Koruma, gerekli değilse WebView'da JavaScript'i devre dışı bırakmayı, Content Security Policy (CSP) kullanmayı ve Android için Jsoup veya iOS için SwiftSoup gibi kütüphaneler aracılığıyla HTML içeriğini temizlemeyi içerir.
Command Injection, Runtime.exec(), ProcessBuilder veya NSTask'a temizlenmemiş çağrılar aracılığıyla cihazda sistem komutlarının yürütülmesidir. Mobil uygulamalarda, uygulama kullanıcı verilerini shell komutlarına veya eylem içeren Intent'lere iletirse saldırı mümkündür.
En savunmasız alanlar dosya dönüştürme işlevleri, medya işleme (ffmpeg, ImageMagick) ve üçüncü taraf kütüphane kurulumudur. Bir saldırgan, cihazda rastgele kod yürüten bir boru veya yönlendirme karakteri içeren bir komut iletebilir. Android, sanal alan aracılığıyla shell erişimini kısmen kısıtlar, ancak root erişimi veya PrivEsc istismarları olan uygulamalar tehlikeye girebilir.
Önerilen koruma, kullanıcı verilerini işlemek için Runtime.exec()'in tamamen reddedilmesi, güvenli API'ye sahip kütüphanelerin kullanılması ve harici süreçlerin sıkı bir şekilde izole edilmesidir.
Code Injection mekanizması, mimari farklılıklar nedeniyle Android ve iOS platformlarında farklılık gösterir. Android'de enjeksiyonlar genellikle Intent — uygulama bileşenleri arasında iletilen bir sistem mesajı — ile ilişkilidir. Bir saldırgan, SQL kodu veya shell komutları içeren ekstra verilerle kötü amaçlı bir Intent gönderebilir.
iOS'ta saldırılar daha sık olarak Süreçler Arası İletişim (XPC) mekanizması, Evrensel Bağlantılar ve URL Şeması işleme yoluyla gerçekleşir. Doğrulama yapmadan harici kaynaklardan veri kabul eden bir uygulama enjeksiyonlara karşı savunmasız hale gelir. Apple Security Research (2025)'e göre, iOS uygulamalarındaki güvenlik açıklarının yaklaşık %12'si yetersiz giriş verisi temizliği ile ilgilidir.
Her iki platform için ortak bir vektör, yerel depolama (SQLite, Realm, UserDefaults) yoluyla yapılan saldırıdır. Kötü amaçlı bir uygulama paylaşılan bir dizine veri yazabiliyorsa, okuma sırasında hedef uygulama tarafından yürütülecek kodu enjekte edebilir.
Tipik bir saldırı süreci üç aşamadan oluşur: keşif — uygulamanın giriş noktalarının analizi (formlar, derin bağlantılar, dosyalar), enjeksiyon — bulunan giriş noktası aracılığıyla kötü amaçlı yükün iletilmesi ve istismar — verilere veya işlevselliğe erişmek için enjeksiyonun yürütülmesi. Bu döngüyü anlamak, geliştiricilerin her aşamada koruma tasarlamasına yardımcı olur.
Android için Kotlin ve iOS için Swift'te Code Injection'ın belirli örneklerine bakalım. Her örnek, güvenlik açığı olan bir deseni ve güvenli alternatifini gösterir.
İlk örnek, kullanıcı girişiyle bir sorgu dizesinin doğrudan birleştirilmesidir. userInput = "1' OR '1'='1" değeriyle sorgu, bir satır yerine tablonun tüm satırlarını döndürür.
// ZAYIF: dize birleştirme
fun getUserById(userInput: String): List<User> {
val db = openOrCreateDatabase()
val query = "SELECT * FROM users WHERE id = " + userInput
return db.rawQuery(query, null)
}
// GÜVENLİ: parametreli sorgu
fun getUserByIdSafe(userInput: String): List<User> {
val db = openOrCreateDatabase()
val query = "SELECT * FROM users WHERE id = ?"
return db.rawQuery(query, arrayOf(userInput))
}
İkinci örnek, WKWebView'da kullanıcı HTML içeriğinin yanlış ve doğru yüklenmesini gösterir. SwiftSoup kullanımı, işlemeden önce kötü amaçlı betikleri kaldırmaya olanak tanır.
// ZAYIF: doğrudan HTML yükleme
let webView = WKWebView()
let html = "<div>\(userComment)</div>"
webView.loadHTMLString(html, baseURL: nil)
// GÜVENLİ: SwiftSoup ile temizleme
import SwiftSoup
let cleanHtml = try SwiftSoup.clean(
userComment,
Whitelist.basic()
)
webView.loadHTMLString(cleanHtml, baseURL: nil)
Üçüncü örnek, kullanıcı argümanlarıyla Runtime.exec() çağırmanın tehlikesi ve sabit API'ye sahip bir kütüphane aracılığıyla güvenli alternatifidir.
// ZAYIF: kullanıcı girişiyle shell komutu
fun convertVideo(inputPath: String) {
val cmd = "ffmpeg -i $inputPath -vcodec libx264 output.mp4"
Runtime.getRuntime().exec(cmd)
}
// GÜVENLİ: argüman izolasyonu
fun convertVideoSafe(inputPath: String) {
val cmd = listOf(
"ffmpeg", "-i", inputPath,
"-vcodec", "libx264", "output.mp4"
)
ProcessBuilder(cmd).start()
}
Code Injection'a karşı koruma, kodu, altyapıyı ve geliştirme süreçlerini kapsayan sistematik bir yaklaşım gerektirir. Hiçbir tek yöntem tam güvenlik sağlamaz — uygulamaların bir kombinasyonu gereklidir.
İlk seviye önlemedir: tüm giriş verilerinin sıkı doğrulaması. Uygulamanın bir kullanıcıdan, başka bir uygulamadan veya ağdan aldığı her alan, tür, uzunluk ve biçim açısından kontrol edilmelidir. OWASP ESAPI gibi kütüphaneler, yaygın senaryolar için hazır doğrulayıcılar sağlar.
İkinci seviye temizleme ve kaçıştır: verileri SQL sorgularında, HTML şablonlarında veya shell komutlarında kullanmadan önce dönüştürme. Parametreli sorgular SQL Injection'ı tamamen ortadan kaldırır ve HTML kaçışı XSS'yi önler. Android'de SQLite ile çalışmak için Room'u kullanın — otomatik olarak bind parametreleri uygulayan bir ORM.
Üçüncü seviye ayrıcalık minimizasyonudur: uygulama minimum gerekli izinlerle çalışmalıdır. Veritabanı, dosya sistemi ve süreçler arası iletişim için en az ayrıcalık ilkesini kullanın. iOS bu ilkeyi uygulama sanal alanı aracılığıyla, Android ise izin modeli ve süreç izolasyonu aracılığıyla uygular.
Dördüncü seviye izleme ve müdahaledir: şüpheli işlemlerin günlüğe kaydedilmesi, anormallik tespiti ve saldırılar tekrarlandığında otomatik engelleme. Firebase App Check gibi araçlar, tehlikeye girmiş istemcilerden backend'e sahte isteklerin tespit edilmesine yardımcı olur. RASP (Runtime Application Self-Protection) entegrasyonu, çalışma zamanında enjeksiyonları engellemeye olanak tanır.
Google Project Zero (2025) araştırmasına göre, bu dört seviyenin kombinasyonu başarılı bir Code Injection saldırısı riskini %94 oranında azaltır. Geliştiricilerin, güvenlik açıkları keşfedildikten sonra eklemek yerine, mimari tasarım aşamasında koruma mekanizmalarını uygulamaları önerilir.
Sıkça Sorulan Sorular
Code Injection, bir saldırganın uygulamaya veri değil kod göndermesidir. Örneğin, bir kullanıcı adı yerine, uygulamanın veritabanında yürüttüğü ve diğer kayıtlara eriştiği bir SQL sorgusu gönderir.
SQL Injection, SQL sorguları aracılığıyla veritabanına saldırarak kayıtların okunmasını ve değiştirilmesini sağlar. XSS, kullanıcının tarayıcısında yürütülmek üzere WebView'a JavaScript kodu enjekte eder. Farklı hedefler, ancak ortak mekanizma — yetersiz giriş doğrulaması.
SQLite için parametreli sorgularla Room kullanın, WebView'da JavaScript'i devre dışı bırakın, kod karıştırma için ProGuard/R8 uygulayın ve kullanıcı verilerini asla Runtime.exec()'e iletmeyin. Güvenlik yamalarıyla bağımlılıkları düzenli olarak güncelleyin.
Evet, iOS uygulamaları Core Data (ham sorgular) aracılığıyla SQL Injection'a, WKWebView aracılığıyla XSS'e ve Process aracılığıyla Command Injection'a karşı savunmasızdır. iOS sanal alanı saldırının boyutunu sınırlar ancak tamamen önlemez. Kullanmadan önce verileri her zaman temizleyin.
Kaynak kod taraması için SAST (Statik Analiz) — SonarQube, MobSF veya QARK gibi araçları kullanın. Ayrıca, çalışan uygulamayı test etmek için DAST tarayıcıları kullanın: tüm giriş alanlarına özel olarak hazırlanmış dizeler (‘, OR 1=1, <script>) girin.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun