Настройте отказ от изменённых wheel при установке

КибербезопасностьBeginner
Практиковаться сейчас

Введение

Одобренные версии BenchTicket известны, но дистрибутив с теми же именем и версией может содержать иной код. Это независимое окружение содержит правильный источник, управляемые подмены и отдельный каталог одобрения.

Настройте рецепт на приём точных одобренных байтов, отказ от изменений прямых или косвенных зависимостей и работу с законным зеркалом. Команды продолжают первый пошаговый лабораторный практикум. Все wheel синтетические; публичные сервисы пакетов и эксплуатация уязвимостей не используются.

Убедитесь, что метки версии недостаточно

Сравните правильный пример с подменой той же версии. Начните в Terminal:

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

Нормальный итог T101 — 3200,32.00. Требования уже фиксируют prices 1.4.0 и labels 1.0.0. Установщик принимает целевое окружение и каталог wheel. --no-index отключает поиск в индексах; --find-links ищет в переданном каталоге.

Создайте одноразовое демонстрационное окружение:

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

Кавычки сохраняют пробелы в одном аргументе пути. Обе версии по-прежнему соответствуют каталогу:

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

Теперь T101 стоит 3300,33.00. Предоставленная подмена имеет корректную структуру wheel и неизменные метаданные; отличается лишь код. Имя и версия не зафиксировали ожидаемые байты.

Сравните байты кандидата с независимым одобрением

Отличите измерение файла от его одобрения. SHA-256 даёт дайджест точных байтов; иной дайджест означает иной файл.

Прочитайте отдельно предоставленный каталог:

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

pip hash измеряет wheel. Измерьте одобренный файл:

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

Дайджест совпадает с каталогом. Измерьте одноимённую подмену:

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

Дайджест отличается. Вычисление нового хеша не одобряет подмену. Учебное допущение: независимый от проекта каталог получен через доверенный канал проверки; сами хеши не определяют издателя.

Нужно ограничить и prices, и labels. Иначе изменённая косвенная зависимость изменит отображаемую сумму даже при неизменном prices.

Ограничьте весь набор зависимостей

Сохраните проверенные байты как требования pip. Версию и значение --hash=sha256: держите на одной строке:

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

--require-hashes требует фиксированные версии и хеши всего набора, включая косвенные пакеты. --force-reinstall заменяет уже установленный пакет той же версии, чтобы предыдущую пробу нельзя было принять за чистую проверку.

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

Оставьте requirements.txt относительным к текущему каталогу проекта: так оба файла можно перенести вместе. Цели принадлежат вызывающему пользователю; sudo не нужен. Сохраните кавычки у обоих аргументов: первый выбирает окружение, второй — предоставленный каталог wheel. Рецепт должен действительно использовать второй каталог, не подставляя незаметно иной источник. Он должен принимать любую предоставленную копию одобренных wheel и отвергать изменённые байты.

Опечатка в хеше должна остановить установку. Сверьте с независимым каталогом и исправьте требование; не заменяйте одобрение дайджестом из отвергнутого кандидата.

Соберите и передайте одобренные цены

Примените исправленный рецепт в основном окружении. Создайте его отдельно от предыдущей пробы:

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

Оба одобренных пакета должны установиться. Создайте реальный результат:

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

Ожидайте исходные ID и количества с итогами 3200, 1200, 1600, 0 и 4200 центов. Проверьте весь файл:

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

Нет вывода — совпадение. Проверяются и расчёты, и подписи; две установленные версии не обнаружили бы изменение кода. Если раньше случайно установили другие байты, принудительная переустановка из одобренного источника восстановит одобренный код. Не меняйте исходную программу и заказы.

Отклоните изменённую косвенную зависимость

Проверьте отказ без повреждения рабочего прайс-листа. Каталог changed indirect содержит одобренный prices, но подменённый labels той же версии.

python3 -m venv --without-pip .blocked

Следующая установка должна завершиться ошибкой несовпадения хеша с кодом 1:

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

Pip сообщает THESE PACKAGES DO NOT MATCH THE HASHES и показывает ожидаемый и полученный дайджест labels. Сразу прочитайте исходный код завершения:

echo $?

Ожидайте 1. Сбой соединения, отсутствие пути или интерпретатора — другие ошибки, не доказательство отказа по хешу. При опечатке пути вернитесь в ticket-build, просмотрите содержимое через ls и повторите одноразовую пробу.

Неудачная установка может оставить неполное окружение .blocked; оно не является результатом для передачи. Рабочие .venv и handover.csv должны оставаться доступными:

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

Ожидайте пять правильных строк. Никогда не ослабляйте доверенный список хешей ради установки отвергнутого источника.

Примите неизменённое зеркало

Докажите, что рецепт разрешает законные сборки. Зеркало — другое расположение тех же одобренных файлов; пробелы в пути проверяют аргументы в кавычках.

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

Снова ожидайте пять правильных заказов. Отказ от всех источников, игнорирование аргумента источника или зависимость от готового окружения не выполняют контракт.

Передаются сохранённый рецепт, полные требования с хешами, реальное основное окружение и правильный handover.csv. Пробные окружения нужны лишь для управляемых демонстраций. Новая зависимость или одобренный выпуск требуют новой проверки байтов; автоматическое добавление любого сообщённого источником хеша убрало бы защиту.

Упражнение устанавливает границу для предоставленных исходных wheel. Оно не доказывает отсутствие уязвимостей в одобренном пакете или воспроизводимость всей сборки на каждой платформе.

Резюме

Вы отделили метаданные версии от точных байтов дистрибутива, ограничили прямые и косвенные зависимости и отклонили подмены той же версии. Исходный билетный инструмент по-прежнему правильно обрабатывает все заказы, а неизменённое зеркало доступно. Основа доверия — независимый каталог; кандидат не одобряет себя сам.