
出力を固定名ファイルにリダイレクトすることはセキュリティ上のリスクになる可能性があることを読んでいます/tmp
。攻撃者(または悪意のある人)がスクリプトを/tmp/tmpfileformyscript.tmp
実行したときにファイルが生成されたことに気付いた場合(彼が私のファイルへの読み取りアクセス権を持っていない場合でも)script)、例えば彼は私がln -s ~wildcard/.bashrc /tmp/tmpfileformyscript.tmp
スクリプトを実行したときに私のファイルが破壊されるようにするするシンボリックリンクを作成できます。.bashrc
だから私はそのようなものを使うことができますfilename="tmpfile.tmp.$RANDOM" ; echo outputtext > "$filename"
。
しかし、時にはキャッシュにtmpファイルを使用したい場合がありますが、この場合、「tmpfile.tmp.*」がその中に一致するものがあるかどうかを知りたい/tmp
場合は、新しいファイルを作成する代わりにそのファイルを使用します。残念ながら、私が知っている限り、test
その機能はファイルグロービングをサポートしていません。[ -f filename ]
だから私の質問は2つです。
- 一時ファイルを安全にする方法は?これが
"predictablename.$RANDOM"
許容される慣行ですか、それともより良い(より安全で簡単な)方法がありますか? - このファイルに簡単にアクセスするか、後でスキャンしてファイルの存在を確認するにはどうすればよいですか
predictablename
?
答え1
使用mktemp
ユーティリティは、予測不可能な名前の一時ファイルを生成します。 POSIXでは標準化されていませんが、* BSDおよびLinuxで使用できます。
> /tmp/predictable.$RANDOM
デフォルトでは予測可能なので、これは良いオプションではなく、攻撃者がスクリプトをだまして書き込みアクセス権を持つファイルを上書きしたり、一時ファイルへのアクセス権を付与したりする攻撃にスクリプトを公開します。これは一つです安全でない一時ファイル脆弱性。mktemp
ファイルが安全に生成され(シンボリックリンクが含まれていても既存のファイルを上書きしない)、サービス拒否を回避するのに十分な予測不可能な名前を使用するため、この脆弱性は存在しません。
一時ファイルを作成して作業するだけでは不十分な場合は、一時ディレクトリを作成してmktemp -d
その中で作業してください。
mktemp
また、変数が設定されている場合は使用し、$TMPDIR
設定されていない場合はその変数に戻るように注意してください。/tmp
TMPDIR
ますます多くのディストリビューションで、UIDがある場所などの個人用ディレクトリを設定しています/run/1234/tmp
。1234
これにより、ユーザー間で一時ファイルを共有できなくなりますが、一時ファイルの脆弱性のリスクを排除します(時には便利ですが、頻繁ではないため、まだ利用/tmp
可能ですが使用できませんTMPDIR
)。
繰り返し可能なファイル名が必要な場合は、ユーザーのホームディレクトリに明確に定義された名前(任意のコンポーネントなし)でファイルを作成します。現代の実践はXDGユーザーディレクトリ仕様。データを失わずにファイルを削除できる場合は、XDG_CACHE_HOME
デフォルト値が~/.cache
。
CACHE_DIR="${XDG_CACHE_HOME:-"$HOME/.cache"}"/Wildcard-scripts
[ -d "$CACHE_DIR" ] || mkdir -p -- "$CACHE_DIR"
CACHE_FILE="$CACHE_DIR/tmpfileformyscript"
¹32767の可能な値だけが必要であるだけでなく、多くの値を試すことなく簡単に予測できます。Bashの乱数ジェネレータは次のとおりです。$RANDOM
LCGPIDと最初の使用時間に基づいてシードされます。 Zshは起動時にプラットフォームrand
によってシードされます。 ATT Kshはrand
プラットフォームのPIDシードです。 Mkshはより洗練されたシードを備えたLCGですが、それでも安全な品質ではありません。これらはすべて他のプロセスによって予測され、成功の可能性が非常に高いです。
答え2
mktempはこの目的のために設計されています。マニュアルページから:
TMPFILE=`mktemp /tmp/example.XXXXXXXXXX` || exit 1
echo "program output" >> $TMPFILE
mktemp はファイルを生成するか、ゼロ以外の終了状態で終了します。論理 OR(||) は、mktemp がファイルを生成できない場合、スクリプトが終了するようにします。このコマンドを実行すると、ファイルが利用可能かどうかを確認できます。もう一度確認する必要はありません。追加する唯一のことは、スクリプトの最後にファイルをクリーンアップすることです。
これは、スクリプトがシグナルによって終了する場合でも同様です。それが必要かどうかは、あなたが決める必要があります。
どちらもコマンドを使用して実行できますtrap
。