- Fly.io ने VSCode remote SSH editing flow के साथ जुड़ने की कोशिश करते हुए पाया कि VSCode remote shell का हल्का इस्तेमाल करने के बजाय एक अलग agent को install और run करता है
- LLM code generation, execution environment से जुड़े agent loop में ज्यादा उपयोगी होती है, लेकिन यह developer laptop की system settings तक बदल सकती है, इसलिए एक isolated Linux instance की जरूरत होती है
- Emacs का Tramp, SSH जैसे interactive environment में Bourne shell commands चलाकर remote environment तक functionality बढ़ाता है, लेकिन VSCode एक Bash snippet stager से agent और Node binary डाउनलोड करता है
- VSCode agent, port-forwarded SSH के ऊपर चलता है और VSCode frontend से WebSockets connection बनाकर file traversal, arbitrary file editing, shell PTY execution और self-persistence कर सकता है
- सिर्फ development server पर VSCode remote editing की अनुमति देना भी भारी लगता है, और production incident के दौरान अगर यही तरीका इस्तेमाल हो तो चिंता और बढ़ती है, लेकिन Fly Machine के custom connection में इस architecture से बचा जा सका
LLM एजेंट लूप के लिए जरूरी isolation
- Fly.io, VSCode के SSH के जरिए remote editing करने वाले flow में integrate होने में रुचि रखता था
- क्योंकि बहुत से लोग VSCode इस्तेमाल करते हैं, खासकर VSCode forks जो LLM से code generate करते हैं
- LLM-generated code तब उपयोगी होती है जब उसे पता हो कि user क्या कर रहा है, और अगर execution environment के साथ loop बंद किया जा सके तो इसका असर और बढ़ जाता है
- LLM code generate करता है
- agent scaffolding code को execute करती है
- code error पैदा करता है
- agent error को वापस LLM तक पहुंचाता है
- यह प्रक्रिया दोहराई जाती है
- यह संरचना hallucination के खिलाफ आधा-अधूरा असरदार antidote हो सकती है, लेकिन developer laptop पर इसे सीधे चलाना जोखिम भरा है
- LLM, जिस Git project पर काम हो रहा है उसके साथ-साथ system settings को भी बार-बार छू सकती है
- बेहतर तरीका यह है कि तुरंत शुरू होने वाले एक साफ Linux instance में closed-loop agent setup चलाया जाए, और यह सुनिश्चित किया जाए कि वह environment user को नुकसान न पहुंचा सके
VSCode remote SSH agent कैसे काम करता है
- Emacs का Tramp एक तरह से remote editing system का मानसिक पूर्वज कहे जाने लायक Elisp code है
- यह SSH session जैसे interactive environment से जुड़कर, जहां Bourne shell commands चलाई जा सकती हैं, Emacs की functionality उस environment तक बढ़ा देता है
- VSCode में भी Tramp जैसी capability है, लेकिन यह TypeScript में लिखी गई किसी simplified Tramp संरचना जैसा नहीं है
- remote connection में सिर्फ मौजूदा tools का उपयोग करने के बजाय, VSCode एक Bash snippet stager चलाकर agent डाउनलोड करता है
- इस agent में Node की binary installation शामिल होती है
- संबंधित source का संभावित स्थान microsoft/vscode का server/node directory है
- agent, port-forwarded SSH के ऊपर काम करता है और चल रहे VSCode frontend तक WebSockets connection बनाता है
- इसका subprotocol filesystem में घूम सकता है
- arbitrary files edit की जा सकती हैं
- यह अपना shell PTY process चला सकता है
- यह खुद को persist भी कर सकता है
- security industry में इस तरह काम करने वाले tools के लिए एक नाम है, लेकिन VSCode के साथ अनुचित न हो इसलिए उसे सीधे नहीं कहा गया
- development server पर VSCode remote editing की अनुमति देना असहज लगता है, और production incident के दौरान अगर यही तरीका इस्तेमाल हो तो चिंता और बढ़ जाती है
- Fly Machine के लिए custom connection बनाते समय इस संरचना की चिंता करने की जरूरत नहीं पड़ी, इसलिए लेखक के अनुसार गहरे अर्थ में यह कोई बहुत अहम समस्या नहीं थी
1 टिप्पणियां
Hacker News की राय
जिस software से 3–4 साल से छेड़छाड़ कर रहे थे, उस पर लगभग एक महीने से लंबा लेख लिखने की कोशिश कर रहे थे, लेकिन Kurt इस बात से बेचैन हो गया कि ब्लॉग पर अगस्त के बाद से कुछ भी पोस्ट नहीं हुआ, इसलिए आखिरकार सबसे सरल लेख लिखने का फैसला किया
सोच यह थी कि अब तक जो कर रहे थे उसके उलट कम-मेहनत वाला लेख लिखा जाए, और लगा कि 30 मिनट में एक लिख सकते हैं। यह तो बस उस चीज़ को लिख देना था जिससे छेड़छाड़ कर रहे थे, और शायद पढ़ने वालों से कम ही सोचा होगा
README का वाक्य “A compromised remote could use the VS Code Remote connection to execute code on your local machine.” कहीं ज्यादा स्पष्ट था, और इस security advisory के पास CVE नंबर होना चाहिए लगता है
अभी दिख रहे पहले दो लेख—McCord-Valim का FLAME-Livebook-GPU लेख और “murid” वाला यह लेख—developer की मानसिक यात्रा को ठीक से दिखाते हैं
system binaries की अनुमति भी दी जा सकती है, लेकिन इससे चीजें जटिल हो जाएंगी और VSCode को client में और ज्यादा चीजें ठूंसनी पड़ सकती हैं। मोटे तौर पर खोजने पर ssh server-side chroot options दिखते हैं, लेकिन ssh client manual में इसका खास जिक्र नहीं है
या फिर समाधान यह हो सकता है कि remote पर Docker container download किया जाए, remote directory mount करके container चलाया जाए, और फिर उस container में ssh से जुड़ा जाए
सिर्फ subdirectory files sync करने वाले तरीके की समस्या यह है कि VSCode द्वारा शुरू किए गए remote execution और debugging की भी जरूरत होती है। इसलिए plugins को भी remote access चाहिए या उन्हें remote पर चलना होगा, और कुछ code observation अगर local पर चलाए जाएं तो पूरी subdirectory को पहले से sync करने की लागत बहुत ज्यादा हो सकती है
भोला लग सकता है, लेकिन मुझे ठीक से समझ नहीं आ रहा कि यह security problem क्यों है। अगर आप किसी machine में ssh से connect कर सकते हैं और socket port forwarding कर सकते हैं, तो आपके पास वैसे भी बाकी सब कुछ करने का अधिकार है, और VSCode protocol बस उसे अपने लिए सुविधाजनक तरीके से expose करता दिखता है
मैं सोच रहा हूं कि क्या security problem यह है कि remote machine वाले ही network में मौजूद, लेकिन SSH अधिकारों के बिना कोई व्यक्ति SSH से forwarded port से connect कर सकता है। user के तौर पर VSCode का SSH system काफी अच्छा काम करता है और मुझे पसंद है
sshcommand या PuTTY से मिलने वाला SSH session नहीं हैVSCode target machine पर remote agent install करता है, ssh को transport protocol की तरह इस्तेमाल करता है, और कहता है कि वह उस transport path को user के साथ share करेगा। अगर यह केवल वही काम करे जो चाहिए, तो समस्या नहीं है, लेकिन arbitrary API expose करने वाला agent-based system, ssh के ऊपर terminal की नकल करने वाले परिचित मगर फिर भी पेचीदा तरीके की तुलना में कहीं बड़ा attack surface और risk पैदा करता है
उस connection पर चलने वाला protocol file system में घूम सकता है, arbitrary files edit कर सकता है, अपना shell PTY process शुरू कर सकता है, और खुद को persistent बना सकता है। client से remote server में ssh connect करने का मतलब यह नहीं कि वह server client पर arbitrary code चला सकता है; कम से कम client को स्पष्ट रूप से कोई action लेना होता है
हालांकि जिस अर्थ में “curl | bash” security problem है, उसी अर्थ में यह भी security problem है। और नजदीकी analogy
bashrcके अंदर curl | bash हो सकती हैagent network से जुड़ा रहता है और हमेशा चलता है, इसलिए development server firewall का hole सीधे laptop firewall का hole बन जाता है
VSCode कैसे काम करता है, जितना ज्यादा पता चलता है, उतना ही यह duct tape और JavaScript developers के दिमाग में आ सकने वाले सबसे cursed ideas से किसी तरह जोड़ा हुआ लगता है
सिर्फ SSH extension को ही देखें तो workspace URI format दो तरह के हैं। एक format में व्यावहारिक रूप से सिर्फ hostname होता है, और दूसरा hexadecimal-encoded JSON document format है; दूसरा तब इस्तेमाल होता है जब किसी खास username जैसी अतिरिक्त जानकारी चाहिए हो या hostname में uppercase letters शामिल हों
इसकी असली जरूरत इसलिए पड़ती है क्योंकि recent workspaces में save होने पर किसी वजह से यह lowercase में बदल जाता है
SSH connection server पर install किए जाने वाले extension settings को भी support करता है, लेकिन बहुत ज्यादा डाल दें तो Windows host से connect नहीं हो पाता। इन्हें CMD के जरिए command-line arguments के रूप में pass किया जाता है, और CMD में 8191-character limit है, फिर उसी CMD से PowerShell call किया जा रहा है
custom autocomplete, diagnostics वगैरह दे सकते हैं, और languages के बीच support के लिए custom Go to definition भी बना सकते हैं
अच्छा होगा अगर Microsoft मुझे कुछ महीनों के लिए hire करके किसी कोने में बैठा दे और इस अफरातफरी को सुलझाने दे
मैंने नेटवर्क, binary exploit और introductory systems programming क्लास के server चलाए हैं, और यह चीज़ बड़ी सिरदर्द है। इस बेवकूफ remote access trojan की वजह से students OpenSSH client इस्तेमाल करना समझ ही नहीं पाते
इसे ठीक करने के लिए मैंने कुछ चीज़ें आज़माईं। क्लास server के motd में लिखा कि VSCode remote server plugin न इस्तेमाल करें, और क्लास के सामने
ncdu /homeचलाकर दिखाया कि जिन students का server disk usage 100MB से ऊपर है, वे बिना exception VSCode users हैंमैंने user process limit भी 45 पर लगा दी, क्योंकि पता नहीं कैसे VSCode remote access trojan करीब 50 Node processes इस्तेमाल करता है। अगर students motd और क्लास में दी warnings ignore करते, तो limit में फँस जाते, और दोबारा connect करने के लिए उन्हें हमसे processes kill करने को कहना पड़ता
आखिर में process limit की जगह मैंने एक script लगा दी जो हर 10 सेकंड में सारे
.vscode-serverremote access trojan को kill कर देती थीजिस class में मैं TA था, उसमें एक assignment था जिसमें basic machine code process करके सीखे गए ISA के assemble/execute tools की नकल करनी थी, और students को
hexdumpजैसी चीज़ों से file की byte structure समझनी पड़ती थीलेकिन Sublime object file को “helpfully” hexdump की text representation की तरह render करता था, readability के लिए spaces जोड़ देता था, और school Linux server पर
hexdumpकरने पर दिखने वाली चीज़ से अलग endian order में दिखाता थाहर semester कुछ students यह पूछने आते थे कि
AD DE EF BEजैसी ASCII string पढ़ने के लिए लिखा code किसी अनजान text को क्यों खोज रहा है, और अक्सर उन्होंने यह verify ही नहीं किया होता था कि actual byte values 0xDE, 0xAD, 0xBE, 0xEF से शुरू होती हैंमुझे यहाँ alternative ठीक से समझ नहीं आ रहा। VSCode की SSH editing हैरान कर देने वाली तरह से अच्छी चलती है, और remote machine पर vim, nano, micro से जूझना मैंने बहुत पहले छोड़ दिया
agent बिना disturb किए चुपचाप काम करने देता है। लगभग local machine पर काम करने जैसा feel होता है, और मेरे हिसाब से यह बड़ा फायदा है
security risk हो सकता है, लेकिन development experience का कोई मुकाबला नहीं। VSCode कौन-से दूसरे editors को खत्म कर रहा है, इसकी मुझे खास परवाह नहीं; बस tool मुझे बिना बाधा काम करने दे
binaries deploy नहीं करता, pipes के जरिए bytes read/write करता है, और meaningful execution सब local पर होता है। खासकर यह persistence नहीं बनाता; “SSH से connect रहने के दौरान VSCode plugin accessible है” और “VSCode plugin हमेशा accessible है” में फर्क है
कई remotes पर काम करते वक्त उन्हें अक्सर पता नहीं होता कि वे कहाँ connected हैं या connection की state क्या है। terminal धीमा होता है और session state persistence inconsistent होती है
यह
tmuxऔर एक proper text editor इस्तेमाल करने से बहुत खराब experience है। ऊपर से server बहुत heavy है और ठीक से shut down नहीं होता, इसलिए छह-छह server instances चलते रहना भी common हैupdates में से आधे टूट जाते हैं, और actual ssh client से host में जाकर broken vscode server साफ करने का तरीका न जानने के कारण कभी-कभी एक घंटा बर्बाद हो जाता है
क्या सीखा गया? कि remote code execution मौजूद है? कि development tools पर गलत जगह रखा भरोसा अक्सर पछतावा कराता है? कि आधुनिक software design गड़बड़ है? ज़रा-सी सावधानी बरती होती तो यह सब साफ़ था
SSH 90 के दशक का समाधान है। यह कुछ features जोड़ा हुआ Telnet है, और इसे “secure” shell कहा जाता है, लेकिन यह शाब्दिक रूप से Telnet+TLS से कम सुरक्षित है
लोगों ने सोचा कि जब server पर user session वाला tunnel पहले से मौजूद है, तो applications के लिए अलग network transport और secure connection protocol बनाने की ज़रूरत नहीं है; इसलिए उन्होंने SSH के ऊपर तरह-तरह की अजीब लेकिन सराही जाने वाली चीज़ें चढ़ा दीं
यह distributed operating systems से सीखे गए concepts को छोड़ने, इस बीच विकसित advanced authentication/authorization को नज़रअंदाज़ करने, और सबसे घटिया व आसान चीज़ अपनाने का नतीजा है
ऐसा “SSH agent” बेतुका नहीं है। हम काम के लिए सही tool बनाने की दिशा में आगे नहीं बढ़े, इसलिए ऐसे मौजूदा tools में लगातार और चीज़ें ठूंसते रहे जो मूल रूप से इस इस्तेमाल के लिए design ही नहीं किए गए थे। हमें हैरान होने का नाटक करने का हक़ नहीं है
यह वही दुनिया है जो हमने बनाई है। मेहनत से या चुप सहमति से, सबने मिलकर बनाई है। SSH न भी हो तो politics, commerce, schools और बाकी हर चीज़ में भी यही है। हम हर दिन अपने ही बनाए ढेर में रहते हैं, और जिस दिन कुछ नहीं करते, उस ढेर पर एक और फावड़ा मिट्टी डाल देते हैं। हाथ में फावड़ा पकड़े हुए हम यह नाटक नहीं कर सकते कि यह चौंकाने वाला या पागलपन है
इसलिए आम तौर पर अगर outgoing HTTPS connections allow करते हैं, तो SMTP को छोड़कर सभी outgoing connections allow करना ही बेहतर है। असली malicious traffic तो वैसे भी HTTPS में tunnel होकर जाएगी, और बचा हुआ असर सिर्फ़ इतना होगा कि tunnel की जटिलता और inefficiency से बचने वाले नए protocols की deployment रुक जाएगी
काश web login भी SSH के तरीके के ज़्यादा करीब होता
कभी-कभी बाहर जाकर घास छू लेना आत्मा के लिए अच्छा होता है। और यह भी बताइए कि बेहतर SSH protocol कैसे बनाया जाए। constructive criticism के बिना शिकायत बहुत काम की नहीं होती
यहाँ “SSH agent” term confusing है। आम तौर पर इसका मतलब authentication tokens cache करने वाला daemon होता है
ऊपर से यह तरीका प्रसिद्ध macOS SSH agent को तोड़ देता है: https://github.com/maxgoedjen/secretive/issues/543
production servers पर vscode remote इस्तेमाल करना पागलपन है, इस पर मैं पूरी तरह सहमत हूँ
लेकिन बाकी features जिन्हें “बेतुका” बताया गया है, वे expected features जैसे लगते हैं
मैं MAANG में staff engineer तक पहुँचा हूँ, और मुझे लगता है कि यह level सिर्फ़ plain Vim से पाना मुश्किल होता। फिर भी देखता हूँ कि दूसरे high performers भी अब भी Vim या Emacs इस्तेमाल करते हैं
VCode, JetBrains वगैरह इस्तेमाल करने वाले अच्छे developers भी बहुत हैं, लेकिन barriers to entry खोजने, tools के magic को exploration से खोलने, और पूरी तरह open source व highly hackable community-driven projects को अहमियत देने की प्रवृत्ति इस phenomenon को features या ease of use से बेहतर समझाती है
VSCode की remote editing कितनी complex है, यह पढ़कर उल्टा VSCode कम इस्तेमाल करने का मन होता है। बस machine में ssh करके उसी machine पर मौजूद editor इस्तेमाल कर लेना चाहिए
VSCode का solution काम करता है, लेकिन न elegant है, न universally applicable, और टूटने की संभावना भी ज़्यादा है। और Emacs users से माफ़ी, लेकिन Tramp अब भी काफ़ी भयानक है और netrw भी बेहतर नहीं है
watchexec+rsyncआप किसी specific file path को watch कर सकते हैं और सिर्फ़ ज़रूरी चीज़ें exact तरीके से sync कर सकते हैं। आप अब भी local file system पर काम करते हैं, इसलिए editing delay नहीं होता, सारे local tools इस्तेमाल कर सकते हैं, और sync milliseconds में पूरा हो जाता है
local में delete की गई files को remote में भी delete कराया जा सकता है, और remote machine पर काम खत्म करने के बाद भी आपके पास हमेशा local copy बचती है। Tramp में यही हिस्सा हमेशा manual sync मांगता था। इसके अलावा यह editor-agnostic है
VS Code का यह feature—अब जब पता है कि यह असल में क्या करता है—बेचैन करता है
Copilot on किया तो toolbars और बढ़ गए, और जहाँ मैं लिखना चाहता था वहाँ text उड़कर आने लगा। Vim बस code देखने, सोचने और लिखने देता है। VSCode में flow state में जाना मुश्किल है
मेरी उम्र mid-30s है, college में emacs इस्तेमाल करता था और पहली नौकरी में vim पर switch किया। बहुत उलझे हुए Java project में IntelliJ इस्तेमाल किया, लेकिन बाकी समय vim ही इस्तेमाल करता हूँ
complex regex transformations चाहिए हों तभी कभी-कभी vim खोलता हूँ
मौजूदा remote tools के साथ काम करने के बजाय, VSCode एक comprehensive agent deploy करता है, जिसमें Node.js binary installation, VSCode frontend तक जाने वाला WebSocket connection, और व्यापक system access capabilities शामिल हैं
इस VSCode agent के पास file system browse करने, files edit करने, shell PTY processes बनाने, और खुद को persistent बनाए रखने तक की क्षमता सहित काफी व्यापक permissions होती हैं
अगर remote की है, तो dependencies के लिहाज़ से elisp Tramp हल्का है, यह समझ आता है, लेकिन मुझे आश्चर्य है कि attack surface सच में इतना अलग है क्या। यानी, पता नहीं remote Node binary के पास ऐसे permissions हैं जो मनमानी ssh commands चलाने वाले user के पास नहीं हैं
अगर मूल लक्ष्य LLM को एक temporary और disposable virtual machine की सारी चाबियाँ देना था, तो क्या इसका मतलब है कि agent द्वारा खोले गए socket की वजह से वह developer machine भी छू सकता है जिसे isolate करने की कोशिश की गई थी?
पागलपन जैसा विचार लग सकता है, लेकिन kernel खुद encryption और authentication वाला web server या कोई दूसरा protocol दे सकता है, और eBPF के ज़रिए पूरी machine को सीधे control करने दे सकता है। यह client/server remote control का बिल्कुल अलग paradigm हो सकता है
बेशक, यह Death Star के निकल जाने जितना बड़ा security hole भी हो सकता है