萌えハッカーニュースリーダー

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

出典: https://notes.volution.ro/v1/2021/01/notes/502e747f/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

それは…、状況によります!

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

Search