github.com/cli/safeexec パッケージを使った外部コマンドの安全な起動
Hugo v0.79.1 のリリースノートを見て気づいたのだが, GitHub が自身のコマンドライン・ツール用に github.com/cli/safeexec パッケージを公開している。
これは os/exec
標準パッケージ内の exec
.LookPath()
関数を置き換えるもので
import (
"os/exec"
"github.com/cli/safeexec"
)
func gitStatus() error {
gitBin, err := safeexec.LookPath("git")
if err != nil {
return err
}
cmd := exec.Command(gitBin, "status")
return cmd.Run()
}
てな感じに使うようだ。
以前に Zenn で紹介したが
Windows 環境で os/exec
標準パッケージを使って外部コマンドをする際,パスなしのコマンド名を指定するとカレントにある同名の実行モジュールが優先的に起動されてしまう。
このブログでは CVE-2020-27955 の脆弱性として紹介している。
【2022-08-03 追記】
Go 1.19 で os/exec
標準パッケージの挙動が変わり,パスなしコマンド指定時にカレントフォルダの同名実行モジュールを起動しなくなった。
詳しくは以下を参照のこと。
os/exec
標準パッケージを使って外部コマンドを起動している場合は github.com/cli/safeexec パッケージで LookPath()
関数を置き換えることを検討するのもいいだろう。
なお,この問題は既に以下の issue として上がっているようだ(特に10月下旬辺りからの議論)。
どうなることやら。
ブックマーク
- Go パッケージ/モジュールの依存関係可視化ツール Depm v0.3.0 をリリースした : 拙作では github.com/cli/safeexec パッケージ と同じような方針で
exec
.LookPath()
関数の問題を回避している
参考図書
- プログラミング言語Go
- アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
- 丸善出版 2016-06-20 (Release 2021-07-13)
- Kindle版
- B099928SJD (ASIN)
- 評価
Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら。