セキュアに VSCode の拡張機能を利用する方法について考えてみた
経緯
一部のVSCode拡張機能に脆弱性が見つかりました。仕事で使いたい拡張機能が使えないという状況になったので、どのような形であれば比較的低リスクで使えるようになるか考えたことをまとめてみました。
- 当方、セキュリティの専門知識があるわけではないので、この方法で運用するとしても自己責任でお願いします。
脆弱性
上記のリンクの記事によると、今回発見された脆弱性は大きく2つに分けられるようです。
- 見られたくない情報が流出してしまう(ディレクトリトラバーサル)
- 端末に任意の処理を実行させられてしまう(スクリプトインジェクション)
VSCodeのRemote Developmentを利用し、ローカルにソースコードがない状況を作れば一定程度リスクを軽減できるように思われますが、2点問題が残っています。
- 拡張機能の中には、SSH接続をした際に自動でサーバー側にもインストールされるものがある。その拡張機能に今回の脆弱性があると、ソースコードがあるサーバー側でディレクトリトラバーサルやスクリプトインジェクションなどの攻撃を受ける可能性がある
- ソースコードはなくても開発環境に繋ぐためのSSHの秘密鍵がローカルにあり、これが流出する可能性が残っている
本記事では順に「これで解決できないかな」という方法を書いていきます。
ローカルにインストールした拡張機能が、自動でサーバーにもインストールされる
VSCodeの拡張機能にはテーマ設定、キーマップUIに関連するもの(UI Extensions)とスクリプトなどを実行しより複雑な操作を可能にするもの(Workspace Extensions)があり、SSH接続した際に自動でサーバー側にもインストールされるのは後者です。基本的にはuiとして動作するが場合によってはworkspaceにフォールバックする(あるいはその逆)という設定もできます。この設定は拡張機能の作者がpackage.jsonで指定するのですが、これをユーザー側の設定で上書きすることができます。"ui"として動作させ、機能しなかった場合でも"workspace"にフォールバックさせないという設定にすれば勝手にサーバー側にインストールされることはありません。逆に言うとこの設定で動作しない拡張機能は、Remote Developmentを使用して開発していたとしても、コードを解析して脆弱性がないと確認できるまではインストールを避けるべきかもしれません。
実際にGCPでVMインスタンスを立ち上げて、この拡張機能をインストールしてみます。
GCEのインスタンスを立ち上げたあと、インスタンス名をクリックすると詳細設定画面へ遷移します。下の方にスクロールするとSSH認証鍵を設定する箇所があるので、SSHの公開鍵をコピペします。
次にローカルのsettings.jsonに以下の設定を追記します。
"remote.extensionKind": {
// 元々の設定は["ui", "workspace"]なのを上書き
// https://github.com/asvetliakov/vscode-neovim/blob/master/package.json#L7
"asvetliakov.vscode-neovim": ["ui"]
}
「Remote - SSH」を利用し、先ほど作成したVMのインスタンスに接続します。コマンドパレットから「DEveloper: Show Running Extensions」を実行すると、実行中の拡張機能の一覧が表示されます。ここでリモートでもインストールされている拡張機能は「SSH: (SSHサーバーのIPアドレス)」と表示されるので、リモートにインストールされていることが分かります(スクショではIPの部分を黒塗りにしてます)。vscode-neovimは想定通りローカルにインストールされていますね。
ソースコードはなくても開発環境に繋ぐためのSSHの秘密鍵がローカルにあり、これが流出する可能性が残っている
この問題は流出した鍵のみではSSHできないよう二要素認証を設定することで対応できるのではないでしょうか。設定手順はここにある通りなので割愛します。30秒ごとに3回までしかログイン試行できないようにするなど、総当たり攻撃の対策もできます。
ログイン試行回数の上限を設けたとしても、デタラメに入力した値がたまたま正しい暗証番号である可能性は0ではありません。このリスクをどう捉えるか次第ですが、開発端末のファイアウォールを設定してSSHサーバー(なり他のホワイトリストに登録した端末)にのみアクセスできるよう制限をかけても良いかもしれません。
まとめ
- 今回の脆弱性に限らずVSCodeのRemote Developmentで一定程度セキュリティリスクは低減できる
- SSH接続で自動でリモート先にも拡張機能がインストールされてしまう挙動は設定で変更できる
- SSHでも二要素認証ができる
参考資料
- https://snyk.io/blog/vulnerable-visual-studio-code-extensions-marketplace/
- https://code.visualstudio.com/docs/remote/remote-overview
- https://code.visualstudio.com/api/advanced-topics/remote-extensions
- https://www.digitalocean.com/community/tutorials/how-to-set-up-multi-factor-authentication-for-ssh-on-ubuntu-18-04
Discussion