変更された wheel をインストール時に拒否する

サイバーセキュリティBeginner
オンラインで実践に進む

はじめに

BenchTicket の承認済みバージョンは分かりましたが、同名同版の配布物でもコードは異なり得ます。この独立環境には正しい供給元、制御された代替品、別の承認カタログがあります。

正確な承認済みバイトを受け入れ、直接・間接依存の変更を拒否し、正当なミラーも使える手順を作ります。コマンドは最初の guided ラボを踏まえています。すべての 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 に対する境界です。承認パッケージに脆弱性がないことや、全プラットフォームでビルド全体が再現可能なことを証明しません。

まとめ

バージョンメタデータと配布物の正確なバイトを区別し、直接・間接依存を制約して同版の代替品を拒否しました。元のチケットツールは全注文を正しく生成し、変更のないミラーも利用可能です。信頼の入力は独立承認カタログであり、候補パッケージが自分を承認するわけではありません。