Yapay zekâ destekli kodlama araçları, yazılım geliştirme biçimini kısa sürede değiştirdi. Artık doğal dille verilen birkaç talimat üzerinden web sitesi, mobil uygulama, yönetim paneli, API veya otomasyon geliştirmek mümkün. Kullanıcı yapmak istediği ürünü tarif ediyor; yapay zekâ ise mimariyi kuruyor, kodu yazıyor, paketleri seçiyor ve kimi zaman uygulamayı doğrudan bulut ortamına yayımlıyor.
Bu yaklaşım genellikle vibe coding olarak adlandırılıyor. Vibe coding prototip üretimini hızlandırabilir ve teknik olmayan kişilerin fikirlerini çalışan uygulamalara dönüştürmesini kolaylaştırabilir. Ancak çalışan bir uygulama ile güvenli bir uygulama aynı şey değildir. Ekranda sorunsuz görünen bir sistemin arka planında veri sızıntısı, hatalı yetkilendirme, açık API anahtarları veya zararlı bağımlılıklar bulunabilir.
Bu makalede vibe coding kavramını, AI tarafından üretilen kodun özgün saldırı yüzeyini ve üretim ortamına geçmeden önce uygulanması gereken teknik güvenlik kontrollerini inceliyoruz.
Vibe Coding Nedir?
Vibe coding, geliştiricinin kodun her satırını kendisi yazmak yerine uygulamanın nasıl davranmasını istediğini doğal dille yapay zekâya anlattığı geliştirme yöntemidir. Lovable, Replit, Cursor, Bolt, Base44 ve GitHub Copilot gibi platformlar bu iş akışının farklı seviyelerini destekler.
Örneğin kullanıcı, “Kullanıcıların kayıt olabileceği, ürün ekleyebileceği ve ödeme alabileceği bir pazar yeri oluştur” talimatını verebilir. AI aracı proje yapısını, veritabanını, kullanıcı girişini, API endpoint'lerini ve arayüz bileşenlerini kendisi hazırlayabilir. Buradaki güvenlik problemi yapay zekânın kullanılmasından değil, üretilen kodun doğrulanmadan güvenilir kabul edilmesinden doğar.
Vibe Coding ile AI Destekli Geliştirme Aynı Şey mi?
Her AI destekli geliştirme süreci vibe coding değildir. Deneyimli bir geliştiricinin mimariyi kendisinin belirlediği, değişiklikleri satır satır incelediği ve güvenlik testleriyle doğruladığı kullanım modeli kontrollü AI destekli geliştirmedir. Vibe coding yaklaşımında ise kullanıcı çoğunlukla uygulamanın çalışmasına odaklanır; kodu ayrıntılı incelemez, AI'ın seçtiği paketleri kabul eder ve güvenlik kararlarını araca bırakır.
Bu ayrım önemlidir. Büyük dil modelleri işlevsel sonuç üretmek üzere optimize edilir. Tehdit modelleme, en az yetki, veri sınıflandırması ve kötüye kullanım senaryoları açıkça istenmediğinde güvenlik gereksinimleri eksik kalabilir.
1. API Anahtarlarının ve Parolaların Kaynak Koda Yazılması
AI ile geliştirilen uygulamalarda en kritik hatalardan biri gizli bilgilerin doğrudan kaynak koda eklenmesidir.
const apiKey = "sk_live_gercek_api_anahtari";
const databasePassword = "yonetici-parolasi";Bu kod herkese açık bir Git deposuna gönderildiğinde ödeme anahtarları, bulut erişim bilgileri veya veritabanı parolaları saldırganların eline geçebilir. İlgili satırı sonradan silmek yeterli değildir; bilgi Git geçmişinde kalabilir.
Gizli bilgiler ortam değişkenlerinden okunmalı ve mümkünse bir secret-management sistemi kullanılmalıdır.
const apiKey = process.env.PAYMENT_API_KEY;
if (!apiKey) {
throw new Error("PAYMENT_API_KEY tanımlanmamış");
}.env dosyasını Git dışında bırakmak temel önlemdir; buna ek olarak secret scanning çalıştırılmalı, açığa çıkan anahtarlar iptal edilmeli ve yenileri oluşturulmalıdır.
2. Hatalı Kimlik Doğrulama ve Yetkilendirme
Bir kullanıcının sisteme giriş yapması kimlik doğrulamadır. Hangi verilere erişebileceğinin belirlenmesi ise yetkilendirmedir. AI tarafından yazılan uygulama giriş sistemini oluştururken nesne düzeyindeki yetki kontrolünü unutabilir.
app.get("/api/orders/:id", async (req, res) => {
const order = await db.orders.findById(req.params.id);
res.json(order);
});Bu endpoint siparişin oturum sahibine ait olup olmadığını denetlemiyor. Saldırgan URL'deki kimliği değiştirerek başka kullanıcılara ait siparişlere erişebilir. Bu sorun IDOR veya Broken Object Level Authorization olarak bilinir.
app.get("/api/orders/:id", requireAuth, async (req, res) => {
const order = await db.orders.findOne({
id: req.params.id,
userId: req.user.id
});
if (!order) {
return res.status(404).json({ error: "Kayıt bulunamadı" });
}
res.json(order);
});Yetki kontrolleri yalnızca arayüzde değil, her zaman sunucu tarafında uygulanmalıdır.
3. SQL Injection, XSS ve Komut Enjeksiyonu
AI araçları hızlı sonuç üretirken kullanıcı girdisini doğrudan SQL sorgusuna, HTML çıktısına veya sistem komutuna yerleştirebilir.
const query = "SELECT * FROM users WHERE email = '" + req.body.email + "'";Bu kullanım saldırganın sorgu mantığını değiştirmesine izin verebilir. Parametreli sorgu kullanılmalıdır.
const result = await db.query(
"SELECT id, email FROM users WHERE email = $1",
[req.body.email]
);Girdi doğrulaması yalnızca belirli karakterleri engellemekten ibaret olmamalıdır. Her alan için veri tipi, uzunluk, biçim ve izin verilen değerler şema tabanlı olarak tanımlanmalıdır. Aynı yaklaşım dosya yolları, URL parametreleri, NoSQL sorguları, HTML içerikleri ve shell komutları için de geçerlidir.
4. Slopsquatting ve Uydurma Paketler
Büyük dil modelleri zaman zaman gerçekte bulunmayan paket isimleri önerebilir. Saldırganlar, modellerin tekrarladığı bu uydurma isimleri npm veya PyPI gibi depolara kaydederek zararlı paket yayımlayabilir. Kullanıcı AI önerisini kontrol etmeden yüklediğinde saldırgan kodu geliştirme bilgisayarında veya CI/CD sisteminde çalışır. Bu yöntem slopsquatting olarak adlandırılır.
AI'ın önerdiği paket yüklenmeden önce yayıncı, depo bağlantısı, sürüm geçmişi, indirme sayısı, bakım durumu ve kurulum script'leri incelenmelidir. Benzer isimli resmî paketleri taklit eden typosquatting girişimleri de kontrol edilmelidir.
5. Yazılım Tedarik Zinciri Riskleri
Modern uygulamalar yüzlerce doğrudan ve dolaylı bağımlılık içerebilir. Vibe coding araçları gereksiz paket ekleyebilir, güncelliğini yitirmiş sürümler kullanabilir veya kilit dosyalarını kontrolsüz biçimde değiştirebilir.
npm ci
npm audit --omit=devDependency scanning ve Software Composition Analysis süreçleri zorunlu tutulmalıdır. package-lock.json, pnpm-lock.yaml veya eşdeğer kilit dosyaları sürüm kontrolüne alınmalı; üretimde kullanılan bileşenler için SBOM oluşturulmalıdır.
6. Açık Veritabanları ve Yanlış Bulut Yapılandırmaları
Kaynak kod güvenli görünse bile altyapı yanlış yapılandırılmış olabilir. Herkese açık storage bucket, internete açık veritabanı, varsayılan parola, test ortamının üretim verisine bağlanması ve servis hesaplarına yönetici yetkisi verilmesi sık rastlanan problemlerdir.
AI aracına “çalışmıyor, düzelt” denildiğinde araç bazen güvenlik kuralını kaldırarak sorunu geçici biçimde çözer. Geliştirme sırasında kullanılan herkese açık erişim politikaları üretim ortamına taşınmamalıdır. Servis hesapları en az yetki prensibiyle sınırlandırılmalı ve ağ erişimi ihtiyaç duyulan kaynaklarla kısıtlanmalıdır.
7. AI Rules Dosyaları ve Gizli Talimatlar
Cursor, Copilot, Claude Code ve benzeri araçlar proje içindeki talimat dosyalarını okuyarak davranışlarını değiştirir. .cursorrules, CLAUDE.md, AGENTS.md ve Copilot instruction dosyaları buna örnektir.
Üçüncü taraf bir depodan alınan rules dosyasına zararlı veya görünmez talimatlar eklenebilir. Bu talimatlar AI aracını güvenlik kontrollerini kaldırmaya, belirli bir paketi yüklemeye veya sonraki kod değişikliklerine arka kapı yerleştirmeye yönlendirebilir.
AI talimat dosyaları sıradan dokümantasyon olarak görülmemelidir. Satır satır incelenmeli, görünmez Unicode karakterleri açısından taranmalı, sürüm kontrolünde tutulmalı ve değişiklikleri kod incelemesine tabi olmalıdır.
8. İş Mantığı Açıkları ve Kötüye Kullanım Senaryoları
Statik analiz SQL injection gibi teknik hataları bulabilir; fakat iş mantığı açıklarını tespit etmek daha zordur. İndirim kuponunun sınırsız kullanılması, ödeme tamamlanmadan siparişin onaylanması, negatif fiyat gönderilmesi veya parola sıfırlama endpoint'inin sınırsız e-posta göndermesi bu sınıfa girer.
Her kritik işlem için yalnızca normal kullanım değil, saldırgan davranışı da modellenmelidir. Rate limit, işlem sırası, tekrar oynatma, sahiplik kontrolü, token süresi ve sunucu tarafı doğrulama test edilmelidir.
9. Kişisel Verilerin Loglara ve AI Sistemlerine Gönderilmesi
Hata ayıklama amacıyla bütün istek gövdesini kaydetmek parola, oturum token'ı, kimlik numarası veya finansal bilginin loglara yazılmasına neden olabilir. Benzer şekilde geliştirici hata mesajını AI aracına gönderirken gerçek müşteri verisini üçüncü taraf sisteme aktarabilir.
Authorization başlıkları, çerezler, API anahtarları, parolalar ve hassas kişisel veriler maskelenmeli veya hiç loglanmamalıdır. KVKK kapsamındaki verilerin hangi AI sistemlerine aktarıldığı, nerede işlendiği ve ne kadar saklandığı ayrıca değerlendirilmelidir.
10. Güvenlik Testlerinin Yapay Zekâya Bırakılması
Bir AI aracına “yazdığın kod güvenli mi?” diye sormak bağımsız güvenlik testi değildir. Aynı model kendi oluşturduğu hatayı fark etmeyebilir veya yalnızca yüzeysel kontroller gerçekleştirebilir.
Üretim öncesinde SAST, SCA, secret scanning, DAST, API güvenlik testi, yetkilendirme testi, manuel kod incelemesi ve risk seviyesine göre penetrasyon testi uygulanmalıdır. Kritik bulgular düzeltilmeden dağıtımı engelleyen bir CI/CD güvenlik kapısı oluşturulmalıdır.
Güvenli Vibe Coding İçin Teknik İş Akışı
1. Koddan Önce Veri Sınıflandırması Yapın
Uygulamanın herkese açık, kurum içi, kişisel, finansal veya kimlik doğrulama verilerinden hangilerini işlediğini belirleyin. Hassas veri ve güvenlik fonksiyonu içeren sistemlerde daha sıkı insan denetimi uygulayın.
2. Tehdit Modelini Talimata Ekleyin
Sunucu tarafında kimlik doğrulama ve nesne düzeyinde yetkilendirme uygula.
Kullanıcı girdileri için şema tabanlı doğrulama kullan.
SQL sorgularını parametreli oluştur.
Gizli bilgileri kaynak koda yazma.
Kritik endpoint'lere rate limit ve audit log ekle.
Yetkilendirme testleri olmadan görevi tamamlanmış sayma.Bu talimatlar güvenlik testlerinin yerine geçmez; ancak güvenli bir başlangıç yapılmasına yardımcı olur.
3. AI Kodunu Güvenilmeyen Girdi Sayın
AI tarafından üretilen kodu internetten alınmış üçüncü taraf kodla aynı güven seviyesinde değerlendirin. İncelenmeden üretim ortamına almayın.
4. Değişiklikleri Küçük Tutun
Binlerce satırlık tek değişiklik yerine görevleri parçalara ayırın. Küçük pull request'ler daha kolay incelenir, test edilir ve gerektiğinde geri alınır.
5. Güvenlik Kontrollerini Otomatikleştirin
npm ci
npm test
npm audit --omit=dev
gitleaks detect --source .
semgrep --config p/owasp-top-ten .
trivy fs .Kullanılacak araçlar teknoloji yığınına göre değişebilir. Önemli olan kontrollerin isteğe bağlı olmaması ve CI/CD sürecinde zorunlu çalışmasıdır.
6. Yetkilendirme Testleri Yazın
- Kullanıcı kendi kaydına erişebiliyor mu?
- Başka kullanıcının kaydına erişmesi engelleniyor mu?
- Oturum açmamış kullanıcı reddediliyor mu?
- Standart kullanıcı yönetici işlemi yapabiliyor mu?
- Süresi dolmuş veya iptal edilmiş token reddediliyor mu?
7. Üretime Geçişte İnsan Onayı Kullanın
AI aracı kod yazabilir ve testleri çalıştırabilir. Ancak ödeme, kimlik doğrulama, kişisel veri veya kritik altyapı işleyen uygulamalarda son güvenlik kararı yetkin bir insan tarafından verilmelidir.
Sonuç: Vibe Coding Güvenli mi?
Vibe coding tek başına güvenli veya güvensiz değildir. Güvenlik seviyesi; uygulamanın taşıdığı risk, AI aracına verilen yetkiler, kullanılan bağımlılıklar ve doğrulama süreçleriyle belirlenir.
Basit bir prototip ile müşteri verisi işleyen üretim uygulaması aynı kontrol düzeyiyle geliştirilemez. Kimlik doğrulama, ödeme, kişisel veri, API anahtarı veya kurumsal sistem erişimi içeren AI kodu ayrıntılı biçimde incelenmelidir.
Kodun çalışması, kodun güvenli olduğu anlamına gelmez.
Yapay zekâ geliştirme hızını artırabilir; fakat mimari kararların, yetkilendirme kontrollerinin ve güvenlik sorumluluğunun sahibi hâlâ insandır.
Kaynaklar
- NCSC – The Vibe Coding Spectrum Approach to AI-Assisted Software Development
- IBM – Vibe Coding Security Risks Aren't Like Ordinary Security Risks
- Understanding the (In)Security of Vibe-Coded Applications
- ISACA – Vibe Coding and the AI Security Governance Gap