VSCode’un SSH aracısı akıl almaz
(fly.io)- Fly.io, VSCode uzaktan SSH düzenleme akışına entegre olmaya çalışırken VSCode’un uzak kabuğu hafifçe kullanmak yerine ayrı bir aracı kurup çalıştıran bir yapıda olduğunu gördü
- LLM ile kod üretimi, çalışma ortamına bağlı bir aracı döngüsünde daha yararlı olsa da geliştirme dizüstüsünün sistem ayarlarına kadar müdahale edebileceği için yalıtılmış bir Linux instance’ı gerekir
- Emacs’in Tramp’i, SSH gibi etkileşimli ortamlarda Bourne shell komutları çalıştırarak işlevlerini uzak ortama genişletir; VSCode ise aracıyı ve Node ikili dosyasını indirmek için Bash parçacığı biçiminde bir stager kullanır
- VSCode aracısı, port yönlendirmeli SSH üzerinde çalışır ve VSCode önyüzüyle WebSockets bağlantısı kurarak dosya gezme, rastgele dosya düzenleme, shell PTY çalıştırma ve kendini kalıcı kılma işlemleri yapabilir
- Geliştirme sunucusunda VSCode ile uzaktan düzenlemeye izin vermek bile büyük bir yük getirir; üretim ortamındaki bir olay sırasında bu yöntem kullanılırsa endişe daha da artar, ancak Fly Machine için özel bağlantıda bu yapıdan kaçınmak mümkün oldu
LLM aracı döngüsü için gerekli yalıtım
- Fly.io, VSCode’un SSH üzerinden uzaktan düzenleme yaptığı akışa entegre olmakla ilgilendi
- Çünkü VSCode kullanıcıları çok fazla ve özellikle LLM ile kod üreten VSCode fork’ları kullanılıyor
- LLM’in ürettiği kod, kullanıcının ne yaptığını bildiğinde yararlıdır; çalışma ortamıyla döngüyü kapatabildiğinde etkisi daha da artar
- LLM kod üretir
- Aracı iskeleti kodu çalıştırır
- Kod hata üretir
- Aracı hatayı tekrar LLM’e iletir
- Bu süreç tekrarlanır
- Bu yapı, halüsinasyonlara karşı yarı etkili bir panzehir olabilir; ancak geliştirme dizüstüsünde olduğu gibi çalıştırmak risklidir
- LLM yalnızca üzerinde çalışılan Git projesine değil, sistem ayarlarına da tekrar tekrar dokunabilir
- Daha iyi biçim, anında ayağa kalkan temiz bir Linux instance’ında kapalı döngü tipi aracı yapılandırması çalıştırmak ve bu ortamın kullanıcıya zarar vermesini engellemektir
VSCode uzaktan SSH aracısının çalışma biçimi
- Emacs’in Tramp’i, uzaktan düzenleme sistemlerinin düşünsel atası sayılabilecek Elisp kodudur
- SSH oturumu gibi Bourne shell komutları çalıştırabilen etkileşimli bir ortama bağlandığında Emacs işlevlerini o ortama genişletir
- VSCode’da da Tramp’e benzer bir özellik vardır; ancak bu, basitleştirilmiş Tramp’in TypeScript’e taşınmış hali değildir
- Uzak bağlantıda yalnızca mevcut araçları kullanmak yerine VSCode, aracıyı indirmek için bir Bash parçacığı stager’ı çalıştırır
- Bu aracının içinde Node’un ikili kurulum paketi bulunur
- İlgili kaynak gibi görünen yer microsoft/vscode’daki server/node dizini
- Aracı, port yönlendirmeli SSH üzerinde çalışır ve çalışan VSCode önyüzüne WebSockets bağlantısı oluşturur
- Alt protokol dosya sisteminde gezinebilir
- Rastgele dosya düzenlemek mümkündür
- Kendi shell PTY sürecini çalıştırabilir
- Kendini kalıcı hale getirebilir
- Güvenlik sektöründe bu şekilde çalışan araçlar için kullanılan bir ad vardır; ancak VSCode’a haksızlık olacağı için doğrudan söylenmiyor
- Geliştirme sunucusunda VSCode ile uzaktan düzenlemeye izin vermek huzursuz edicidir; üretim ortamındaki bir olay sırasında aynı yöntem kullanılırsa endişe daha da artar
- Fly Machine’e özel bağlantı yapılırken bu yapıyı dert etmek gerekmedi; bu yüzden derin anlamda önemli bir sorun olmadığı düşünülüyor
1 yorum
Hacker News yorumları
3-4 yıldır kurcaladığı yazılım hakkında yaklaşık bir ay boyunca uzun bir yazı yazmaya çalışıyordu; ancak Kurt, bloga ağustostan beri hiçbir şey koymadığı için huzursuzlanınca sonunda en basit yazıyı yazmaya karar verdi.
O zamana kadar yaptığının tersine düşük eforlu bir yazı yazalım tarzındaydı ve 30 dakikada bir tane çıkarabileceğini düşündü. Bu, sadece kurcaladığı şeyi yazıya dökmesinden ibaretti ve muhtemelen okuyanlardan daha az kafa yormuştu.
README’deki “Tehlikeye düşmüş bir uzak makine, yerel makinenizde kod çalıştırmak için VS Code Remote bağlantısını kullanabilir.” cümlesi çok daha açıktı ve bu güvenlik uyarısının yanında bir CVE numarası olması gerekiyormuş gibi duruyor.
Şu anda görünen ilk iki yazı, McCord-Valim’in FLAME-Livebook-GPU yazısı ile içinde “murid” geçen bu yazı, bir geliştiricinin psikolojik seyrini gerçekten iyi gösteriyor.
Sistem ikililerine izin verilebilir, ama bu karmaşıklaşır ve VSCode’un istemciye daha fazla şey itmesini gerektirebilir. Üstünkörü bakınca ssh sunucusu tarafında chroot seçenekleri görünüyor, ama ssh istemci kılavuzunda pek bir şey yok.
Ya da çözüm, uzakta bir Docker konteyneri indirip uzak dizini bağlayan bir konteyner çalıştırmak ve sonra o konteynere ssh ile bağlanmak olabilir.
Yalnızca alt dizindeki dosyaları senkronize etme yaklaşımının sorunu, VSCode’un başlattığı uzak çalıştırma ve hata ayıklamaya da ihtiyaç duyulması. Bu yüzden eklentilerin de uzak erişime ihtiyacı var ya da uzakta çalışmaları gerekiyor; bazı kod gözlemlerini yerelde çalıştırmak ise tüm alt dizini önceden senkronize etme maliyetini çok yükseltebilir.
Safça gelebilir ama bunun neden bir güvenlik sorunu olduğunu pek anlamıyorum. Bir makineye ssh ile bağlanabiliyor ve soket port yönlendirmesi yapabiliyorsanız zaten diğer her şeyi yapma yetkiniz var demektir; VSCode protokolü de bunu kendilerine uygun bir şekilde açığa çıkarıyor gibi görünüyor.
Bunun güvenlik sorunu olmasının nedeni, uzak makineyle aynı ağda olan ama SSH yetkisi bulunmayan birinin SSH ile yönlendirilmiş porta bağlanabilmesi mi, merak ediyorum. Kullanıcı açısından VSCode’un SSH sistemi oldukça iyi çalışıyor ve hoşuma gidiyor.
sshkomutuyla ya da PuTTY ile elde ettiğiniz bir SSH oturumu olmamasında.VSCode hedef makineye bir uzak ajan kuruyor, ssh’yi aktarım protokolü olarak kullanıyor ve bu aktarım yolunu kullanıcıyla paylaşacağını söylüyor. Yalnızca istenen işi yaparsa sorun yok; ancak keyfi API’ler açığa çıkaran ajan tabanlı bir sistem, ssh üzerinde terminal taklidi yapan tanıdık ama hâlâ zorlayıcı yöntemden çok daha büyük bir saldırı yüzeyi ve risk yaratır.
Bu bağlantı üzerindeki protokol dosya sisteminde gezinebilir, keyfi dosyaları düzenleyebilir, kendi shell PTY süreçlerini başlatabilir ve kendini kalıcı hâle getirebilir. İstemciyle uzak sunucuya ssh bağlanmış olmanız, o sunucunun istemcide keyfi kod çalıştırabileceği anlamına gelmez; en azından istemcinin açıkça bir eylem yapması gerekir.
Ancak “curl | bash”in güvenlik sorunu olmasıyla aynı anlamda bir güvenlik sorunu. Daha yakın benzetme,
bashrciçindeki curl | bash olabilir.Ajan ağa bağlı ve sürekli çalıştığı için, geliştirme sunucusunun güvenlik duvarındaki bir delik, dizüstünün güvenlik duvarındaki bir deliğe dönüşüyor.
VSCode’un nasıl çalıştığını öğrendikçe, koli bandı ve JavaScript geliştiricilerinin aklına gelebilecek en lanetli fikirlerle zar zor bir arada tutuluyormuş gibi görünüyor.
Sadece SSH eklentisine bakınca bile çalışma alanı URI biçiminin iki çeşidi var. Biri fiilen yalnızca ana makine adından oluşan biçim, diğeri ise onaltılık olarak kodlanmış JSON belge biçimi; ikincisi, belirli bir kullanıcı adı gibi ek bilgi gerektiğinde ya da ana makine adında büyük harf olduğunda kullanılıyor.
Bunun gerçekten gerekli olmasının nedeni, son çalışma alanlarına kaydedilirken bir nedenden dolayı küçük harfe çevrilmesi.
SSH bağlantısı, sunucuya kurulacak eklenti ayarlarını da destekliyor; ama çok fazla koyarsanız Windows ana makinesine bağlanamıyor. Komut satırı argümanı olarak CMD üzerinden geçiriliyor, CMD’nin 8191 karakter sınırı var ve o CMD ile PowerShell çağrılıyor.
Özel otomatik tamamlama, tanılar vb. sağlayabilir; diller arası destek için özel Go to definition da oluşturabilirsiniz.
Keşke Microsoft beni birkaç aylığına işe alıp bir köşeye oturtsa ve bu karmaşayı çözmeme izin verse.
Ağ, ikili exploit ve giriş seviyesi sistem programlama derslerinin sunucusunu işletiyordum; bu şey büyük bir baş belası. Bu aptal uzaktan erişim Truva atı yüzünden öğrenciler OpenSSH istemcisini kullanmayı anlamıyor
Düzeltmek için birkaç şey denedim. Ders sunucusunun motd’sine VSCode uzak sunucu eklentisini kullanmamalarını yazdım; dersin önünde
ncdu /homeçalıştırıp sunucuda disk kullanımı 100 MB’ı geçen öğrencilerin istisnasız VSCode kullanıcısı olduğunu gösterdimAyrıca kullanıcı süreç sınırını 45’e çektim; çünkü VSCode uzaktan erişim Truva atı nasıl oluyorsa yaklaşık 50 Node süreci kullanıyor. Öğrenciler motd’yi ve dersteki uyarıları görmezden gelirse sınıra takılıyor, tekrar bağlanmak için bizden süreçleri öldürmemizi istemek zorunda kalıyordu
Sonunda süreç sınırı yerine, her 10 saniyede bir tüm
.vscode-serveruzaktan erişim Truva atlarını öldüren bir betiğe geçtimAsistanlık yaptığım bir derste, temel makine kodunu işleyip öğrendiğimiz ISA’nın assembly ve çalıştırma araçlarını taklit eden bir ödev vardı; öğrencilerin
hexdumpgibi şeylerle dosyanın bayt yapısını anlaması gerekiyorduAma Sublime, nesne dosyasını “yardımsever” biçimde hexdump’ın metin gösterimi gibi render edip okunabilirlik için boşluklar ekliyor, okulun Linux sunucusunda
hexdumpyapıldığında görünenden farklı bir endianness sırası gösteriyorduHer dönem birkaç öğrenci,
AD DE EF BEgibi bir ASCII dizgesini okumak için yazdığı kodun neden tanımadığı bir metin aradığını sormaya gelirdi; aslında bayt değerlerinin 0xDE, 0xAD, 0xBE, 0xEF ile başladığını kontrol etmemiş olurlardıBurada alternatifin ne olduğundan pek emin değilim. VSCode’un SSH ile düzenleme özelliği şaşırtıcı derecede iyi çalışıyor; uzak makinede vim, nano, micro kurcalamayı çoktan bıraktım
Ajan, araya girmeden sessizce çalışmamı sağlıyor. Neredeyse yerel makinede çalışıyormuşum gibi; benim için büyük bir artı
Güvenlik riski olabilir ama geliştirme deneyimi kıyas kabul etmiyor. VSCode’un hangi başka editörü öldürdüğüyle pek ilgilenmiyorum; araç işime engel olmadan çalışmamı sağlasın yeter
İkili dosya dağıtmıyor; baytları pipe üzerinden okuyup yazıyor ve anlamlı yürütmenin tamamı yerelde gerçekleşiyor. Özellikle kalıcılık oluşturmuyor; “SSH ile bağlı olduğun sürece VSCode eklentisi erişebilir” ile “VSCode eklentisi sonsuza dek erişebilir” aynı şey değil
Birden çok uzak ortamda çalışırken nerede bağlı olduklarını, bağlantı durumunun ne olduğunu çoğu zaman bilmiyorlar. Terminal yavaş, oturum durumu kalıcılığı ise dengesiz
tmuxve düzgün bir metin editörü kullanmaktan çok daha kötü bir deneyim. Üstelik sunucu çok ağır ve düzgün kapanmıyor; altı tane sunucu örneği açık bırakmak da yaygınGüncellemelerin yarısı bozuluyor; gerçek ssh istemcisiyle host’a girip bozuk vscode sunucusunu nasıl temizleyeceğini bilmediği için bir saat kaybedenler oluyor
Ne öğrenmiş olduk? Uzaktan kod çalıştırmanın var olduğunu mu? Geliştirme araçlarına yanlış yerde duyulan güvenin çoğu zaman pişmanlık getirdiğini mi? Modern yazılım tasarımının berbat olduğunu mu? Biraz dikkat edilseydi bunların hepsi zaten apaçıktı
SSH, 90'ların çözümü. Birkaç özellik eklenmiş Telnet; “secure” shell diye anılıyor ama kelimenin tam anlamıyla Telnet+TLS'ten daha az güvenli
Sunucuda kullanıcı oturumu olan bir tünele zaten sahip oldukları için, uygulamaya özel ağ aktarımı ve güvenli bağlantı protokolü yapmaya gerek olmadığına karar veren insanlar SSH'nin üstüne türlü tuhaf ama övülen şeyler bindirdiler
Dağıtık işletim sistemlerinden öğrenilen kavramları bir kenara atıp, o zamana kadar geliştirilmiş ileri kimlik doğrulama ve yetkilendirmeyi yok sayıp, en kötü ve en kolay şeyi benimsemenin sonucu bu
Böyle bir “SSH agent”ın saçma olması şaşırtıcı değil. İşe uygun doğru araçları yapmak için harekete geçmedik; bu yüzden de o amaç için tasarlanmamış mevcut araçların içine sürekli daha fazlasını tıktık. Şaşırmış gibi davranmaya hakkımız yok
Bu bizim yarattığımız dünya. Emekle ya da sessiz onayla hepimizin yarattığı bir şey. SSH olmasa da siyaset, ticaret, okul ve diğer her şeyde de durum aynı. Her gün kendi yığdığımız yığının içinde yaşıyoruz; bir şey yapmadığımız her gün de üstüne bir kürek daha atmış oluyoruz. Küreği elimizde tutarken bunun şaşırtıcı ya da çılgınca olduğunu iddia edemeyiz
Bu yüzden genel olarak giden HTTPS bağlantılarına izin veriyorsanız, SMTP hariç tüm giden bağlantılara da izin vermek daha doğru olur. Gerçek kötü amaçlı trafik zaten her hâlükârda HTTPS üzerinden tünellenecek; geriye kalan tek etki, tünelin karmaşıklığını ve verimsizliğini taşımayan yeni protokollerin dağıtımını engellemek olur
Web girişlerinin de SSH'nin yaptığı yönteme daha yakın olmasını isterdim
Arada dışarı çıkıp çimlere dokunmak ruha iyi gelir. Ayrıca daha iyi bir SSH protokolünün nasıl yapılabileceğine dair öneri de duymak isterim. Yapıcı eleştiri içermeyen şikâyetin pek faydası yok
Buradaki “SSH agent” terimi kafa karıştırıcı. Çünkü normalde kimlik doğrulama token'larını önbelleğe alan daemon'u ifade eder
Üstelik bu yöntem, meşhur macOS SSH agent'ını bozuyor: https://github.com/maxgoedjen/secretive/issues/543
Üretim sunucularında vscode remote kullanmanın çılgınlık olduğuna tamamen katılıyorum
Ama “saçma” diye tarif edilen diğer özellikler beklenebilecek özellikler gibi geliyor
MAANG'de staff engineer seviyesine kadar geldim ve bunun sıradan Vim ile elde etmesi zor bir seviye olduğunu düşünüyorum. Yine de diğer yüksek performanslı kişilerin hâlâ Vim ya da Emacs kullanma eğiliminde olduğunu görüyorum
VCode, JetBrains vb. kullanan çok iyi geliştiriciler de çok, ama giriş engellerini arayıp bulma, araçların büyüsünü keşifle sökme ve tamamen açık kaynak, son derece kurcalanabilir, topluluk odaklı projelere değer verme eğiliminin bu durumu özelliklerden ya da kullanım kolaylığından daha iyi açıkladığını düşünüyorum
VSCode'un uzaktan düzenlemesinin ne kadar karmaşık olduğunu okuyunca VSCode'u daha az kullanmak istiyorum. Makineye ssh ile girip o makinedeki editörü kullanmak yeterli
VSCode'un çözümü çalışıyor ama ne zarif ne de evrensel olarak uygulanabilir; ayrıca bozulmaya daha yatkın. Emacs kullanıcılarından özür dilerim ama Tramp hâlâ epey berbat, netrw de daha iyi değil
watchexec+rsyncBelirli dosya yollarını izleyip yalnızca gerekenleri tam olarak senkronize edebiliyorsunuz. Hâlâ yerel dosya sisteminde çalıştığınız için düzenleme gecikmesi yok, tüm yerel araçları kullanabiliyorsunuz ve senkronizasyon milisaniyeler içinde bitiyor
Yerelde sildiğiniz dosyaların uzakta da silinmesini sağlayabiliyorsunuz ve uzak makinedeki iş bittikten sonra da her zaman yerel bir kopyanız kalıyor. Tramp'ta bunu hep elle senkronize etmek gerekiyordu. Üstelik editörden bağımsız
VS Code'un bu özelliği, artık gerçekte ne yaptığını bildiğim için beni huzursuz ediyor
Copilot'ı açınca araç çubukları daha da arttı ve kullanmaya çalıştığım yere metinler fırladı. Vim sadece koda bakmama, düşünmeme ve yazmama izin veriyor. VSCode ile akış hâline girmek zor
30'larımın ortasındayım; üniversitede emacs kullanmıştım, ilk işimde vim'e geçtim. Çok çetrefilli Java projelerinde IntelliJ kullandım ama onun dışında hep vim kullandım
Karmaşık regex işlemleri gerektiğinde ara sıra vim'i açıyorum
VSCode, mevcut uzak araçlarla birlikte çalışmak yerine Node.js ikili dosyası kurulumu, VSCode ön yüzüne dönen WebSocket bağlantısı ve geniş kapsamlı sistem erişimi işlevleri içeren kapsamlı bir ajan dağıtıyor.
Bu VSCode ajanı, dosya sisteminde gezinme, dosya düzenleme, shell PTY süreçleri oluşturma ve kendini kalıcı kılma yeteneğine kadar geniş yetkilere sahip.
Uzak taraftaysa, elisp Tramp’ın bağımlılıklar açısından daha hafif olduğunu anlıyorum; ancak saldırı yüzeyinin gerçekten bu kadar farklı olup olmadığını merak ediyorum. Yani uzak Node ikili dosyasının, keyfi ssh komutları çalıştıran kullanıcının sahip olmadığı yetkilere sahip olup olmadığını bilmiyorum.
Asıl hedef LLM’ye geçici ve gözden çıkarılabilir bir sanal makinenin tüm anahtarlarını vermek idiyse, ajanın açtığı soket yüzünden yalıtmak istediğiniz geliştirici makinesine de erişebileceği mi söyleniyor, bunu merak ediyorum.
Çılgınca bir fikir gibi gelebilir ama çekirdeğin kendisi şifreleme ve kimlik doğrulama içeren bir web sunucusu ya da başka bir protokol sağlayabilir ve eBPF üzerinden tüm makinenin doğrudan kontrol edilmesine izin verebilir. Bu, istemci/sunucu uzaktan kontrolü için tamamen farklı bir paradigma olabilir.
Elbette Death Star’ın içinden geçebileceği kadar büyük bir güvenlik açığı da olabilir.