Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go の Language Server はセキュアに動かせる

Avatar for Shoki Hata Shoki Hata
October 31, 2026
1

Go の Language Server はセキュアに動かせる

2026-11-01 kyoto.go リモートLT会

Avatar for Shoki Hata

Shoki Hata

October 31, 2026

Transcript

  1. リモートの差分に対して Language Server を動かしている 詳しくは - リモートの pull request の差分で

    Language Server を動かすときに考えること (https://sho-hata.com/articles/202610/a56x2nsjsgjn) https://github.com/sho-hata/crit のソースコード
  2. コードを実行しないとコード解析ができない理由 (ざっくり) - ビルド定義そのものがプログラムになっている - - コンパイル時にコードが走る言語機能がある - - Swift

    の Package.swift:コンパイルして実行し、その出力からパッケージ構成を得る Rust の proc macro 、 build.rs メソッドやクラスを実行時に定義できる言語だと実行しないとわからない - Ruby:ruby-lsp は Rails アプリに対して rails runner を常駐させ、実際の状態を問い合わせている
  3. Go はレビュー対象ツリーのコードを実行しない設計になって いる - ビルド定義 - - コンパイル時実行 - -

    依存は import 文と go.mod という宣言的なデータだけで、ビルドスクリプトがない マクロがなく、コード生成( go generate)はビルドとは別の明示的なコマンドに分けている 動的性 - 静的型付きで、ソースから構造が決まる
  4. Go のセキュリティに関する決定 https://go.dev/doc/security/decisions >Building an attacker-controlled program should be safe,

    even when running it is not. 攻撃者が制御するプログラムの構築は、その実行が安全でなかったとしても、安全であるべきだ -> 攻撃者が書いたプログラムでも、実行は危険でもビルドは安全であるべきだとしている
  5. 決定の背景 go get は他人のリポジトリを取ってきてビルドする道具で、「ビルドしても何も起きない」ことを前提にしていた 2018 年、#cgo に -fplugin を書くと go

    get だけで任意のコードが動く脆弱性( CVE-2018-6574)が報告さ れた go get は任意のコードを実行するためのものではなく、ビルドに関する安全性をセキュリティポリシーとし、悪 意あるモジュールが go build で任意のコードを実行できれば、それは脆弱性として非公開で修正される とし た
  6. - go generate - 任意のコマンドを書ける仕組みをあえて go build から切り離し、開発者が明示的に叩いたとき だけ動くようにした -

    Go toolchain - 実行されるバイナリを選べる範囲を golang.org/toolchain モジュールとして公開された公式 ツールチェーンだけに限り、 checksum database で中身を検証してから使う