소개
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의 경계를 입증합니다. 승인 패키지에 취약점이 없거나 전체 빌드가 모든 플랫폼에서 재현 가능함을 입증하지는 않습니다.
요약
버전 메타데이터와 배포판의 정확한 바이트를 구별하고 직접·간접 의존성을 제한하여 같은 버전의 대체 패키지를 거부했습니다. 원본 티켓 도구는 여전히 모든 주문을 정확히 만들며 변경되지 않은 미러도 사용 가능합니다. 독립 승인 목록이 신뢰 입력이며 후보가 스스로를 승인하지는 않습니다.



