Haz que la instalación rechace wheels modificados

CiberseguridadBeginner
Practicar Ahora

Introducción

Ya conoces las versiones aprobadas de BenchTicket, pero una distribución con igual nombre y versión puede contener otro código. Este entorno independiente incluye una fuente correcta, sustituciones controladas y un catálogo de aprobación separado.

Harás que la receta acepte bytes aprobados exactos, rechace cambios en dependencias directas o indirectas y siga funcionando con una réplica legítima. Los comandos parten del primer laboratorio guiado. Todos los wheels son sintéticos; no se utilizan servicios públicos de paquetes ni exploits.

Comprueba por qué no basta la versión

Compararás el ejemplo correcto con una sustitución de igual versión. Empieza en Terminal:

cd /home/labex/project/ticket-build
/opt/labex-lookalike/demo

El importe normal T101 es 3200,32.00. Los requisitos ya fijan prices 1.4.0 y labels 1.0.0. Este instalador acepta dos argumentos: entorno destino y directorio de wheels. --no-index desactiva la consulta de índices; --find-links busca en el directorio suministrado.

Crea un entorno desechable de demostración:

python3 -m venv --without-pip .trial
bash install.sh .trial '/opt/labex-lookalike/sources/changed direct'

Las comillas preservan los espacios de ese argumento de ruta. Ambas versiones siguen coincidiendo con el catálogo:

python3 -m pip --isolated --python .trial show benchticket-prices benchticket-labels
.trial/bin/python quote.py orders.csv

Ahora T101 cuesta 3300,33.00. La sustitución tiene una estructura wheel válida y metadatos intactos; solo cambia el código. Nombre y versión no fijaron los bytes esperados.

Compara bytes candidatos con la aprobación independiente

Distinguirás medir un archivo de aprobarlo. SHA-256 produce un resumen para bytes exactos; un resumen distinto implica otro archivo.

Lee el catálogo separado:

cat /opt/labex-lookalike/approval/packages.tsv

pip hash mide un wheel. Mide el archivo aprobado:

python3 -m pip hash /opt/labex-lookalike/sources/approved/benchticket_prices-1.4.0-py3-none-any.whl

Su resumen coincide con el catálogo. Mide la sustitución del mismo nombre:

python3 -m pip hash '/opt/labex-lookalike/sources/changed direct/benchticket_prices-1.4.0-py3-none-any.whl'

El resumen es distinto. Calcular este hash nuevo no aprueba la sustitución. Se presupone que el catálogo independiente del proyecto llegó por un canal de revisión de confianza; los hashes por sí solos no identifican al editor.

Debes restringir tanto prices como labels. De otro modo, una dependencia indirecta modificada podría alterar el importe mostrado aunque prices no cambie.

Restringe el conjunto completo de dependencias

Guardarás los bytes revisados como requisitos de pip. Mantén cada versión y su valor --hash=sha256: en la misma línea:

cat > requirements.txt <<'EOF'
benchticket-prices==1.4.0 --hash=sha256:db50f7ff915dcc6cbdbf5b0afe2be55849ee70a8c7b55c44b1b3dab5deb806f9
benchticket-labels==1.0.0 --hash=sha256:3b3d881be08017aee54a825aaf3da158cd0b00b69f6d3f89744e8473f879baef
EOF

--require-hashes exige requisitos con versión fija y hash para todo el conjunto, incluidos los paquetes indirectos. --force-reinstall también reemplaza paquetes instalados de igual versión, evitando confundir una prueba previa con una comprobación limpia.

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

Mantén requirements.txt relativo al directorio del proyecto para transportar juntos los dos archivos. Los destinos pertenecen al usuario que llama; no hace falta sudo. Conserva ambos argumentos entre comillas: el primero elige el entorno; el segundo, el directorio de wheels suministrado. La receta debe usar realmente este segundo directorio sin recuperar silenciosamente otra fuente. Debe aceptar cualquier copia suministrada de los wheels aprobados y rechazar bytes modificados.

Un error al escribir un hash debe detener la instalación. Compáralo con el catálogo independiente y corrige el requisito; no sustituyas la aprobación por un resumen del candidato que falla.

Construye y entrega los precios aprobados

Usarás la receta corregida en tu entorno principal. Créalo separado de la prueba anterior:

python3 -m venv --without-pip .venv
bash install.sh .venv /opt/labex-lookalike/sources/approved

Deben instalarse ambos paquetes aprobados. Produce la entrega real:

.venv/bin/python quote.py orders.csv --output handover.csv
cat handover.csv

Espera los ID y cantidades originales con totales 3200, 1200, 1600, 0 y 4200 céntimos. Comprueba el archivo completo:

diff -u /opt/labex-lookalike/approval/reference.csv handover.csv

Sin salida hay coincidencia. Esto prueba tanto los cálculos como las etiquetas; observar solo dos versiones no detectaría código alterado. Si una instalación accidental anterior usó bytes modificados, la reinstalación forzada restaura el código aprobado al recibir la fuente aprobada. Conserva intactos el programa y los pedidos.

Rechaza una dependencia indirecta modificada

Probarás el rechazo sin dañar la lista funcional. El directorio changed indirect contiene prices aprobado pero un labels sustituido con igual versión.

python3 -m venv --without-pip .blocked

Se espera que la siguiente instalación falle por un hash distinto y termine con estado 1:

bash install.sh .blocked '/opt/labex-lookalike/sources/changed indirect'

Pip indica THESE PACKAGES DO NOT MATCH THE HASHES y muestra el resumen esperado y recibido de labels. Lee inmediatamente el estado nativo:

echo $?

Espera 1. Un fallo de conexión, ruta o intérprete ausente es un error distinto y no demuestra rechazo por hash. Si escribiste mal la ruta, vuelve a ticket-build, lista las entradas con ls y repite la prueba desechable.

La instalación fallida puede dejar un entorno .blocked parcial; no es una entrega. Tu .venv correcto y handover.csv deben seguir utilizables:

.venv/bin/python quote.py orders.csv

Espera cinco filas correctas. Nunca debilites la lista de hashes de confianza para instalar una fuente rechazada.

Acepta una réplica sin cambios

Demostrarás que la receta permite instalaciones legítimas. Una réplica es otra ubicación con los mismos archivos aprobados; su ruta contiene espacios para ejercitar los argumentos entre comillas.

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

Espera de nuevo cinco pedidos correctos. Rechazar todas las fuentes, ignorar el argumento de origen o depender de un entorno existente no cumple el contrato.

Entregas la receta guardada, requisitos completos con hashes, el entorno principal real y handover.csv correcto. Los entornos de prueba solo son demostraciones controladas. Una dependencia o versión aprobada nueva exige revisar sus bytes; añadir automáticamente cualquier hash que reporte una fuente elimina la protección.

El ejercicio establece el límite para los wheels originales suministrados. No demuestra ausencia de vulnerabilidades en un paquete aprobado ni que todo el proceso sea reproducible en cada plataforma.

Resumen

Distinguiste metadatos de versión de bytes exactos, restringiste dependencias directas e indirectas y rechazaste sustituciones de igual versión. La herramienta original sigue generando todos los pedidos correctos y una réplica intacta sigue utilizable. El catálogo independiente aporta la confianza; el candidato no se aprueba a sí mismo.