VSCodeのSSHエージェントはおかしい!
引用元:https://news.ycombinator.com/item?id=42979467
この1ヶ月、4年くらい使ってるソフトについて記事を書こうとしてたんだ。Kurtは心配してたけど、簡単なことでも書くよって言って、今までと逆のアプローチでやるつもり。30分で書ける自信ある。これはただの試行錯誤の結果を書いただけだよ。
記事のおかげで、これがおかしいとわかったけど、最初はそうは思ってなかった。エージェントの機能を列挙してたけど、むしろ逆だと思ってた。READMEにあった一文が分かりやすかったよ:>”A compromised remote could use the VS Code Remote connection to execute code on your local machine.”これはCVE番号つけるべきじゃないかな。
HNのコメントの最初の段落は、句点なしだったらもっと良かったかな。お気に入りのブログがまだ活動してて嬉しいよ。ちょっと心配してたんだ。今ある最初の二つのブログ、McCord-ValimのFLAME-Livebook-GPUと、”murid”って言葉が入ってるこの投稿は、開発者の心理的なアークを素晴らしく捉えてるね。ありがとう!
もっと低努力な投稿、お願いします!
この投稿が156コメントも生み出したのがどれだけ嬉しいか、反論することもないし、皆正しいんじゃないかな。
Emacsはviよりも良くて、スペースはタブよりも良いんだよ!!!全てのコメントに賛成のままでいるから、これを言いたかっただけ。
この二つに賛成だよ。
インデントはタブで、整列はスペースで。両方使えばいいじゃん!両方必要だよ!両方あった方がいいね。
ちなみに、Emacsはタブストップの倍数でないインデントは混合をデフォルトにしてるよ。
正直、素晴らしい投稿だし、低労力な投稿のアイデアが好きだから、これからも続けてほしいな。
sshが問題っぽい。sshでdockerのような体験をできる方法があるはず。特定のAPIを使って特定のフォルダ以外へのアクセスを防げるようにしたい。基本的にはリモートにdockerコンテナをダウンロードして、リモートディレクトリをマウントし、sshで接続するのが解決策かも。でも、全サブディレクトリを同期するだけじゃなくて、リモートでデバッグしたいから、プラグインもリモートで動かす必要がある。
普通のユーザーとしてsshするなら、そのユーザーのリモートホームディレクトリのファイルしか変更できないはず。普通のアクセスには管理者アカウントを使わない方がいいよ。
inetdやpam.dを使えば、こういうことができる方法もあるよ。
「ブログに戻ることにしたんで、これを学んだらあなたも学んでね。」これが、まさに正しい方法だね。
良い文章で面白い!真ん中に隠れたMonty Pythonの引用がある?
めっちゃ面白い!パートナーと毎週同じ会話してるよ。
あなたは確実にノードリングをカバーしたね。
VSCodeの仕組みを知れば知るほど、まるでダクトテープで繋がれたような、JS開発者の呪われたアイデアのオンパレードに思えてくるよ。特にSSH拡張で、ワークスペースURIはホスト名と16進数でエンコードされたJSON形式の二つがあって、具体的なユーザー名が必要な時やホスト名に大文字が含まれてるときに後者が使われるみたい。保存される時はなぜか小文字にされちゃうし。SSH接続ではサーバーにインストールする拡張を設定できるけど、あんまりやるとWindowsホストに接続できなくなるから注意。CMDを介してコマンドライン引数で渡してるみたいだけど、8191バイトの制限があるらしい。
VSCodeはEclipseより使いやすいと思うな。SSHをIDEで使う必要がなかったから詳しくないけど、サーバーに行く時は通常PuTTYでSSHしてViを使ってた。
リモート開発の話だよ。編集してるコードがローカルのディスクではなく、リモート環境に存在してるってわけ。
俺はsshfsが好きなんだ。それは「一つのことを、うまくやる」というアイデアを守ってると思う。多くのIDEはそれを忘れちゃってるみたいだけど。 でも、VSCodeはリモートのファイルを編集するだけじゃなくて、全てをリモートで動かしてるんだ。拡張やターミナルコマンドもそう。ウェブプロジェクトならポートを転送して、リモートホストのデバッガーを使ってもブラウザでローカルにアクセスできるのも良いよね。 そうだね、完全に仮想化されてて、ローカルマシン上で同じ環境が使えるからね。これは特に機械学習のシン・クライアントには必須だね。 sshfsはMacOSで開発してLinux向けの時には使えないよね。コードを実行したりデバッガーでステップしたりができないからさ。普段はIDEを使わずほぼsshfsで作業してるけど、ファイル編集とコード実行の違いは理解できるよ。 sshfsはinotifyや他のことを通さないから、IDEがファイルが変更されたことを知らないんだ。gitやコンパイラーの出力とかもね。VSCodeだとファイル変更をすぐに見れるから便利だよ。 それに対処するためにrcloneを使ってるよ。確かに「一つのことを徹底的にやる」ってわけじゃないけど、リモートのファイルを扱う厄介な問題をほぼ解決してくれるからね。性能もsshfsよりも良い場合が多いし。 まあ、俺もCoderやSSH、Viみたいなツールを使ってリモート作業はしてきたよ。 カスタム言語サポートとかツールをJavaScript/TypeScriptで簡単に拡張できるところが好き。補完や診断を提供したり、言語間の定義をカスタマイズできる。ただ自分の使ってるやつの方が楽しい。 >”VSCodeの仕組みを知るほど…バンドのテープだ” EclipseってJavaで書かれてないの? そうだよ。ただ、今のEclipseは昔の見た目だけだ(2002年から使ってる)。JREをバンドルしてて、インストールされてないとそれを使う。3ヶ月ごとに安定版をリリースして、起動は5秒、メモリはVSCodeより少ない600MB。ウェブ開発やC/C++、Python、リモート実行などもサポート。Git統合も素晴らしいし、C/C++ではデバッガーとも連携する。ブロートしないからサクサク動く。 Eclipseは長いこと使ってないけど(JetBrains派)、お前のコメントで久しぶりに試したくなった。ダウンロード行ったら、いろいろ聞かれて、Pythonでのウェブ開発はできないの?エラーダイアログが表示されて、Gitの使い方も分からない。やっぱり使えないと思った。 Eclipseはプラットフォームで、IDEを別々にインストールするのではない。ダウンロードしたやつがスタートポイントだ。機能は全て一つのインストールで揃ってる。PythonはPyDevで追加できる。 回答ありがとう。テクニカルサポートは求めていないけど、自分の経験を共有したくて。Eclipseの機能の使い方が、すごく使いにくいと感じる。こういう体験は自分だけじゃないと思う。 ありがとう、その意見のおかげで30分の時間を節約できた。まさに自分が覚えている通りの使いにくさだ。 確かに進化してるけど、前のイメージを壊すのは難しいよね。流れが期待とは違うけど、使えることが多いとは思うよ。ViやEMacsのために時間を使うなら、Eclipseのために使うのも十分理由になると思うし、あまり気にしてないよ。 いい感じだね。4年前にJavaでEclipseをちょっと使ってたけど、IntelliJに切り替えたら機能が豊富で使いやすかったよ。最近どうなってるのかは分からないけど。 >“独自のJREがバンドルされていて、JREがない場合はそれを使う。” いや、あくまでその時のVSCodeとの比較なんだ。毎日Vimも使ってるけど、あれはエディタだし、IDEじゃないよ。Vimとの学習曲線を比べただけで、システム要件には関係ないし。 自分は両方使ってるし、IntelliJも使ってるよ。人の使ってるツールをバカにする必要ある? 特に身近にVimを使ったことがないVS Codeユーザーはいないと思う。自分の周りはVim使いが多いから、偏りがあるかもしれないけどね。 なるほど!それならEmacsも使えるじゃん。 自分はVScodeのターミナルでVim使ってるよ。携帯からSSH接続して使うこともあるし。 VS Code無しじゃvimのバインディング使えないよね。 両方使うけど、VS Codeはサーバー上でviを使えるから便利だよね。 素朴な疑問だけど、セキュリティの問題がよくわからない。SSHでアクセスできるなら、他のこともできるって考えなんだけど。VS Codeのプロトコルが便利さを追求しているだけじゃないの? VS CodeはSSHセッションをエミュレートしてるわけじゃなく、リモートエージェントをインストールしてるんだ。ユーザーとそのエージェント間でのAPI公開が問題になるのかな? リモートシステムに対する攻撃面が増えるのは理解できるけど、エージェントがSSH経由で同じ権限を持ってるなら、どれだけリモートのリスクが増えるの? エージェントのコードがコンプロメットされると、VS Code関連のファイルが隠されることがある。最近の開発環境はnpmパッケージの管理がズサンで、危険度が増してる。 エージェントに理論的なバグがあるとして、具体的にどうやって悪用されるのか例を挙げてほしい。 リモートホストで動いてるコードが侵害される可能性はあるよね。VS Codeが人気だから攻撃ベクターとして見られがちだけど、まずはプロダクションリソースには使うべきじゃないよ。 最新のJetbrainsツールも同じようなことしてるみたいだね。サーバーをインストールして、それに接続するって。Microsoftじゃないから誰も話題にしないんじゃない? それは、JetbrainsのRemote Development Gatewayのことじゃない?クライアントでの手動インストールとサーバーでの手動インストールが必要で、普通のIntelliJ IDEの一部ではないと思うけど。 そうでもないよ。ゲートウェイは君の言ってる通りだけど、JetbrainsのIDEにも同じ機能があってサーバーに手動でインストールする必要がないんだ。VSCodeみたいに自分専用のものをインストールするし。 たまに、もっと生産的になれなかったことを悔やむけど、他の生産的な人たちのやってること見ると、俺は結構上手くやってるかもって思う。 限界まで行くと、パソコンに触れない方がいいってことになるのかな? VSCodeが提供する機能をバッシュでプログラム的に操作する方がいいのかな?機能や使いやすさに妥協はしたくないしね。カスタムエージェントを書いて特権APIにアクセスさせるのは悪手だとは思うけど、バッシュ自体もセキュリティ的には不安だし。 関係ある部分はここだね:>エージェントはポート転送されたSSHを通じて動作する。VSCodeのフロントエンドに向けてWebSockets接続を確立する。この接続の下地となるプロトコルは: つまり、サーバーがクライアントに対して何かを行えるってこと?なんだかそれは理屈が通らないな。 VSCodeリモートに関しては、VSCodeサーバーはクライアントと同じ信頼の境界にいる。リモートSSHの場合、リモートが侵害されると、VSCodeリモート接続を通じてクライアント上でコードを実行することができるんだ。詳細はこの前書いたことがあるよ:VS Code Remote DevとDev Containersはセキュリティ境界ではない。 だから最近VSCodeがリモートフォルダの作者や所有者を信じるかどうかを尋ねるようになったのか。 なるほど、コンテナを使ってnpmやyarnをサンドボックスしようと思ったけど、無駄っぽいね。npmは怖いし、Macでサンドボックスする方法があれば知りたいな。 macOSには正式なサンドボックス言語があるよ。iTerm2のビルドプロセスで初めて知ったけど、これがスタート地点になると思う。 MacOSのコンテナはLinuxのVM内で動いてるから、そのVMが必要なファイルやネットワーク以外にアクセスできないようにすればかなり安全だよ。DockerやPodmanの設定を見直して統合の制限をかけるのがベスト。VMやコンテナ内からどんなネットワークやファイルにアクセスできるか確認するのが大事だね。 リモートサーバーにSSHで接続した場合、あくまでそのサーバーからクライアントに対して任意のコードを実行することはできないはずだよ。…X11フォワーディングが無効になってるか、X11サーバーがクライアントのシステムで動いていない限りはね。 確かX11フォワーディングはオプトインなんじゃないかな?つまり、 通常、-Xを使った場合でもクライアントが信頼されないから問題にならないはずだけど、一部のディストリビューションはデフォルト設定を変更しちゃってることもあるんだよね!残念ながら、Xはもう死んでるとか言われてるから、二十年近く修正に対する関心は薄いみたい。 これまでにデフォルトでForwardX11Trustedを有効にしてるディストリビューションは見たことないんだけど、具体例ある?あまり一般的な使用ケースじゃないから、そんなことするとは思えないけど。 X11フォワーディングをオンにしてる場合、悪意のあるアプリは何ができるのかな?UIを表示するのは確実だし、スクリーンショットも取れると思う。それ以外に何かできるの?キーボードのイベントを送信するなら終わりだと思うけど。 基本的には正しいと思うよ:これはセキュリティ問題ではないけど、特定の脆弱性やセキュリティ境界を越えるわけではないからね。でも、”curl | bash”がセキュリティ問題であるのと同じようにやっぱり問題だと思う。 ”curl | bash”をサーバー側で検出することは可能だよ。詳しくは、https://news.ycombinator.com/item?id=34145799を見てみて。 自分が何をしているか理解して、信頼できるソースからであればセキュリティ問題にはならないよ。だけど、これはソフトウェアをインストールする一般的なやり方としては問題があって、信頼できないコードを実行するリスクがあるからね。クレバーなユーザーを育てる努力を妨げる可能性もあるし、一般のウェブサイトはディストリビューションの専用インフラよりも安全性が低いことが多い。 >あなたは他のことをする許可はもう持ってるよ。もちろん。でも問題は、サードパーティのエージェントがあなたの許可を使って何でもできること。あなたはそのことに気づかないかもしれない。 サードパーティのエージェントはもう自分のPCで信頼してるからね。VSCode自体がマルウェアなら、リモートマシンにSSHで接続して、背後でコマンドを実行することもできるんだ。 VSCodeはオープンソースだけど、リモートSSHエージェントはそうじゃない。 VSCodeがバイナリでインストールされていると、オープンソースとは言えないよ。 それって、ただそのマシンにログインしてコードを実行することとどう違うの? VSCodeのリモート機能は、接続したクライアント上でコードを実行できるから、侵害されたリモートサーバーがあなたのローカルマシンを攻撃できることになる。 >もしあなたがマシンにSSHで接続してソケットをポートフォワードできるなら、他のことをする許可はもう持ってる。技術的にはそうだけど、サーバーでカスタムソフトウェアスタックやリモートシェルをインストールしたりすると、いろんな状況で人やアラームが気づくことがあるよ。 多くの人は全然気づかない状況もあるよ。前の職場では、自分のお気に入りのツールを構築するためのAnsibleマニフェストをかなり書いて、会社の開発ホストで快適にリモートワークをしてて、誰も気にしなかった。もっとコメントを表示(1)
この最悪な数行。Microsoftに呼ばれて、一人でこの問題を解決したい。
>“5秒で起動して、RAMは約600MB(VSCodeより少ない!)、すごく軽快に動く。”
うん、それをEclipseのいいとこだと思ってるみたいだけど、vimと比べてて笑えるね。’/s’を忘れたんじゃない?もっとコメントを表示(2)
もっとコメントを表示(3)
ssh -X
や-Y
を使わない限り問題にはならないと思うよ。