Faça a instalação rejeitar wheels alterados

CibersegurançaBeginner
Pratique Agora

Introdução

As versões aprovadas do BenchTicket são conhecidas, mas uma distribuição com o mesmo nome e versão ainda pode conter código diferente. Este ambiente independente inclui uma fonte correta, substituições controladas e um catálogo de aprovação separado.

Faça a receita aceitar bytes exatos aprovados, rejeitar mudanças em dependências diretas ou indiretas e continuar funcionando com um espelho legítimo. Os comandos se baseiam no primeiro laboratório guiado. Todos os wheels são sintéticos; nenhum serviço público de pacotes ou exploração de vulnerabilidade está envolvido.

Veja por que o rótulo de versão não basta

Compare um exemplo correto com uma substituição de mesma versão. Comece em Terminal:

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

O valor normal T101 é 3200,32.00. Os requisitos já fixam prices 1.4.0 e labels 1.0.0. O instalador aceita dois argumentos: ambiente destino e diretório de wheels. --no-index desativa a consulta a índices; --find-links pesquisa o diretório fornecido.

Crie um ambiente de demonstração descartável:

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

Aspas preservam os espaços desse único argumento de caminho. As duas versões ainda correspondem ao catálogo:

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

T101 agora custa 3300,33.00. A substituição tem estrutura wheel válida e metadados intactos; só o código difere. Nome e versão não vincularam os bytes esperados.

Compare bytes candidatos com aprovação independente

Diferencie medir um arquivo de aprová-lo. SHA-256 produz um resumo dos bytes exatos; um resumo diferente significa um arquivo diferente.

Leia o catálogo fornecido separadamente:

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

pip hash mede um wheel. Meça o arquivo aprovado:

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

O resumo coincide com o catálogo. Meça a substituição de mesmo nome:

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

O resumo é diferente. Calcular esse novo hash não aprova a substituição. A premissa de treinamento é que o catálogo independente do projeto chegou por um canal de revisão confiável; hashes sozinhos não identificam um publicador.

É necessário restringir prices e labels. Caso contrário, uma dependência indireta alterada poderia mudar o valor exibido mesmo com prices intacto.

Restrinja o conjunto completo de dependências

Salve os bytes revisados como requisitos de pip. Mantenha cada versão e seu valor --hash=sha256: na mesma linha:

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

--require-hashes exige versões fixas e hashes para todo o conjunto, incluindo pacotes indiretos. --force-reinstall também substitui pacotes já instalados de mesma versão, impedindo confundir um teste anterior com uma verificação limpa.

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

Mantenha requirements.txt relativo ao diretório atual do projeto para transportar os dois arquivos juntos. Os destinos pertencem ao chamador; não é necessário sudo. Preserve ambos os argumentos entre aspas: o primeiro escolhe o ambiente, o segundo o diretório de wheels fornecido. A receita deve realmente usar esse segundo diretório, sem buscar silenciosamente outra fonte. Deve aceitar qualquer cópia fornecida dos wheels aprovados e rejeitar bytes alterados.

Um erro de digitação no hash deve parar a instalação. Compare com o catálogo independente e corrija o requisito; não substitua a aprovação por um resumo copiado do candidato rejeitado.

Construa e entregue os preços aprovados

Use a receita corrigida no ambiente principal. Crie-o separado do teste anterior:

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

Ambos os pacotes aprovados devem ser instalados. Produza a entrega real:

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

Espere os IDs e quantidades originais com totais 3200, 1200, 1600, 0 e 4200 centavos. Confira o arquivo inteiro:

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

Sem saída há correspondência. Isso testa cálculos e rótulos; apenas ver duas versões instaladas não detectaria código alterado. Se uma instalação acidental anterior usou bytes modificados, a reinstalação forçada restaura código aprovado ao receber a fonte aprovada. Mantenha programa e pedidos originais intactos.

Rejeite uma dependência indireta alterada

Teste a rejeição sem danificar a lista funcional. O diretório changed indirect contém prices aprovado, mas um labels substituído de mesma versão.

python3 -m venv --without-pip .blocked

A próxima instalação deve falhar por divergência de hash e terminar com estado 1:

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

Pip informa THESE PACKAGES DO NOT MATCH THE HASHES e mostra os resumos esperado e recebido de labels. Leia imediatamente o estado nativo:

echo $?

Espere 1. Falha de conexão, caminho ou interpretador ausente são erros diferentes e não demonstram rejeição por hash. Se digitou mal um caminho, volte a ticket-build, liste as entradas com ls e repita o teste descartável.

A instalação malsucedida pode deixar um ambiente .blocked parcial; ele não é entregável. O .venv correto e handover.csv precisam continuar utilizáveis:

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

Espere cinco linhas corretas. Nunca enfraqueça a lista de hashes confiáveis para instalar a fonte rejeitada.

Aceite um espelho inalterado

Prove que a receita ainda permite instalações legítimas. Um espelho é outro local com os mesmos arquivos aprovados; o caminho tem espaços para exercitar argumentos entre aspas.

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

Espere novamente cinco pedidos corretos. Recusar todas as fontes, ignorar o argumento de origem ou depender de um ambiente existente não atende ao contrato.

Os entregáveis são a receita salva, requisitos completos com hashes, o ambiente principal real e handover.csv correto. Ambientes de teste são apenas demonstrações controladas. Uma nova dependência ou versão aprovada exige nova revisão dos bytes; adicionar automaticamente qualquer hash informado por uma fonte eliminaria a proteção.

O exercício estabelece o limite para os wheels originais fornecidos. Não prova ausência de vulnerabilidades num pacote aprovado nem reprodutibilidade de toda a construção em cada plataforma.

Resumo

Você distinguiu metadados de versão de bytes exatos, restringiu dependências diretas e indiretas e rejeitou substituições de mesma versão. A ferramenta original continua produzindo todos os pedidos corretos e um espelho intacto permanece utilizável. O catálogo independente fornece a confiança; o candidato não aprova a si mesmo.