Einführung
BenchTickets freigegebene Versionen sind bekannt, aber eine Distribution gleichen Namens und gleicher Version kann anderen Code enthalten. Diese unabhängige Umgebung enthält eine korrekte Quelle, kontrollierte Ersatzpakete und einen separaten Freigabekatalog.
Dein Rezept soll exakte freigegebene Bytes akzeptieren, Änderungen direkter oder indirekter Abhängigkeiten ablehnen und einen legitimen Spiegel weiter nutzen. Die Befehle bauen auf dem ersten geführten Lab auf. Alle Wheels sind synthetisch; öffentliche Paketdienste und Exploits sind nicht beteiligt.
Erkenne, warum die Versionsangabe nicht genügt
Vergleiche ein korrektes Beispiel mit einem Ersatz gleicher Version. Beginne in Terminal:
cd /home/labex/project/ticket-build
/opt/labex-lookalike/demo
Der normale T101-Betrag ist 3200,32.00. Die Anforderungen legen bereits prices 1.4.0 und labels 1.0.0 fest. Dieser Installer nimmt Zielumgebung und Wheel-Verzeichnis als Argumente. --no-index deaktiviert Indexabfragen; --find-links durchsucht das übergebene Verzeichnis.
Erstelle eine wegwerfbare Demonstrationsumgebung:
python3 -m venv --without-pip .trial
bash install.sh .trial '/opt/labex-lookalike/sources/changed direct'
Anführungszeichen bewahren die Leerzeichen im einzelnen Pfadargument. Beide Versionen passen weiterhin zum Katalog:
python3 -m pip --isolated --python .trial show benchticket-prices benchticket-labels
.trial/bin/python quote.py orders.csv
T101 kostet jetzt 3300,33.00. Dieser Ersatz hat eine gültige Wheel-Struktur und unveränderte Metadaten; nur der Code unterscheidet sich. Name und Version haben die erwarteten Bytes nicht festgelegt.
Vergleiche Kandidatenbytes mit unabhängiger Freigabe
Unterscheide das Vermessen einer Datei von ihrer Freigabe. SHA-256 erzeugt einen Hashwert für exakte Bytes; ein anderer Wert bedeutet eine andere Datei.
Lies den getrennt bereitgestellten Katalog:
cat /opt/labex-lookalike/approval/packages.tsv
pip hash vermisst ein Wheel. Miss die freigegebene Datei:
python3 -m pip hash /opt/labex-lookalike/sources/approved/benchticket_prices-1.4.0-py3-none-any.whl
Ihr Hashwert passt zum Katalog. Miss den gleichnamigen Ersatz:
python3 -m pip hash '/opt/labex-lookalike/sources/changed direct/benchticket_prices-1.4.0-py3-none-any.whl'
Dieser Wert weicht ab. Das Berechnen des neuen Hashes gibt den Ersatz nicht frei. Hier gilt die Annahme, dass der projektunabhängige Katalog über einen vertrauenswürdigen Prüfkanal kam. Hashes allein identifizieren keinen Herausgeber.
Prices und labels müssen beide eingeschränkt werden. Sonst kann eine veränderte indirekte Abhängigkeit den angezeigten Betrag ändern, obwohl prices gleich bleibt.
Beschränke den gesamten Abhängigkeitssatz
Speichere die geprüften Bytes als pip-Anforderungen. Halte jede Version und ihren Wert --hash=sha256: auf derselben Zeile:
cat > requirements.txt <<'EOF'
benchticket-prices==1.4.0 --hash=sha256:db50f7ff915dcc6cbdbf5b0afe2be55849ee70a8c7b55c44b1b3dab5deb806f9
benchticket-labels==1.0.0 --hash=sha256:3b3d881be08017aee54a825aaf3da158cd0b00b69f6d3f89744e8473f879baef
EOF
--require-hashes verlangt feste Versionen und Hashes für alle Abhängigkeiten einschließlich indirekter Pakete. --force-reinstall ersetzt auch bereits installierte Pakete gleicher Version, damit ein früherer Versuch nicht als frische Prüfung gilt.
cat > install.sh <<'EOF'
#!/bin/bash
set -e
python3 -m pip --isolated --python "$1" install --force-reinstall --require-hashes --no-cache-dir --no-index --find-links "$2" -r requirements.txt
EOF
Lass requirements.txt relativ zum aktuellen Projektverzeichnis, damit beide Rezeptdateien gemeinsam verschiebbar sind. Ziele gehören dem Aufrufer; sudo ist nicht nötig. Behalte beide zitierten Argumente: Das erste wählt die Umgebung, das zweite das bereitgestellte Wheel-Verzeichnis. Das Rezept muss dieses zweite Verzeichnis tatsächlich verwenden und darf nicht heimlich eine andere Quelle abrufen. Es muss jede bereitgestellte Kopie freigegebener Wheels akzeptieren und veränderte Bytes ablehnen.
Ein Tippfehler im Hash soll die Installation stoppen. Vergleiche mit dem unabhängigen Katalog und korrigiere die Anforderung; ersetze die Freigabe nicht durch den Hash des fehlschlagenden Kandidaten.
Baue und liefere die freigegebenen Preise
Verwende das korrigierte Rezept in deiner Hauptumgebung. Erstelle sie getrennt vom vorigen Versuch:
python3 -m venv --without-pip .venv
bash install.sh .venv /opt/labex-lookalike/sources/approved
Beide freigegebenen Pakete sollen installiert werden. Erzeuge die echte Übergabe:
.venv/bin/python quote.py orders.csv --output handover.csv
cat handover.csv
Erwarte Original-IDs und Mengen mit den Summen 3200, 1200, 1600, 0 und 4200 Cent. Prüfe die ganze Datei:
diff -u /opt/labex-lookalike/approval/reference.csv handover.csv
Keine Ausgabe bedeutet Übereinstimmung. Das prüft Berechnung und Beschriftung; zwei installierte Versionen würden veränderten Code übersehen. Falls zuvor versehentlich veränderte Bytes installiert wurden, stellt die erzwungene Neuinstallation mit freigegebener Quelle den freigegebenen Code wieder her. Bewahre Originalprogramm und Bestellungen unverändert.
Lehne eine veränderte indirekte Abhängigkeit ab
Prüfe die Ablehnung, ohne die funktionierende Preisliste zu beschädigen. changed indirect enthält freigegebenes prices, aber ein ersetztes labels gleicher Version.
python3 -m venv --without-pip .blocked
Die nächste Installation soll wegen eines falschen Hashes mit Exitstatus 1 scheitern:
bash install.sh .blocked '/opt/labex-lookalike/sources/changed indirect'
Pip meldet THESE PACKAGES DO NOT MATCH THE HASHES und zeigt erwarteten und empfangenen Hash von labels. Lies sofort den nativen Status:
echo $?
Erwarte 1. Verbindungsfehler, fehlender Pfad oder fehlender Interpreter sind andere Fehler und belegen keine Hash-Ablehnung. Bei einem vertippten Pfad kehre nach ticket-build zurück, liste mit ls die Einträge und wiederhole den wegwerfbaren Test.
Der Fehlschlag kann eine teilweise .blocked-Umgebung zurücklassen; sie ist kein Liefergegenstand. Die gute .venv und handover.csv müssen nutzbar bleiben:
.venv/bin/python quote.py orders.csv
Erwarte fünf korrekte Zeilen. Schwäche niemals die vertrauenswürdige Hashliste, nur um die abgelehnte Quelle zu installieren.
Akzeptiere einen unveränderten Spiegel
Belege, dass das Rezept legitime Builds weiterhin zulässt. Ein Spiegel ist ein anderer Speicherort derselben freigegebenen Dateien; Leerzeichen im Pfad üben die zitierten Argumente.
python3 -m venv --without-pip '.mirror environment'
bash install.sh '.mirror environment' '/opt/labex-lookalike/sources/approved mirror'
'.mirror environment/bin/python' quote.py orders.csv
Erwarte wieder fünf korrekte Bestellungen. Alle Quellen abzulehnen, das Quellargument zu ignorieren oder eine vorhandene Umgebung vorauszusetzen erfüllt den Vertrag nicht.
Du lieferst das gespeicherte Rezept, vollständige Anforderungen mit Hashes, die echte Hauptumgebung und korrektes handover.csv. Testumgebungen dienen nur der kontrollierten Demonstration. Eine neue Abhängigkeit oder freigegebene Version erfordert eine neue Prüfung ihrer Bytes; jeden gemeldeten Hash automatisch hinzuzufügen würde den Schutz entfernen.
Diese Übung belegt die Grenze für die bereitgestellten Original-Wheels. Sie beweist weder die Abwesenheit von Sicherheitslücken in freigegebenen Paketen noch die Reproduzierbarkeit des gesamten Builds auf jeder Plattform.
Zusammenfassung
Du hast Versionsmetadaten von exakten Distributionsbytes unterschieden, direkte und indirekte Abhängigkeiten eingeschränkt und Ersatzpakete gleicher Version abgelehnt. Das ursprüngliche Ticketwerkzeug erzeugt weiterhin alle korrekten Bestellungen, ein unveränderter Spiegel bleibt nutzbar. Vertrauensgrundlage ist der unabhängige Katalog; ein Kandidat gibt sich nicht selbst frei.



