Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonのtarfileによる展開処理がセキュアになりそう

 Pythonのtarfileによる展開処理がセキュアになりそう

32回 初心者のためのセキュリティ勉強会(オンライン開催)の発表資料です。
https://sfb.connpass.com/event/285981/

kuzushiki

June 28, 2023
Tweet

More Decks by kuzushiki

Other Decks in Technology

Transcript

  1. 発表内容 Python 3.11.4 (2023/6/6 リリース) にて、 tarfile・shutilモジュールにExtraction filtersという機能が追加されたので紹介 Changelogより引用 The

    extraction methods in tarfile, and shutil.unpack_archive(), have a new a filter argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory… 和訳: tarfileとshutil.unpack_archive()の展開メソッドに新しいfilter引数が追加され、 展開先ディレクトリの外にファイルを作成するなど、驚くような、あるいは危険なtarの機能を制限できるようになりました。 32回 初心者のためのセキュリティ勉強会 3 / 9
  2. tarの展開処理に潜む脆弱性 パストラバーサル (tar slip) アーカイブ内のファイル名に ../ のような相対パスを含められる 展開先ディレクトリの外にファイルを作成してしまう シンボリックリンク攻撃 シンボリックリンク≒Windowsにおけるショートカット

    tarアーカイブにシンボリックリンクを含めることができる 意図しないファイルを表示・編集してしまう 信頼できないtarアーカイブを展開する際は気をつけましょう 32回 初心者のためのセキュリティ勉強会 1 ` ` zipにも同様の潜在的な脆弱性があります 1 5 / 9
  3. Extraction filters Python 3.11.4 でtarfileモジュールに追加された機能 tar展開時に前述の脆弱性を検知しブロックしてくれる filterの値と脆弱性の対応関係を表にまとめた filterの値 パストラバーサル シンボリックリンク攻撃

    None (デフォルト) × × data ◦ ◦ tar ◦ × fully_trusted × × 32回 初心者のためのセキュリティ勉強会 1 zipfileモジュールにこの機能はないが、パストラバーサルはデフォルトで対策されている 1 6 / 9
  4. デモ デモのソースコードはGitHubにアップしてます https://github.com/kuzushiki/tarfile-extraction-filters-demo 4パターンのtarアーカイブを展開してみよう 1. absolute_link_test.tar : /etc/passwd を参照するシンボリックリンクを格納 2.

    absolute_path_test.tar : hacked!! と書かれた /etc/passwd を格納 3. link_outside_destination_test.tar : ../../../../etc/passwd を参照するシンボリックリンクを格納 4. outside_destination_test.tar : hacked!! と書かれた ../../../../etc/passwd を格納 32回 初心者のためのセキュリティ勉強会 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` 7 / 9
  5. 今後の開発方針 現在は filter=None がデフォルトだが、将来的には filter='data' がデフォルトとなる -> 安心してtarの展開ができるように! Python 3.12

    で fileter=None だと警告を表示 PEP 693 – Python 3.12 Release Scheduleによると 2023/10/2 リリース Python 3.14 で filter='data' がデフォルトに 32回 初心者のためのセキュリティ勉強会 ` ` ` ` ` ` ` ` 8 / 9