Pythonのtarfileモジュールにおけるパストラバーサルバグを理解する

2022年10月03日発行
by Laura Verheyde
ケーススタディ

Pythonのtarfileモジュールにおけるパストラバーサルバグを理解する

2022年10月03日発行
by Laura Verheyde
リソースを見る
リソースを見る

最近、セキュリティ研究者のチームが、Pythonのtarファイル抽出機能における15年前のバグを発見したと発表しました。この脆弱性は2007年に初めて公開され、CVE-2007-4559として追跡されました。Pythonの公式ドキュメントに注意書きが追加されましたが、バグそのものは未パッチのままでした。

この脆弱性は、何千ものソフトウェアプロジェクトに影響を与える可能性がありますが、多くの人がこの状況や対処法についてよく知らないままです。そのため、このたび Secure Code Warriorこの脆弱性がどのような影響を及ぼすかを実際に体験し、この根強いバグのメカニズムを理解することで、あなたのアプリケーションをより良く保護することができます。

今すぐシミュレーションミッションを体験してください。

脆弱性:tarファイル抽出時のパストラバーサル

パスまたはディレクトリのトラバーサルは、未分析のユーザー入力がファイルパスの構築に使用された場合に発生し、攻撃者がファイルへのアクセスや上書き、さらには任意のコードを実行することを可能にします。 

この脆弱性は、Pythonのtarfileモジュールに存在します。tar(テープアーカイブ)ファイルは、アーカイブと呼ばれる1つのファイルです。これは、複数のファイルをそのメタデータとともにパッケージ化したもので、通常、.tar.gzまたは.tgzという拡張子を持っていることで認識されます。アーカイブ内の各メンバーはTarInfoオブジェクトで表すことができ、ファイル名、変更時間、所有者などのメタデータを含んでいます。

リスクは、アーカイブが再び取り出される可能性があることに起因する。

展開する際、各メンバーには書き込むためのパスが必要です。この場所は、ベースパスとファイル名を結合することで作成される。 

Pythonのスニペット のスニペットです。


このパスが作成されると、そのパスは tarfile.extractまたは tarfile.extractall関数に渡され,抽出が行われます。 

Pythonのスニペット のスニペットです。

ここで問題となるのは、ファイル名のサニタイズが行われていないことです。攻撃者は、ドット・スラッシュ(../)のようなパス・トラバーサル文字を含むようにファイル名を変更し、ファイルが意図したディレクトリの外にトラバースして、任意のファイルを上書きすることができます。これは最終的にリモートでのコード実行につながり、悪用される可能性があります。 

この脆弱性は、特定する方法を知っていれば、他のシナリオでも出現します。Python の tar ファイルの取り扱いに加えて、zip ファイルの抽出にも脆弱性が存在します。これは、Python 以外の言語でも顕在化しているzip slip 脆弱性のような別の名前で知られているかもしれません!

ミッションへのリンク 

リスクを軽減する方法は?

この脆弱性は何年も前から知られていたにもかかわらず、Pythonのメンテナは、抽出機能が想定通りに動作していると考えています。この場合、"バグではなく、機能だ "と言う人もいるかもしれません。残念ながら、開発者は未知のソースからtarやzipファイルを展開することを常に避けることはできません。安全な開発手法の一部として、パストラバーサル脆弱性を防ぐために信頼できない入力をサニタイズすることは、開発者次第です。

Pythonで安全なコードを書き、リスクを軽減する方法についてもっと知りたいですか?

Pythonの課題を無料でお試しいただけます。

コーディングガイドラインを無料で入手したい場合は、Secure Code Coachをチェックして、セキュアコーディングの実践に役立ててください。

リソースを見る
リソースを見る

著者

ローラ・ベルヘイデ

Laura Verheyde はSecure Code Warrior のソフトウェア開発者で、脆弱性のリサーチとMissions および Coding labs のコンテンツ作成に注力している。

もっと知りたい?

セキュアコーディングに関する最新の知見をブログでご紹介しています。

当社の豊富なリソースライブラリは、安全なコーディングアップスキルに対する人間的なアプローチを強化することを目的としています。

ブログを見る
もっと知りたい?

開発者主導のセキュリティに関する最新の研究成果を入手する

ホワイトペーパーからウェビナーまで、開発者主導のセキュアコーディングを始めるために役立つリソースが満載のリソースライブラリです。今すぐご覧ください。

リソース・ハブ

Pythonのtarfileモジュールにおけるパストラバーサルバグを理解する

2022年10月03日発行
Laura Verheyde 著

最近、セキュリティ研究者のチームが、Pythonのtarファイル抽出機能における15年前のバグを発見したと発表しました。この脆弱性は2007年に初めて公開され、CVE-2007-4559として追跡されました。Pythonの公式ドキュメントに注意書きが追加されましたが、バグそのものは未パッチのままでした。

この脆弱性は、何千ものソフトウェアプロジェクトに影響を与える可能性がありますが、多くの人がこの状況や対処法についてよく知らないままです。そのため、このたび Secure Code Warriorこの脆弱性がどのような影響を及ぼすかを実際に体験し、この根強いバグのメカニズムを理解することで、あなたのアプリケーションをより良く保護することができます。

今すぐシミュレーションミッションを体験してください。

脆弱性:tarファイル抽出時のパストラバーサル

パスまたはディレクトリのトラバーサルは、未分析のユーザー入力がファイルパスの構築に使用された場合に発生し、攻撃者がファイルへのアクセスや上書き、さらには任意のコードを実行することを可能にします。 

この脆弱性は、Pythonのtarfileモジュールに存在します。tar(テープアーカイブ)ファイルは、アーカイブと呼ばれる1つのファイルです。これは、複数のファイルをそのメタデータとともにパッケージ化したもので、通常、.tar.gzまたは.tgzという拡張子を持っていることで認識されます。アーカイブ内の各メンバーはTarInfoオブジェクトで表すことができ、ファイル名、変更時間、所有者などのメタデータを含んでいます。

リスクは、アーカイブが再び取り出される可能性があることに起因する。

展開する際、各メンバーには書き込むためのパスが必要です。この場所は、ベースパスとファイル名を結合することで作成される。 

Pythonのスニペット のスニペットです。


このパスが作成されると、そのパスは tarfile.extractまたは tarfile.extractall関数に渡され,抽出が行われます。 

Pythonのスニペット のスニペットです。

ここで問題となるのは、ファイル名のサニタイズが行われていないことです。攻撃者は、ドット・スラッシュ(../)のようなパス・トラバーサル文字を含むようにファイル名を変更し、ファイルが意図したディレクトリの外にトラバースして、任意のファイルを上書きすることができます。これは最終的にリモートでのコード実行につながり、悪用される可能性があります。 

この脆弱性は、特定する方法を知っていれば、他のシナリオでも出現します。Python の tar ファイルの取り扱いに加えて、zip ファイルの抽出にも脆弱性が存在します。これは、Python 以外の言語でも顕在化しているzip slip 脆弱性のような別の名前で知られているかもしれません!

ミッションへのリンク 

リスクを軽減する方法は?

この脆弱性は何年も前から知られていたにもかかわらず、Pythonのメンテナは、抽出機能が想定通りに動作していると考えています。この場合、"バグではなく、機能だ "と言う人もいるかもしれません。残念ながら、開発者は未知のソースからtarやzipファイルを展開することを常に避けることはできません。安全な開発手法の一部として、パストラバーサル脆弱性を防ぐために信頼できない入力をサニタイズすることは、開発者次第です。

Pythonで安全なコードを書き、リスクを軽減する方法についてもっと知りたいですか?

Pythonの課題を無料でお試しいただけます。

コーディングガイドラインを無料で入手したい場合は、Secure Code Coachをチェックして、セキュアコーディングの実践に役立ててください。

弊社製品や関連するセキュアコーディングのトピックに関する情報をお送りする許可をお願いします。当社は、お客様の個人情報を細心の注意を払って取り扱い、マーケティング目的で他社に販売することは決してありません。

フォームを送信するには、「Analytics」のCookieを有効にしてください。完了したら、再度無効にしてください。