シェルスクリプトで一時ファイルを安全に生成してアクセスする方法は?

シェルスクリプトで一時ファイルを安全に生成してアクセスする方法は?

出力を固定名ファイルにリダイレクトすることはセキュリティ上のリスクになる可能性があることを読んでいます/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つです。

  1. 一時ファイルを安全にする方法は?これが"predictablename.$RANDOM"許容される慣行ですか、それともより良い(より安全で簡単な)方法がありますか?
  2. このファイルに簡単にアクセスするか、後でスキャンしてファイルの存在を確認するにはどうすればよいですかpredictablename

ベストアンサー1

使用mktempユーティリティは、予測不可能な名前の一時ファイルを生成します。 POSIXでは標準化されていませんが、* BSDおよびLinuxで使用できます。

> /tmp/predictable.$RANDOMデフォルトでは予測可能なので、これは良いオプションではなく、攻撃者がスクリプトをだまして書き込みアクセス権を持つファイルを上書きしたり、一時ファイルへのアクセス権を付与したりする攻撃にスクリプトを公開します。これは一つです安全でない一時ファイル脆弱性。mktempファイルが安全に生成され(シンボリックリンクが含まれていても既存のファイルを上書きしない)、サービス拒否を回避するのに十分な予測不可能な名前を使用するため、この脆弱性は存在しません。

一時ファイルを作成して作業するだけでは不十分な場合は、一時ディレクトリを作成してmktemp -dその中で作業してください。

mktempまた、変数が設定されている場合は使用し、$TMPDIR設定されていない場合はその変数に戻るように注意してください。/tmp

TMPDIRますます多くのディストリビューションで、UIDがある場所などの個人用ディレクトリを設定しています/run/1234/tmp1234これにより、ユーザー間で一時ファイルを共有できなくなりますが、一時ファイルの脆弱性のリスクを排除します(時には便利ですが、頻繁ではないため、まだ利用/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の乱数ジェネレータは次のとおりです。$RANDOMLCGPIDと最初の使用時間に基づいてシードされます。 Zshは起動時にプラットフォームrandによってシードされます。 ATT KshはrandプラットフォームのPIDシードです。 Mkshはより洗練されたシードを備えたLCGですが、それでも安全な品質ではありません。これらはすべて他のプロセスによって予測され、成功の可能性が非常に高いです。

おすすめ記事