このフラグなしでシステム上のO_Nofollowをシミュレートする良い方法は何ですか?

StackOverflow https://stackoverflow.com/questions/2917395

質問

安全にシミュレートできるようにしたいと思います openO_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOWO_CREAT | O_WRONLY | O_APPEND | O_NOFOLLOW サポートしていないシステムについて O_NOFOLLOW. 。私は自分が求めていることをやや達成することができます:

struct stat lst;
if (lstat(filename, &lst) != -1 && S_ISLNK(lst.st_mode)) {
    errno = ELOOP;
    return -1;
}

mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
int fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW, mode);

しかし、その後、私は人種条件と、おそらくセキュリティの問題を紹介します。

私は、ユーザーだけが書くことができるダミーファイルを作成することを考えました。 touching filename, 、やっている lstat チェックしてから使用します chmod 書き終えた後(ファイルモードのビットを修正するため)、しかし、私は何か大きなものを見落とすことができます(例: filename 存在する、通常のファイルではない、またはすでに象徴的なリンクです)。

どう思いますか?

役に立ちましたか?

解決

あなたの提案にはまだ人種条件があります:

  • マロリーは、彼があなたにフォローしてほしいリンクを作成します。
  • open() とのリンク O_CREAT;
  • Malloryはリンクを通常のファイルに置き換えます。
  • あなたはあなたをします lstat() 合格するテスト(リンクではありません);
  • Malloryは、通常のファイルを再度リンクに置き換えます。

あなたはこれを以外のために修正することができますO_TRUNC 呼び出しによるケース fstat() オープンファイル記述子と同様に lstat() パス上で、そしてそれを保証します .st_dev.st_ino メンバーは同じです。

ただし、使用している場合、これは機能しません O_TRUNC - 欺ceptionを発見した頃には、手遅れです - マロリーはすでにあなたの重要なファイルの1つを切り捨てるように誘導されています。

私は、穴を排除するための伝統的な方法を信じています O_NOFOLLOW サポートは次のとおりです。

  • モードで一時ディレクトリを作成します 700. 。エラー(または再試行)if mkdir() 既存のディレクトリのために失敗します。
  • 一時ディレクトリ内で新しいファイルを作成します。
  • 使用する rename() 一時ファイルをターゲット名にアトミックに移動します。
  • 一時ディレクトリを削除します。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top