Mert Özen Her Satırda Daha İleri
Geliştirici Araçları IDE'ler — #08

IDE Extension'ları: Gerçekten İşe Yarayanlar, Settings Sync ve Extension Güvenliği

Mert Özen 8 Kas 2026 9 dk 4 görüntülenme
IDE Extension'ları: Gerçekten İşe Yarayanlar, Settings Sync ve Extension Güvenliği

Extension senin yetkinle çalışır ve Workspace Trust onu durduramaz; Restricted Mode yalnız güvenmediğin repo'nun kendiliğinden kod çalıştırmasını engeller. VS Code'un yerleşik extension manifest'lerini bir .NET 10 file-based app ile okuyup Git ve TypeScript'in güvenilmeyen workspace'te neden kapandığını gösteriyoruz; kısa ve gerekçeli extension listesi, .vscode/extensions.json, Settings Sync, extensions.allowed ve Marketplace vakalarından dersler.

Sürüm notu: Bu yazıdaki kodlar .NET 10 SDK (Software Development Kit) 10.0.402 ile derlenip denenmiştir; extension manifest analizi bu makinedeki Visual Studio Code (VS Code) 1.145.2'nin uygulama paketiyle gelen yerleşik extension'lar üzerinde yapıldı. Kullanıcının VS Code profiline dokunmamak için hiçbir extension kurulmadı ve ayar değiştirilmedi. Visual Studio 2026 ve Rider 2026.2 tarafı resmi dokümandan; kötü niyetli extension vakaları Microsoft'un Marketplace güvenlik yazısından ve güvenlik firmalarının yayımladığı raporlardan derlendi.

Önce Tahmin Et

Bookstore ekibinden biri, "Angular snippet'leri" adlı, 40 bin indirmeli bir VS Code extension'ı kuruyor. Extension yalnız birkaç snippet ekliyor gibi görünüyor. Sence bu extension, senin makinende neye erişebilir: yalnız açık dosyaya mı, workspace'e mi, yoksa senin kullanıcı hesabının erişebildiği her şeye mi (SSH (Secure Shell) anahtarların, ~/.nuget içindeki token'lar, tarayıcı profilin)? Ve VS Code'un Restricted Mode'u, yani Workspace Trust, seni bu extension'dan korur mu?

Bu yazıda extension'ları iki yönüyle ele alıyoruz: verim (gerçekten işe yarayan kısa liste, ayarların senkronu, ekiple paylaşılan öneri listesi) ve güvenlik (extension'ın yetkisi, Workspace Trust'ın neyi korumadığı, kurumsal kısıtlama).

Extension Senin Yetkinle Çalışır

VS Code'un "Extension runtime security" dokümanı açık konuşuyor: extension host, VS Code'un kendisiyle aynı izinlere sahip; bir extension dosya okuyup yazabilir, ağ isteği atabilir, harici process çalıştırabilir ve workspace ayarlarını değiştirebilir. Visual Studio extension'ları (VSIX (Visual Studio Extension) paketleri) ve Rider plugin'leri de IDE (Integrated Development Environment) process'inin içinde, aynı kullanıcı yetkisiyle çalışır. Önce Tahmin Et'in ilk cevabı bu: snippet extension'ı teknik olarak senin kullanıcı hesabının erişebildiği her şeye erişebilir.

İkinci sorunun cevabı da aynı dokümanda: Workspace Trust, kötü niyetli bir extension'ın kod çalıştırmasını ve Restricted Mode'u yok saymasını engelleyemez. Workspace Trust'ın koruduğu şey başka: güvenmediğin bir repo'yu açtığında, o repo'nun içindeki şeylerin (task'lar, debug configuration'ları, workspace ayarları, terminalin otomatik çalıştırdığı script'ler, AI (Artificial Intelligence) agent'ları) kendiliğinden çalışmasını durdurur. Yani tehdit modeli iki ayrı: "kötü repo" ve "kötü extension". Birincisine karşı Workspace Trust, ikincisine karşı yalnız neyi kurduğun.

Workspace Trust: Extension'lar Ne Beyan Ediyor

Restricted Mode'da her extension aynı davranmaz. Extension, package.json'ında capabilities.untrustedWorkspaces.supported ile güvenilmeyen workspace'te ne yapacağını beyan eder: true (tam çalışır), false (devre dışı kalır) ya da "limited" (bazı özellikleri ve ayarları kısıtlanır). Hiç beyan etmeyen ve kod çalıştıran extension false sayılır; tema ve dil grameri gibi kodsuz extension'lar ise trust gerektirmez. VS Code'un yerleşik extension'larının beyanlarını, önceki yazıda gördüğümüz .NET 10 file-based app ile okuduk:

using System.Text.Json;

// verilen klasördeki extension manifest'lerini (package.json) okur
string root = args[0];
Dictionary<string, int> counts = [];

foreach (string dir in Directory.GetDirectories(root).Order())
{
    string manifest = Path.Combine(dir, "package.json");
    if (!File.Exists(manifest))
    {
        continue;
    }

    using JsonDocument doc = JsonDocument.Parse(File.ReadAllText(manifest));
    string support = "(not declared)";
    if (doc.RootElement.TryGetProperty("capabilities", out JsonElement caps)
        && caps.TryGetProperty("untrustedWorkspaces", out JsonElement untrusted))
    {
        support = untrusted.GetProperty("supported").ToString();
    }

    counts[support] = counts.GetValueOrDefault(support) + 1;
    if (support is "False" or "limited")
    {
        Console.WriteLine($"{Path.GetFileName(dir),-30} untrustedWorkspaces.supported = {support}");
    }
}

Console.WriteLine();
foreach ((string support, int count) in counts.OrderByDescending(c => c.Value))
{
    Console.WriteLine($"{support,-15} {count}");
}
$ dotnet run trust-report.cs -- "/Applications/Visual Studio Code.app/Contents/Resources/app/extensions"
git                            untrustedWorkspaces.supported = False
github-authentication          untrustedWorkspaces.supported = limited
json-language-features         untrustedWorkspaces.supported = limited
markdown-language-features     untrustedWorkspaces.supported = limited
microsoft-authentication       untrustedWorkspaces.supported = limited
ms-vscode.js-debug             untrustedWorkspaces.supported = limited
npm                            untrustedWorkspaces.supported = limited
php-language-features          untrustedWorkspaces.supported = limited
typescript-language-features   untrustedWorkspaces.supported = False

(not declared)  63
True            23
limited         7
False           2

Tablo öğretici. Git ve TypeScript dil servisi güvenilmeyen bir repo'da tamamen kapanıyor: Git, repo'daki hook'ları ve config'i çalıştırabilir; TypeScript dil servisi workspace'teki TypeScript sürümünü yükleyebilir. npm extension'ı sınırlı çalışıyor, çünkü package.json script'lerini çalıştırmak tam olarak bir repo'nun içindeki kodu çalıştırmak demek. Beyan etmeyen 63 extension'ın 60'ı tema ve gramer gibi kodsuz paketler; yalnız üçünün bir giriş noktası var. Visual Studio'da karşılık, internetten indirilmiş bir projeyi açarken gösterilen güvenlik uyarısı; Rider'da ise güvenilmeyen bir solution'ı "safe mode"da açma seçeneği.

Gerçekten İşe Yarayanlar: Kısa ve Gerekçeli Liste

İyi bir extension listesi kısa olur ve her satırın bir gerekçesi vardır. Kural: IDE'nin yerleşik olarak yaptığı işi extension ile tekrar etme. Visual Studio ve Rider'da aşağıdakilerin çoğu zaten içeride; liste esas olarak VS Code için.

İhtiyaçVS CodeVisual Studio 2026Rider 2026.2
C# dil desteği, solution, testC# Dev Kit (ms-dotnettools.csdevkit)YerleşikYerleşik
Angular template'leriAngular Language Service (angular.ng-template)Angular Language Service extension'ı (Microsoft)Yerleşik (WebStorm desteği)
Lint ve format (TypeScript)ESLint (dbaeumer.vscode-eslint), Prettier (esbenp.prettier-vscode)Yerleşik ESLint desteğiYerleşik
.editorconfigEditorConfig (editorconfig.editorconfig)YerleşikYerleşik
Container'larContainer Tools (ms-azuretools.vscode-containers), Dev ContainersNetWeb workload'ındaki container araçlarıYerleşik Docker desteği
Hataları satırda görmekError Lens (usernamehw.errorlens)GerekmezGerekmez

Listede olmayanlar da bilinçli: VS Code'da Git yerleşik ve çoğu ekibe yeter; GitLens gibi büyük extension'lar ancak gerçekten kullanacağın özellikler için. Rider'da ReSharper'ı tekrar eden plugin'lere, Visual Studio'da Copilot'un yerleşik özelliklerini tekrar eden AI extension'larına ihtiyaç yok. Her eklenen extension başlangıç süresi, bellek ve saldırı yüzeyi demek.

Repo'da Öneri Listesi: .vscode/extensions.json

Ekibin extension kararı repo'da durmalı. VS Code, workspace açıldığında .vscode/extensions.json'daki önerileri gösterir; unwantedRecommendations ise ekipte istenmeyen extension'lar için öneri yapılmasını engeller (örnekteki, Prettier ile çakışan eski bir formatter):

{
  "recommendations": [
    "ms-dotnettools.csdevkit",
    "angular.ng-template",
    "dbaeumer.vscode-eslint",
    "esbenp.prettier-vscode",
    "editorconfig.editorconfig"
  ],
  "unwantedRecommendations": [
    "hookyqr.beautify"
  ]
}

Altıncı yazıdaki devcontainer.json'da aynı liste customizations.vscode.extensions altında container'a otomatik kurulur. Visual Studio'da karşılığı ikinci yazıda gördüğümüz .vsconfig'in extensions bölümü. Rider'da plugin'ler kişisel kurulumdur; Rider dokümanında repo'dan plugin önermenin doğrudan bir karşılığına rastlamadık, ekip için gereken plugin'leri README'de belirtmek en basit yol.

Settings Sync, VS Settings Roaming ve Rider Backup and Sync

Kişisel ayarlar (tema, kısayollar, font) repo'ya değil hesabına aittir ve üç IDE de bunları buluta senkronlar. VS Code'un yerleşik Settings Sync'i GitHub ya da Microsoft hesabıyla ayarları, kısayolları, snippet'leri, task'ları, UI (User Interface) durumunu, extension'ları ve profile'ları taşır; dokümana göre extension'ları SSH, Dev Container ya da WSL (Windows Subsystem for Linux) gibi uzak pencerelere senkronlamaz. Visual Studio, aynı kişiselleştirme hesabıyla giriş yapılan makineler arasında tema, Fonts and Colors, kısayollar ve Text Editor ayarlarını varsayılan olarak senkronlar; Tools > Options > Environment > Accounts'tan kapatılır. Rider'da Backup and Sync plugin'i ayarları JetBrains hesabında saklar ve hesapla giriş yapılan bütün JetBrains IDE'lerine taşır.

Ayrım önemli: ekip kararı repo'da (.editorconfig, .vscode/settings.json, team-shared .DotSettings), kişisel tercih senkronda. Senkronun bir ekip ayarını taşıyıp repo'daki ayarla çakışması "bende farklı görünüyor" konuşmalarının bir kaynağıdır.

Kurumsal Ortamda Kısıtlama: extensions.allowed

VS Code 1.96'dan beri extensions.allowed ayarı hangi extension'ların kurulup etkinleştirilebileceğini belirler. Ayar yoksa her şey serbest; ayar varsa listede eşleşmeyen her extension engellenir ve kurulu olanlar devre dışı kalır. Yayıncı, extension ID'si, sürüm ve platform düzeyinde kural yazılabilir:

"extensions.allowed": {
    "microsoft": true,
    "github": true,
    "angular.ng-template": true,
    "esbenp.prettier-vscode": true,
    "dbaeumer.vscode-eslint": ["3.0.0"]
}

microsoft yayıncı anahtarı, farklı yayıncı ID'leri kullansalar bile Microsoft'un bütün extension'larını kapsar. Sürüm aralığı desteklenmiyor; her onaylı sürüm tek tek yazılır. Kullanıcı bu ayarı kendi değiştirebileceği için kurumsal ortamda asıl araç AllowedExtensions policy'si: cihaz yönetimiyle dağıtılır ve kullanıcı ayarını ezer. Dokümanın uyarısı: policy değerinde sözdizimi hatası varsa ayar hiç uygulanmaz; Window log'unu kontrol et. VS Code ayrıca 1.97'den beri üçüncü taraf bir yayıncıdan ilk kurulumda yayıncıya güvenip güvenmediğini soruyor; komut satırından kurulumda yayıncı otomatik güvenilir sayılmıyor.

Marketplace Vakalarından Dersler

Microsoft'un Haziran 2025 tarihli Marketplace güvenlik yazısına göre, Marketplace her paketi yayın öncesi ve sonrası birden fazla antivirüs motoruyla tarıyor, sandbox'ta çalışma zamanı davranışını kontrol ediyor ve bütün VS Code extension'larını imzalıyor; VS Code kurulumda imzayı doğruluyor. Aynı yazıya göre yılın o noktasına kadar 136 extension kötü niyetli kod şüphesiyle incelenmiş, 110'u kaldırılmış. Marketplace'ten kaldırılan kötü niyetli extension VS Code'da block list'e alınıp kurulu olduğu makinelerden otomatik kaldırılıyor.

Tablonun öbür yüzü de var. Güvenlik firmalarının raporlarına göre 2025 sonundan itibaren GlassWorm adı verilen kampanya, VS Code uyumlu editörlerin (Cursor gibi) kullandığı Open VSX'te (Eclipse Foundation'ın işlettiği açık kaynak extension registry'si) kodu görünmez Unicode karakterleriyle gizleyen extension'lar yayımladı; Ocak 2026'da ele geçirilmiş bir yayıncı hesabından güvenilir extension'lara kötü niyetli güncellemeler itildi; sonraki dalgada temiz görünen extension'lar sonradan zararlı extension'lara bağımlılık ekleyerek dönüştürüldü. Çıkan dersler, kaynağı ne olursa olsun aynı:

  • İndirme sayısı ve yıldız güven göstergesi değildir; verified publisher (mavi tik), açık kaynak repo, aktif bakım ve gerçekten ihtiyaç birlikte değerlendirilir.
  • Güvenilir bir extension'ın bir güncellemesi de zararlı olabilir; kurumsal ortamda sürüm sabitleme (extensions.allowed'da sürüm listesi) ve otomatik güncellemenin kontrolü bu yüzden var.
  • Extension pack ya da bağımlılığı olan bir extension'a güvenmek, bağımlı extension'ların yayıncılarına da güvenmek demek; doküman bunu açıkça yazıyor.
  • Farklı registry'lerin farklı korumaları var; VS Code fork'u kullanan bir ekip, registry'sinin kaldırılan extension'ları makinelerden otomatik silip silmediğini bilmeli.

Üretimde Dikkat

Extension'ları bağımlılık gibi yönet. NuGet ve npm paketleri için yaptığın gözden geçirmeyi (kim yayımlıyor, ne zaman güncellendi, kaç kişi bakımını yapıyor) extension'lar için de yap; çünkü onlar da senin makinende, senin yetkinle çalışan koddur.

Geliştirici makinesindeki sırları sınırla. Extension senin erişebildiğin her şeye erişebildiğine göre uzun ömürlü token'ları düz dosyada tutma; kısa ömürlü kimlik bilgileri ve işletim sisteminin anahtar zinciri saldırı yüzeyini küçültür.

Terk edilmiş extension'ları izle. Bakımı bırakılmış bir extension yeni IDE sürümüyle bozulabilir ya da sahiplik el değiştirdiğinde riskli bir güncelleme alabilir. Visual Studio 2026'nın 2022 extension'larıyla geniş uyumluluğu iyi bir haber, ama "çalışıyor" ile "bakılıyor" aynı şey değil.

Sık Düşülen Tuzaklar

Workspace Trust'ı extension güvenliği sanmak. Restricted Mode, kötü bir repo'nun kendiliğinden çalışmasını engeller; kötü bir extension'ı engellemez.

Yerleşik özelliği extension ile tekrar etmek. İki ayrı formatter aynı dosyayı farklı biçimlendirir; iki lint extension'ı aynı hatayı iki kez gösterir.

Kişisel extension'ları recommendations'a koymak. Öneri listesi ekip kararıdır; tema ve kişisel verim araçları senin Settings Sync'inde kalmalı.

extensions.allowed'ı yalnız kullanıcı ayarı olarak dağıtmak. Kullanıcı ayarı değiştirilebilir; kurumsal kısıtlama policy ile yapılır.

Terk edilmiş extension'ın güncel IDE ile bozulmasını beklemeden fark etmemek. IDE güncellemesinden sonra gelen ilk garip davranışta önce extension'ları devre dışı bırakıp dene; VS Code'da Extension Bisect bunu senin yerine yapar.

Küçük Bir Deneme

★☆☆ Kurulu extension'larını listele ve her biri için tek cümlelik bir gerekçe yaz. Gerekçesi olmayanları kaldır; IDE'nin açılış süresini önce ve sonra karşılaştır.

★★☆ Bu yazıdaki trust-report.cs'i kendi extension klasörünün bir kopyasına karşı çalıştır (VS Code'da extension'ların kurulu olduğu klasörü Command Palette'teki "Extensions: Open Extensions Folder" gösterir). Hangi extension'lar güvenilmeyen workspace'te tam çalışıyor ve bunlar kod çalıştırıyor mu?

★★★ Ekibin için bir .vscode/extensions.json ve kurumsal kullanım için bir extensions.allowed taslağı hazırla. Taslağı bir test makinesinde dene: listede olmayan bir extension'ı kurmaya çalıştığında ne oluyor, zaten kurulu olan bir extension'a ne oluyor?

Extension'lar IDE'ye yetenek ekliyor; AI asistanları ise bir adım ileri gidip IDE'nin içinde kod yazıyor, komut çalıştırıyor. Bir sonraki yazıda Copilot agent mode, Rider'ın AI özellikleri ve bu araçları güvenli kullanmanın kurallarını ele alıyoruz.