kubo39's blog

ただの雑記です。

D言語でFD_CLOEXECをデフォルトにする?

表題のとおりの提案をしてみたいと思った。(思っただけ)

FD継承はUNIXの伝統だが、意図しない継承によって様々なセキュリティ上の問題を引き起こしてきた。(APIデザインケーススタディとかPEP446あたり参照)

そのため最近の言語 (Perl/Go/Ruby/Python/Rustとか) では標準入出力以外はデフォルトでCLOEXECを指定し、fork-execされるタイミングでのFD継承を行わないようなデザインにしている。

Related Work

And Go/Perl also set CLOEXEC by default.

実装案

  1. AtomicにCLOEXECを設定できる場合はそうする。(ex: open(2)のO_CLOEXECフラグ)
  2. そうでない場合はfcntl(2)でO_CLOEXECを指定する。

druntimeに追加する必要があるもの

  • pipe2(2)
  • accept4(4)
  • dup3(2)
  • mkostemp(3)
  • mkostemps(3)

Phobos側で対応が必要なもの

  • druntimeに追加したものに置き換えられるものは使う
  • フラグで追加できるものはフラグ追加で対応(Linux
    • open(2)
    • socket(2)
    • socketpair(2)
    • fopen(3)
    • freopen(3)
  • だめならfcntl(2)でO_CLOEXECをセット

課題

  • Linuxや*BSDのバージョンによってサポートされているタイミングがまちまち
    • Rustのように動的にフォールバックする仕組み?

そもそもdlang forumあたりで提案されてるんじゃないかって気がしてきた、見つからなかったけど。