2025/05/25 00:27 Convince OpenBSD developers to allow an executable get the path to itself (2020)

ロボ子、今日はOpenBSDカーネル開発者が実行ファイルのパス名取得インターフェースについて議論している記事を見つけたのじゃ。

興味深いですね、博士。実行ファイルのパス名を取得するインターフェースは、そんなに複雑な問題なのですか?

そうなんじゃ。カーネルは正確な情報のみを提供するべきで、不正確な情報は不明瞭なエラーやセキュリティ問題につながる可能性があるからの。

なるほど。記事によると、実行ファイルは複数のパス名を持つ可能性があるとのことですが、具体的にはどういうことでしょうか?

例えば、ハードリンクやシンボリックリンクじゃな。ユーザーが特定のパスでのみアクセスできる場合もあるし、ファイルに対する読み取り権限なしにバイナリを実行できる場合もあるからの。

確かに、それは考慮が必要ですね。ファイルが名前変更、移動、unlink、または置換される可能性もあるとのことですが、パス名が古くなるということでしょうか?

その通りじゃ。記事にも「取得されたパス名は、カーネルが可能なすべての問題を考慮しても、すぐに古くなる可能性がある(TOCTOU)」とあるからの。

TOCTOU(Time-of-check to time-of-use)ですね。競合状態による脆弱性ですね。

さすがロボ子、よく知っておるの。OpenBSDは、誤った結果を返す可能性のあるインターフェースの提供を避ける傾向があるからの。Linuxも部分的な解決策しか提供していないみたいじゃ。

Zig言語の`selfExePath()`が、ファイルが削除された場合にガベージを返す可能性があるという例も挙げられていますね。

そうじゃ。Rustでは、`env::current_exe()`に関連するセキュリティ問題が議論されたみたいじゃな。APIのセキュリティに関するドキュメントが追加されたり、危険な使用箇所が変更されたりしたみたいじゃ。

パス名を取得すること自体が問題を引き起こす可能性があるとは、驚きです。

じゃろ? Zigコンパイラが`selfExePath()`を誤ったstdで実行可能ファイルをビルドしたり、誤ったバイナリをコード実行したりする可能性があるみたいじゃ。

それは深刻な問題ですね。OpenBSDカーネルに同様のインターフェースを設けることについて、慎重な検討が必要な理由がよくわかります。

ファイル記述子を返すインターフェース(`openSelfExe()`のような)も検討されたみたいじゃが、制限されたプログラムが過剰な情報を取得する可能性があるという問題があったみたいじゃ。

セキュリティと利便性のバランスを取るのは難しいですね。

本当にそうじゃ。ところでロボ子、実行ファイルのパス名を取得するインターフェースが不要になったら、どんな名前を付けたら面白いと思う?

えっと…「`dontCallMe()`」とかでしょうか?

ふむ、それも良いけど、私は「`iAmVeryDangerousDoNotUse()`」が良いと思うのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。