/tmp のサブディレクトリは Unix ソケットに適した場所でしょうか?

/tmp のサブディレクトリは Unix ソケットに適した場所でしょうか?

REPL を制御するために使用される Unix ドメイン ソケットを配置する安全な場所を探しています。

Linux では、移植性以外のすべての要件を満たす を使用します/run/user/$UID。それらを処理するプログラムが移植可能である必要があります。

1 つのオプションは、下のディレクトリを使用することです~が、別の問題が発生します。パスの長さの制限により、ユーザーのホーム ディレクトリが、Unix ドメイン ソケットをバインドするには深すぎるディレクトリにある可能性があります。

下のディレクトリにソケットを配置することは/tmp移植可能ですが、ディレクトリを削除すると競合状態になるのではないかと心配です。また、/tmpすべてのプラットフォームでスティッキー ビットが設定されていることを が確実に保証できるかどうかも心配です (つまり、ユーザーが他のユーザーの一時ファイルを削除したり名前を変更したりできないようにするため)。/tmpただし、 はスティッキーであると想定しています。そうしないと、非常に多くのアプリケーション ( を使用するすべてのスクリプトmkstemp) が安全ではなくなります。

現在の計画では、サーバーが に一時ディレクトリを作成し/tmp、クライアントがソケットを使用する前にそのディレクトリの所有権を確認するようにしています。これでセキュリティは十分でしょうか?

答え1

法律上標準一時ファイルの場所は環境変数で指定されますTMPDIR

この変数は、一時ファイルを作成する場所を必要とするプログラムが使用できるディレクトリのパス名を表します。

実際、多くのシステムでは定義されていませんTMPDIRデファクト一時ファイルの標準的な場所は です/tmp。 をチェックしTMPDIR、設定されていない場合は を使用してください/tmp。シェルスクリプトでは を使用できます${TMPDIR:-/tmp}が、より便利な場合は を使用できます。

if [ -z "$TMPDIR" ]; then TMPDIR=/tmp; fi

または対処するset -u

: "${TMPDIR:=/tmp}"

この場所は書き込み可能であると想定できますが、世界中で読み取り可能かつ書き込み可能である可能性もあるため、次のようになります。

  • 通常のファイルを作成するときは、既存のファイルを上書きしていないことを常に確認してください。そのファイルは、あなたのものではない可能性があります。このためにシェルのリダイレクトを使用しないでください。プログラムの実行中に攻撃者がシンボリック リンクを移動してチェックを欺く可能性があるため、所有権を個別にテストするのは安全ではありません。また、特定の名前が存在しないことを当てにすることもできません。同時実行プログラムが、直前に同じ名前のファイルを作成してサービス拒否を引き起こすのを防ぐには、ランダムな名前を使用します。ユーティリティmktemp(広く普及しており、GNU、BusyBox、BSD には存在しますが、POSIX には存在しません) またはmkstempC ライブラリ関数を使用できます。内部的には、openまたはをフラグcreatとともに呼び出す必要がありますO_EXCL
  • を使用してディレクトリを作成できますmkdir。既存のファイルを再利用しないため、所有権を詐取する不正行為に対しては安全ですが、通常のファイルと同様にサービス拒否攻撃を受ける可能性があるため、ランダムな名前を使用する必要があります。は、mktemp -dこれを行うための優れた方法です。
  • ソケットを作成できます (そのための標準シェル ユーティリティはありません)。ディレクトリの場合と同様に、所有権のトリックに対しては安全ですが、サービス拒否に対しては安全ではありません。Linuxは名前付きソケットの権限を尊重しますが、そうでない Unix バリアントもあります。これが、ソケットが通常サブディレクトリに作成される
    理由です。/tmp

サブディレクトリ/tmp(または$TMPDIR設定されている場合) を作成し、そこに名前付きソケットを作成するプログラムには、X11 サーバー、ssh-agent、gpg-agent、KDE、emacs などがあります (これは、私がこの記事を投稿しているマシン上に存在するものだけです)。おわかりのように、あなたは良い仲間と一緒です。

関連情報