信頼できないtarファイルを安全に抽出するにはどうすればよいですか?


30

tarファイルを抽出して、抽出されたすべてのファイルが特定のプレフィックスディレクトリの下に配置されるようにします。tarファイルが外部ディレクトリに書き込もうとすると、抽出が失敗します。

ご想像のとおり、これは信頼できないtarファイルを安全に抽出できるようにするためです。

GNUでこれを行うにはどうすればよいtarですか?

私は思いついた:

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

しかし、これが十分に妄想的であるかどうかはわかりません。


2
妄想だけでは不十分です。過去に、作成したシンボリックリンクを介して上昇した、厄介なtarballをいくつか作成しました。最終的に、chroot( "。")を実行して特権をドロップできるように、setuid-rootである独自のtarを作成しました。
ジョシュア

8
@Joshuaだから、非常に広くテストされたユーティリティをより安全にするためのソリューションは、独自のバージョンを作成してルート権限を与えることでしたか?
停止ハーミングモニカ

4
@OrangeDog:int main(int argc、char ** argv){chroot( "。")|| exit(1); setuid(getuid()); 監査が簡単です。
ジョシュア

2
-tオプションを使用して、tarファイル内の内容を調べることもできます。
トーマス

回答:


40

パラノイアはまったく必要ありません。GNU tar-実際には任意のよく書かれたtar過去30年かそこらで作成したプログラムは-スラッシュで始まるか、含まれているtarballにファイルを抽出することを拒否します..デフォルトでは、要素を。

最新のtarプログラムにこのような悪意のある可能性のあるtarball を強制的に抽出させるには、邪魔をtarする必要があり-Pます。GNUとBSDの両方で、この保護を無効にするオプションが必要です。GNU tarマニュアルのセクションAbsolute File Namesを参照してください。

-P他にフラグが、しかし¹、POSIXによって指定されていないtarプログラムは、これに対処する様々な方法を有することができます。たとえば、Schily Toolsのstarプログラム-/、と-..を使用してこれらの保護を無効にします。

ナイーブtarコマンドに追加することを検討-Cできるのは、安全な一時ディレクトリにあるものを強制的に抽出するフラグだけです。したがって、cd最初にそこに移動する必要はありません。


サイド

  1. 技術的にtarは、これはPOSIXによってまったく指定されていません。彼らは、Unixコンピューティングの世界paxに、tarとの代わりに今すぐ使用すべきだと伝えようとしましたcpioが、コンピューティングの世界はそれらをほとんど無視しました。

    ここで重要なのは、POSIXの仕様でpaxは、先頭のスラッシュや埋め込み..要素をどのように処理すべきかを述べていないことです。BSDには埋め込みパス要素に対する保護を抑制する非標準の--insecureフラグがありますが、先行スラッシュに対するデフォルトの保護は明らかにありません。BSDのマニュアルページでは、絶対パスリスクに対処するための置換ルールの作成を間接的に推奨しています。pax..pax-s

    これは、デファクトスタンダードがほとんど無視されている間にデファクトスタンダードが引き続き使用されている場合に発生する一種のことです。


7
pax - portable archive interchangeAwww、POSIXはおそらく最も広く使われているアーカイブ形式を置き換えると考えています:P
cat

1
@catデフォルトのアーカイブ形式は、かなり広くサポートされているtarバリアントです(AIUIはcpio形式もサポートすることになっています)。tarのコマンド引数の処理は...風変わりであるため、Paxはむしろ、そのようなアーカイブを処理するためのコマンドインターフェイスを置き換える試みです。
Random832

ランダムなサイドノート:「de jure」ではなく「de jour」、つまりフランス語の単語だと確信しています。
ファンドモニカの訴訟

7
@QPaysTaxesではありません。de jureはラテン語であり、現在の状況、つまり事実上とは対照的です。De jourは、フランス語の文法規則に従うためにdu jourであるべきです。
プライム

1
これは、不運な誤った同族の場合です。フランスの「du jour」(「今日の」)は、ラテン語の「de jure」(「法の」)によく似て/聞こえますが、ここでは「de facto」(「ofの」)と対照的です。paxは「今月の標準」または「標準デュジュール」であり、新しい標準が頻繁に提案されていることをからかう一方で、膨大な数のユーザーは単に自分に合ったもの(事実上の標準)に留まると主張することができます。 (比ically的に)明日、彼らが無視する新しい基準があることを知っている。
モンティハーダー

19

GNU tarを使用すると、単純に

tar -xvf untrusted_file.tar

空のディレクトリ。GNU tar /は、--absolute-namesオプションで明示的に指示されない限り、抽出時に先頭のメンバー名を自動的に削除します。また、GNU tarは、使用により../ファイルがトップレベルディレクトリの外に抽出されることを検出し、それらのファイルを代わりにトップレベルディレクトリに配置します。たとえば、コンポーネントfoo/../../bar/quxbar/quxトップレベルディレクトリbar/quxの親ではなくトップレベルディレクトリに。GNU tarはまた、例えばトップレベルのディレクトリ、外指すシンボリックリンクの世話をするfoo -> ../..foo/bar発生しませんbarトップレベルのディレクトリ外に抽出されます。

これは(十分に最近のバージョンの)GNU tar(および* BSD tarやBusyBox tarなどの他の実装)にのみ適用されることに注意してください。他のいくつかの実装には、そのような保護がありません。

シンボリックリンクのため、使用する保護は十分ではありません。アーカイブには、ツリー外のディレクトリを指すシンボリックリンクが含まれ、そのディレクトリ内のファイルが抽出される可能性があります。メンバー名だけに基づいてその問題を解決する方法はありません。シンボリックリンクのターゲットを調べる必要があります。

すでにシンボリックリンクが含まれているディレクトリに展開する場合、保証が適用されなくなる可能性があることに注意してください。


6

いくつかのポイントをカバーするために、他の答えにはありません:

  1. まず、ファイルを展開する前に、ファイルの内容を確認します。

    tar -tvf untrusted_tar_file.tar
    

    そこに信頼できない、または抽出したくないものがある場合は、tarballを抽出しないでください。

  2. 次に、tarballを展開する1つのディレクトリへの書き込みアクセス権のみを持つ非rootユーザーとしてtarballを展開します。たとえば、非rootユーザーのホームディレクトリ内からtarballを抽出します。

4
1.バッチ操作には実用的ではありません。2.カスタムセットアップを実行していない限り、すべてのユーザーが特定の場所、特に/ tmp /に書き込むことができます
パイプ

@pipeは、ディレクトリと新しいユーザーを作成し、そのユーザーのみがそのディレクトリのみにアクセスできるようにしてから、コマンドを実行します。ホームディレクトリがとても気に入っています。ありがとうございます。

2
なぜ、神の良い地球上@pipeあなたが考えEVER合格信頼されていないバッチ操作を介してデータを?信頼できない場合は、無人で実行しないでください。
アンドリューヘンレ

6
@AndrewHenleオム、わかりました。インターネット上のすべてのサーバーはどのように機能すると思いますか?stackexchangeの誰かが手動で操作を監視しながら、データベースとマークアップシステムを介してこのコメントを実行すると思いますか?この入力はバッチ操作による信頼できないデータであるためです。
パイプ

信頼できないファイルをホームディレクトリに直接抽出することはお勧めしません。.bashrcやその他の.config /ファイルを上書きしたくないでしょうか?
Hugal31
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.