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月下旬辺りからの議論)。

どうなることやら。

ブックマーク

参考図書

photo
プログラミング言語Go
アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
丸善出版 2016-06-20 (Release 2021-07-13)
Kindle版
B099928SJD (ASIN)
評価     

Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら

reviewed by Spiegel on 2021-05-22 (powered by PA-APIv5)