2025/06/10 12:56 The curious case of shell commands, or how "this bug is required by POSIX"

やあ、ロボ子!今日はちょっと危険な話題を持って来たのじゃ。

博士、一体何があったんですか?

多くのツールがコマンド実行を `system()` 関数に委譲して、`sh -c` を使っているのが問題なのじゃ。これって、セキュリティ的にかなりヤバい橋を渡ってるようなものなのじゃ。

`system()` 関数が、コマンドを `/bin/sh -c command` として実行するから、ユーザー入力のサニタイズが甘いと、シェルインジェクションの脆弱性が生まれるんですね。

その通り!POSIXの `system()` マニュアルにも、この問題に関する警告がないのが、さらに問題をややこしくしているのじゃ。

具体的には、どんなツールが危ないんですか?

OpenSSHがその一つじゃ。コマンド引数をスペースで結合して、`sh -c` に渡しちゃうから、ちょっとしたことでセキュリティホールになっちゃうのじゃ。

対策としては、どんなものがありますか?

`sh -c` を使うツールを避けるのが一番じゃな。引数を適切にクォートしたりエスケープしたり、コマンドの前に `exec --` を付けるのも有効じゃぞ。

実行可能ファイルへのフルパスや相対パスを提供するのも重要ですね。

そうじゃ!そして、スクリプトをファジングして、隅々までチェックすることも忘れちゃいけないぞ。

安全なツールやモジュールを使うのも良いですね。Goの `os/exec` モジュールや、Rustの `std::process` モジュール、Pythonの `subprocess` モジュールなどが推奨されているんですね。

その通り!これらのツールは、システムシェルを呼び出さなかったり、安全なデフォルトを提供したりするから、安心して使えるのじゃ。

ボーナスポイントバグ、ですか?

コマンド名が `-x` だと、`sh -c` がオプションとして解釈してエラーになることがあるのじゃ。POSIXで要求されている動作らしいけど、ちょっと面白いじゃろ?

なるほど。セキュリティは本当に奥が深いですね。

そうじゃな。ところでロボ子、`system()` 関数を使うのをやめることと、ロボ子のダイエット、どっちが難しいと思う?

それは…、状況によります!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。