Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

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

Inhaltsverzeichnis

Wichtig

Dieses PEP ist ein historisches Dokument. Die aktuelle, kanonische Spezifikation, Source distribution archive features, wird auf der PyPA specs page gepflegt.

×

Siehe den PyPA-Spezifikations-Update-Prozess, um Änderungen vorzuschlagen.

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 oder rwxr-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.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0721.rst

Zuletzt geändert: 2025-02-01 08:55:40 GMT