VSCode Açığı: Tek Tıkla GitHub Token Çalma Tehdidi Ortaya Çıktı
Popüler kod editörü VSCode’da tespit edilen kritik bir güvenlik açığı, kötü niyetli kişilerin tek bir bağlantıya tıklayarak GitHub token’larınızı çalmasına olanak tanıyor. Bu token’lar, özel depolara dahi okuma ve yazma erişimi sağlayarak ciddi güvenlik riskleri oluşturuyor. GitHub’ın ‘github.dev’ özelliği üzerinden çalışan bu saldırı, kullanıcıların tüm depolarına tam erişim sağlayan OAuth token’larını hedef alıyor. Milyonlarca satırlık TypeScript kod tabanına sahip VSCode’un tarayıcı tabanlı sürümünde ortaya çıkan bu zafiyet, güvenlik araştırmacıları için cazip bir hedef haline geldi.
VSCode Webview Güvenlik Modeli ve Zafiyet
VSCode, Electron uygulaması olarak masaüstünde çalışırken, rastgele JavaScript kodunun yürütülmesini engellemek için webview’ler aracılığıyla bir sanal alanlama yaklaşımı benimser. Webview’ler, ana VSCode penceresinden farklı bir ‘origin’e sahip ‘
Güvenliğe katkıda bulunan bu çapraz-origin politikası, ana düzenleyici penceresinin webview içindeki DOM ile doğrudan etkileşim kurmasını da engeller. İki farklı origin’deki web sayfaları ancak ‘Window.postMessage()’ API’si aracılığıyla işbirliği yapabilir. Örneğin, Markdown önizlemesindeki vurguyu güncellemek için ana pencere webview’e mesajlar gönderir.
Zafiyetin Temeli: did-keydown Olayı
Ancak, webview’lerin kullanıcı deneyimini iyileştirmek amacıyla temel işlevleri desteklemesi beklenir; bağlantılara tıklamak veya Ctrl+F gibi klavye kısayollarını kullanmak gibi. Bu nedenle, VSCode, bu özellikleri mesajlaşma mekanizması aracılığıyla uygular. İşte burada zafiyet ortaya çıkıyor: Webview’ler, klavye kısayollarının sorunsuz çalışması için ‘did-keydown’ adlı bir olay gönderir. Bir webview yüklendiğinde, ‘contentWindow.addEventListener(‘keydown’, handleInnerKeydown)’ kodu çalışır ve ‘handleInnerKeydown’ işlevi, klavye olaylarını (tuş, keyCode, shiftKey, ctrlKey vb. detaylarıyla birlikte) ‘hostMessaging.postMessage(‘did-keydown’, {…})’ kullanarak ana VSCode penceresine iletir.
Kötü niyetli bir betik, kullanıcının yerine bu ‘keydown’ olaylarını taklit ederek VSCode’un ana penceresine gönderebilir. Bu, saldırganın komut paletini açma veya diğer tehlikeli komutları çalıştırma girişiminde bulunmasına olanak tanır. Ancak, komut paletine doğrudan metin yazmak mümkün değildir, çünkü bu bir ‘‘ etiketi tarafından işlenir ve taklit edilen klavye olayları metin girişini tetiklemez.
Saldırı Zinciri: Yerel Çalışma Alanı Uzantıları
Saldırgan, VSCode’un geniş varsayılan klavye kısayolları setini kullanarak ‘Bildirimler: Birincil Bildirimi Kabul Et’ (Notifications: Accept Notification Primary Action – Ctrl+Shift+A) eylemini hedefleyebilir. Çalışma alanları, ‘.vscode/extensions.json’ dosyasına uzantı önerileri ekleyebilir. Normalde, yeni bir yayıncıdan uzantı yüklemek ‘Yayıncıya Güven ve Yükle’ (Trust Publisher & Install) iletişim kutusunu tetikler. Ancak saldırgan, bu durumu atlatmak için ‘yerel çalışma alanı uzantılarını’ (local workspace extensions) kullanır. Güvenilen bir çalışma alanında (github.dev/web her zaman güvenilirdir) ‘.vscode/extensions’ dizinine doğrudan bir uzantı yüklemek, yayıncı güven denetimini atlar.
CSP (Content Security Policy) hatası nedeniyle doğrudan ‘.vscode/extensions/extension.js’ dosyasını çalıştırmak mümkün olmasa da, uzantılar ‘package.json’ dosyaları aracılığıyla özel tuş bağlamaları (keybindings) tanımlayabilir. Saldırgan, bu özelliği kullanarak kendi seçtiği bir uzantıyı güven denetimini atlayarak yükleyen bir tuş bağlaması ekler:
"contributes": {
"keybindings": [
{
"key": "ctrl+f1",
"command": "runCommands",
"args": {
"commands": [
{
"command": "workbench.extensions.installExtension",
"args": [
"AmmarTest.hello-ammar-github",
{
"donotSync": true,
"context": {
"skipPublisherTrust": true
}
}
]
}
]
}
}
]
}Tüm bu adımları bir araya getiren saldırı, bir Jupyter defterindeki Markdown hücresine yerleştirilmiş bir JavaScript yükü ile gerçekleşir. Bu JavaScript, özel bir ‘‘ yapısı kullanarak çalışır ve şu adımları izler:
- VSCode’un önerilen uzantı bildirimini açmasını bekler.
- Bildirimi kabul etmek için Ctrl+Shift+A için ‘keydown’ olayını taklit eder.
- Uzantının yüklenmesini ve etkinleşmesini, böylece özel tuş bağlamasının eklenmesini bekler.
- Seçilen uzantının yüklenmesini tetiklemek için Ctrl+F1 için ‘keydown’ olayını taklit eder.
Kurbanı Koruma ve PoC
Bu zafiyetin kanıtı (PoC) olarak, bir Jupyter defteri linki üzerinden saldırı gösterildi. Linke tıklanmasıyla ‘github.dev’ düzenleyicisi açılır ve JavaScript yükü çalışır. Yük çalıştıktan sonra, yeni yüklenen uzantı, kullanıcının GitHub API token’ını alır ve erişimi olan özel depoları listeler. Ardından hem token’ı hem de depolama listesini bir bilgi kutusunda görüntüler.
Bu PoC’yi çalıştırdıysanız, verilerinizi temizlemeyi veya en azından PoC uzantısını kaldırmayı unutmayın, aksi takdirde diğer ‘github.dev’ sayfalarında sizi takip edecektir. Masaüstü VSCode’da da mevcut olan bu zafiyet, kurbanın kötü amaçlı depoyu klonlaması ve defteri açması gerektiği için daha zor istismar edilir.
Kendinizi Nasıl Korursunuz?
Eğer daha önce ‘github.dev’ kullanmadıysanız, siteye ilk erişimde çıkan bir oturum açma iletişim kutusu sizi uyarabilir ve bu saldırıdan kaçınmanızı sağlayabilir. Ancak, eğer bu diyaloğu daha önce geçtiyseniz ve tarayıcınızın yerel depolamasını temizlemediyseniz, savunmasızsınız demektir. ‘github.dev’ için CSRF token’ları bulunmadığından, internet üzerindeki herhangi bir bağlantı sizi bu saldırıya yönlendirebilir.
Kendinizi korumak için, ‘github.dev’ için tarayıcı verilerinizi temizlemeniz şiddetle tavsiye edilir. Chrome’da bu işlem, URL çubuğundaki küçük simgeye tıklayarak, ‘Çerezler ve site verileri’ > ‘Cihazdaki site verilerini yönet’ seçeneği üzerinden ilgili alan adları için verileri silerek yapılabilir.
VSCode’un Güçlü Yönleri ve Tam Açıklama
VSCode, bu tür saldırıları daha da kötüleştirebilecek başka güvenlik önlemlerini başarıyla uygulamıştır. Özellikle katı bir İçerik Güvenlik Politikası (CSP) ve oluşturulan Markdown için DOMPurify kullanımı, keyfi JavaScript yürütülmesini engelleyerek daha geniş çaplı bir RCE saldırısını önlemiştir.
Bu zafiyetin tam açıklama yoluyla yayınlanmasının nedeni, güvenlik araştırmacısının daha önceki MSRC (Microsoft Güvenlik Yanıt Merkezi) deneyimlerinin olumsuz olmasıdır. Geçmişte bildirdiği güvenlik açıklarının ciddiye alınmaması veya yeterli takdir görmemesi, araştırmacıyı bu kritik zafiyeti kamuoyuna duyurmaya itmiştir. Bu durum, güvenlik araştırmacılarının emek ve çabalarının tanınmasının önemini vurgulamaktadır.
