PEP 721 – Verwendung des tarfile.data_filter für die Extraktion von Quell-Distributionen
- Autor:
- Petr Viktorin <encukou at gmail.com>
- PEP-Delegate:
- Paul Moore <p.f.moore at gmail.com>
- Status:
- Final
- Typ:
- Standards Track
- Thema:
- Packaging
- Benötigt:
- 706
- Erstellt:
- 12-Jul-2023
- Python-Version:
- 3.12
- Post-History:
- 04-Jul-2023
- Resolution:
- 02-Aug-2023
Zusammenfassung
Das Extrahieren eines Quell-Distribution-Archivs sollte normalerweise den in PEP 706 eingeführten data-Filter verwenden. Wir klären Details und spezifizieren das Verhalten für Tools, die den Filter nicht direkt verwenden können.
Motivation
Die Quell-Distribution sdist ist als Tar-Archiv definiert.
Das tar-Format wurde entwickelt, um alle Metadaten von Unix-ähnlichen Dateien zu erfassen. Einige davon sind gefährlich, für Quellcode unnötig und/oder plattformabhängig. Wie in PEP 706 erläutert, sollte beim Extrahieren eines Tarballs entweder die erlaubten Features eingeschränkt oder dem Tarball die vollständige Kontrolle gegeben werden.
Begründung
Für Quell-Distributionen reicht der in PEP 706 eingeführte data-Filter aus. Er erlaubt etwas mehr Features als git und zip (beide üblicherweise in Verpackungs-Workflows verwendet).
Nicht alle Tools können den data-Filter verwenden, daher spezifiziert dieses PEP eine explizite Reihe von Erwartungen. Ziel ist es, dass das aktuelle Verhalten von pip download und setuptools.archive_util.unpack_tarfile gültig ist, außer in Fällen, die als zu gefährlich für die Erlaubnis gelten. Eine weitere Überlegung ist die einfache Implementierung für Nicht-Python-Tools.
Nicht gepatchte Versionen von Python
Tools dürfen dieses PEP ignorieren, wenn sie auf Python ohne tarfile-Filter laufen.
Das Feature wurde für alle von python.org unterstützten Python-Versionen zurückportiert. Das Einbinden in Drittanbieter-Bibliotheken ist schwierig, und wir sollten nicht alle Tools dazu zwingen. Dies verlagert die Verantwortung für die Aktualisierung der Sicherheit von den Tools auf die Benutzer.
Berechtigungen
Gängige Tools (git, zip) bewahren keine Unix-Berechtigungen (Mode-Bits). Nutzern zu sagen, dass sie sich in sdists nicht darauf verlassen sollen, und Tools die Handhabung relativ frei zu überlassen, erscheint fair.
Die einzige Ausnahme ist die ausführbare Berechtigung. Wir empfehlen, aber verlangen nicht, dass Tools diese beibehalten. Da Skripte im Allgemeinen plattformspezifisch sind, scheint es passend zu sagen, dass ihre Ausführbarkeit ein Tool-spezifisches Verhalten ist.
Beachten Sie, dass git die Ausführbarkeit beibehält, während zip (und damit wheel) dies nicht nativ tut. (Es ist möglich, dies in „externe Attribute“ zu kodieren, aber Pythons ZipFile.extract berücksichtigt dies nicht.)
Spezifikation
Das Folgende wird zur Spezifikation des PyPA-Quell-Distributionsformats unter einer neuen Überschrift, „Source distribution archive features“, hinzugefügt:
Da das Extrahieren von Tar-Dateien wie sie sind gefährlich ist und die Ergebnisse plattformspezifisch sind, sind die Archivfunktionen von Quell-Distributionen begrenzt.
Entpacken mit dem Datenfilter
Beim Extrahieren einer Quell-Distribution müssen Tools entweder tarfile.data_filter verwenden (z.B. TarFile.extractall(..., filter='data')) ODER dem Abschnitt Unpacking without the data filter unten folgen.
Als Ausnahme, auf Python-Interpretern ohne hasattr(tarfile, 'data_filter') (PEP 706), dürfen Tools, die diesen Filter normalerweise verwenden (direkt oder indirekt), den Benutzer warnen und diese Spezifikation ignorieren. Der Kompromiss zwischen Benutzerfreundlichkeit (z.B. vollständiges Vertrauen in das Archiv) und Sicherheit (z.B. Ablehnung des Entpackens) liegt in diesem Fall beim Tool.
Entpacken ohne den Datenfilter
Tools, die den data-Filter nicht direkt verwenden (z.B. aus Gründen der Rückwärtskompatibilität, um zusätzliche Features zu erlauben, oder weil sie kein Python verwenden), MÜSSEN diesem Abschnitt folgen. (Zum Zeitpunkt der Erstellung folgt der data-Filter ebenfalls diesem Abschnitt, aber er könnte zukünftig davon abweichen.)
Die folgenden Dateien sind in einem sdist-Archiv ungültig. Bei der Begegnung mit einem solchen Eintrag SOLLTEN Tools den Benutzer benachrichtigen, den Eintrag NICHT entpacken und KÖNNEN mit einem Fehler abbrechen.
- Dateien, die außerhalb des Zielverzeichnisses platziert würden.
- Links (symbolisch oder hart), die außerhalb des Zielverzeichnisses zeigen.
- Gerätedateien (einschließlich Pipes).
Die folgenden sind ebenfalls ungültig. Tools KÖNNEN sie wie oben behandeln, sind aber NICHT dazu VERPFLICHTET.
- Dateien mit einer
..-Komponente im Dateinamen oder Linkziel. - Links, die auf eine Datei zeigen, die nicht Teil des Archivs ist.
Tools KÖNNEN Links (symbolisch oder hart) als normale Dateien entpacken, wobei der Inhalt aus dem Archiv verwendet wird.
Beim Extrahieren von sdist-Archiven
- Führende Schrägstriche in Dateinamen MÜSSEN entfernt werden. (Dies ist heutzutage das Standardverhalten für
tar-Entpackung.) - Für jedes
mode(Unix-Berechtigung) Bit müssen Tools entweder- die plattformspezifischen Standardwerte für eine neue Datei/Verzeichnis (bzw.) verwenden,
- das Bit gemäß dem Archiv setzen, oder
- das Bit von
rw-r--r--(0o644) für nicht ausführbare Dateien oderrwxr-xr-x(0o755) für ausführbare Dateien und Verzeichnisse verwenden.
- Hohe
mode-Bits (setuid, setgid, sticky) MÜSSEN gelöscht werden. - Es wird EMPFOHLEN, das Benutzer-ausführbar-Bit beizubehalten.
Weitere Hinweise
Tool-Autoren werden ermutigt, zu überlegen, wie die Hinweise für weitere Verifizierung in der Dokumentation von tarfile für ihr Tool gelten.
Abwärtskompatibilität
Das bestehende Verhalten ist undefiniert und wird von verschiedenen Tools unterschiedlich behandelt. Dieses PEP macht die Erwartungen explizit.
Es gibt keinen bekannten Fall von Rückwärtsinkompatibilität, aber einige Projekte da draußen verlassen sich wahrscheinlich auf Details, die nicht garantiert sind. Dieses PEP verbietet die gefährlichsten dieser Features, und der Rest wird Tool-spezifisch gemacht.
Sicherheitsimplikationen
Der empfohlene data-Filter gilt als sicher gegen gängige Exploits und ist ein zentraler Punkt, der bei zukünftigen Schwachstellen angepasst werden kann.
Die explizite Spezifikation beinhaltet Schutzmaßnahmen des data-Filters.
Wie man das lehrt
Das PEP richtet sich an Autoren von Verpackungstools, die mit einem PEP und einer aktualisierten Verpackungsspezifikation zurechtkommen sollten.
Referenzimplementierung
TBD
Abgelehnte Ideen
Noch keine.
Offene Fragen
Noch keine.
Urheberrecht
Dieses Dokument wird in die Public Domain oder unter die CC0-1.0-Universal-Lizenz gestellt, je nachdem, welche Lizenz permissiver ist.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0721.rst
Zuletzt geändert: 2025-02-01 08:55:40 GMT