私は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にはありません)、またはmkstemp
Cライブラリ機能を使用できます。後ろにはopen
まだcreat
フラグで呼び出す必要がありますO_EXCL
。 - を使用してディレクトリを作成できます
mkdir
。これにより、既存のファイルを再利用しないため、所有権のなりすましを防ぐことができますが、通常のファイルのようにサービス拒否が発生しやすいので、任意の名前を使用する必要があります。mktemp -d
これを行うには良い方法です。 - ソケットを作成できます(標準シェルユーティリティはありません)。ディレクトリの場合と同様に、所有権のなりすましから保護しますが、サービス拒否は防止しません。
Linuxは名前付きソケットに対する権限を尊重しますが、一部のUnixバリアントではそうではありません。これが/tmp
ソケットが通常サブディレクトリに生成される理由です。
/tmp
サブディレクトリ(または設定されている場合)を生成し、名前付き$TMPDIR
ソケットを生成するプログラムには、X11サーバー、ssh-agent、gpg-agent、KDE、emacsなどが含まれます。 (これは私が投稿したコンピュータに存在するプログラムです。)ご覧のとおり、あなたは良い友達になります。