이 페이지에서는 Pixel 기기에서 합법적인 버전의 Pixel 이미지를 실행할 수 있는 가장 확실한 방법을 설명합니다. 이를 위해서는 공장 출고 시 이미지를 컴퓨터에 다운로드하고 다운로드한 아티팩트를 기기에 플래시하기 전에 로그 포함 증명을 실행해야 합니다.
Pixel 공장 출고 이미지 확인 방법
인증 전제 조건
방금 다운로드한 초기 이미지가 Google의 주장과 일치하는지 확인하려면 먼저 네트워크에 연결된 컴퓨터에서 다음을 실행해야 합니다.
Golang
인증 도구는 Go로 작성됩니다. 빌드하려면 Go 사이트에서 Go 1.17 이상을 설치합니다.
wget 또는 curl
wget 및 curl은 인터넷에서 파일을 검색하거나 다운로드하는 데 사용할 수 있는 도구입니다. 이 가이드의 나머지 부분과 제공된 스크립트는 이 중 하나가 있어야 작동하므로 시스템에 이러한 도구 중 하나가 설치되어 있는지 확인하세요.
Avbtool
avbtool은 공장 출고 이미지의 VBMeta 다이제스트를 계산하고 바이너리를 확인하는 데 사용됩니다.
아래 명령어를 사용하여 AOSP 저장소에서 다운로드할 수 있으며 링크된 문서에서 자세한 내용을 확인할 수 있습니다.
computer:~$ git clone https://android.googlesource.com/platform/external/avb
이 저장소를 클론한 후 클론된 avb
저장소 디렉터리에서 avbtool.py
를 찾을 수 있습니다. 또한 이 디렉터리를 $PATH
환경 변수에 추가해야 합니다.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
포함 증거 검증자
포함 증거 검증자는 Pixel Factory 이미지 투명성 로그를 쿼리하고 이미지가 로그에 포함되는지 출력하는 Go 모듈입니다.
위의 AVB 저장소를 클론한 후 확인자의 소스 코드는 tools/transparency/verify/
에 있습니다.
Fbpacktool
fbpacktool은 Pixel의 bootloader.img
에서 개별 구성요소를 압축 해제하는 데 사용되는 Python 스크립트입니다. 이 도구는 avbtool.py
가 인증에 필요한 이미지를 찾을 수 있도록 하는 데 중요합니다.
이 도구를 사용하려면 다음 세 가지 Python 스크립트를 avbtool.py
가 있는 디렉터리에 다운로드하고, fbpacktool.py
를 실행 파일로 만들고, 편의를 위해 fbpacktool
라는 심볼릭 링크를 fbpacktool.py
에 만들어야 합니다.
wget
가 있는 경우 다음 명령어를 실행하여 세 가지 스크립트를 다운로드할 수 있습니다.
computer:dir_to_avbtool$ wget https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool
curl
가 있는 경우 다음 명령어를 실행하여 세 가지 스크립트를 다운로드할 수 있습니다.
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool
OpenSSL
또한 인증 워크플로에서 터미널을 사용하여 다양한 암호화 작업을 실행하는 데 도움이 되는 openssl이라는 도구도 필요합니다. 시스템에 설치되어 있는지 확인합니다. 다음 명령어를 실행하여 터미널에서 확인하고 반환된 결과가 비어 있지 않은지 확인할 수 있습니다. 예를 들면 다음과 같습니다.
computer:~$ which openssl
/usr/bin/openssl
확인을 위한 페이로드 구성
기기에 있는 이미지 또는 Pixel Factory 이미지 웹사이트에서 다운로드한 이미지를 확인하려면 먼저 빌드 지문 및 VBMeta 다이제스트에서 해당 이미지에 해당하는 페이로드를 구성해야 합니다. 아래에 설명된 대로 수동 또는 자동의 두 가지 옵션이 있습니다.
- 빌드 지문: 공장 출고 이미지의 문자열 식별자
- 예:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
- 예:
- VBMeta 다이제스트: 공장 출고 이미지의 여러 부분을 서로 연결하는 SHA-256 암호화 다이제스트입니다.
- 예:
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
- 예:
수동 페이로드 생성
확인을 위한 페이로드를 수동으로 생성하려면 빈 새 줄을 사이에 두고 한 줄에는 빌드 지문, 다음 줄에는 VBMeta 다이제스트가 포함된 텍스트 파일 payload.txt
을 만들어야 합니다 (정확한 형식은 로그 콘텐츠 섹션 참고).
공장 출고 이미지 웹사이트의 단계를 따른 후 payload.txt
파일의 콘텐츠는 다음과 같이 표시됩니다.
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Pixel 공장 출고 시 이미지 웹사이트에서 VBMeta 다이제스트 및 빌드 지문 추출
Pixel 공장 출고 시 이미지 웹사이트에서 공장 출고 시 이미지를 다운로드하는 경우 다운로드한 파일의 압축을 풀어야 합니다. 그러면 해당 위치에 다른 폴더가 생성됩니다. 새로 만든 폴더로 이동하여 연결된 image-*.zip
파일의 압축을 풀어 개별 *.img
파일을 가져옵니다. 이러한 바이너리는 파티션 이미지입니다. img 파일 간에 vbmeta.img
파일이 있는지 확인합니다.
다음과 같은 결과를 확인할 수 있습니다.
computer:oriole-sd1a.210817.015.a4$ unzip image-oriole-sd1a.210817.015.a4.zip
Archive: image-oriole-sd1a.210817.015.a4.zip
inflating: android-info.txt
inflating: boot.img
inflating: vendor_boot.img
inflating: system.img
inflating: vendor.img
inflating: product.img
inflating: system_ext.img
inflating: system_other.img
inflating: dtbo.img
inflating: vbmeta_system.img
inflating: vbmeta.img
inflating: super_empty.img
다운로드한 모든 파일에서 빌드 지문을 추출하고 VBMeta 다이제스트를 계산할 수 있습니다.
avbtool.py
가 $PATH
에 제공되면 터미널에서 다음 명령어를 실행하여 빌드 지문을 추출하고 방금 다운로드한 공장 출고 이미지의 VBMeta 다이제스트를 계산할 수 있습니다.
computer:dir_containing_unzipped_factory_image~$ grep -a 'ro\..*build\.fingerprint=google/.*/release-keys' system.img | cut -f2 -d'='
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
computer:dir_containing_unzipped_factory_image$ avbtool.py calculate_vbmeta_digest --image vbmeta.img
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
다운로드한 공장 출고 시 이미지의 수동 확인
다운로드한 공장 출고 이미지를 올바르게 확인하려면 fbpacktool.py 및 종속되는 다른 두 개의 Python 파일(fbpack.py 및 packedstruct.py)을 다운로드하여 bootloader.img
의 구성요소를 압축 해제해야 합니다. VBMeta 구조체에 개별적으로 설명되어 있기 때문입니다. 언패커가 있으면 fbpacktool.py
를 사용하여 부트로더 이미지를 압축해제할 수 있습니다. 예를 들면 다음과 같습니다.
computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img
디렉터리에 추가 .img 파일이 표시됩니다.
이제 avbtool.py
를 사용하여 다양한 파티션의 서명이 일치하는지 수동으로 확인할 수 있습니다.
computer:dir_containing_unzipped_images$ avbtool.py verify_image --image vbmeta.img --follow_chain_partitions
Verifying image vbmeta.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta.img
vbmeta_system: Chained but ROLLBACK_SLOT (which is 1) and KEY (which has sha1 df529646b7225015196a714006346f0768b87fcf) not specified
--
Verifying image vbmeta_system.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_system.img
product: Successfully verified sha256 hashtree of product.img for image of 2700468224 bytes
system: Successfully verified sha256 hashtree of system.img for image of 878493696 bytes
system_ext: Successfully verified sha256 hashtree of system_ext.img for image of 251334656 bytes
vbmeta_vendor: Chained but ROLLBACK_SLOT (which is 3) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image vbmeta_vendor.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_vendor.img
vendor: Successfully verified sha256 hashtree of vendor.img for image of 472940544 bytes
boot: Chained but ROLLBACK_SLOT (which is 2) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image boot.img using embedded public key
vbmeta: Successfully verified footer and SHA256_RSA4096 vbmeta struct in boot.img
boot: Successfully verified sha256 hash of boot.img for image of 24481792 bytes
abl: Successfully verified sha256 hash of abl.img for image of 1744896 bytes
bl1: Successfully verified sha256 hash of bl1.img for image of 12288 bytes
bl2: Successfully verified sha256 hash of bl2.img for image of 544768 bytes
bl31: Successfully verified sha256 hash of bl31.img for image of 86016 bytes
dtbo: Successfully verified sha256 hash of dtbo.img for image of 2152234 bytes
gsa: Successfully verified sha256 hash of gsa.img for image of 262144 bytes
ldfw: Successfully verified sha256 hash of ldfw.img for image of 4096000 bytes
pbl: Successfully verified sha256 hash of pbl.img for image of 49152 bytes
tzsw: Successfully verified sha256 hash of tzsw.img for image of 4304896 bytes
vendor_boot: Successfully verified sha256 hash of vendor_boot.img for image of 25718784 bytes
vendor_dlkm: Successfully verified sha256 hashtree of vendor_dlkm.img for image of 54505472 bytes
오류 또는 실패 메시지가 표시되지 않으면 다운로드한 이미지의 VBMeta가 확인된 것입니다.
자동 페이로드 생성
편의를 위해 사용할 수 있는 Python 스크립트도 제공해 드렸습니다. 이 도구를 사용하면 파일을 수동으로 가져와서 압축을 풀지 않고도 초기 이미지의 URL만 지정하면 됩니다.
computer:dir_to_avb_repo/tools/transparency$ python3 ./pixel_factory_image_verify.py https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Fetching file from: https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Successfully downloaded file.
Successfully unpacked factory image.
Successfully unpacked factory image partitions.
Successfully unpacked bootloader image.
Successfully verified VBmeta.
Successfully extracted build fingerprint.
Successfully calculated VBMeta Digest.
The build fingerprint for factory image is: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
The VBMeta Digest for factory image is: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
A corresponding "payload.txt" file has been created.
위의 명령어를 실행하면 공장 출고 이미지 번들을 다운로드하고 번들의 압축을 푼 후 서명된 파티션의 서명을 확인합니다. 인증에 성공하면 payload.txt
라는 새 파일이 생성되며 콘텐츠는 다음과 같이 표시됩니다.
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
payload.txt가 생성되면 이미지 포함 확인 단계를 시작할 수 있습니다.
이미지 포함 확인 (포함 증거)
페이로드를 구성한 후 셸 변수 (예: $PAYLOAD_PATH
)를 페이로드 경로를 가리키도록 설정합니다.
포함 증명 도구가 Android 오픈소스 프로젝트 내 avb
저장소에 게시되었습니다. 실행하려면 다음 단계를 따르세요.
computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=../payload.txt
computer:external/avb/tools/transparency/verify$ go build cmd/verifier/verifier.go
computer:external/avb/tools/transparency/verify$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=pixel
검사기는 체크포인트와 로그 콘텐츠 (타일 디렉터리에 있음)를 사용하여 이미지 페이로드가 투명성 로그에 있는지, 즉 Google에서 게시했는지 확인합니다.
명령어의 출력은 stdout에 기록됩니다.
OK. inclusion check success!
: 이미지가 로그에 포함된 경우FAILURE
를 입력합니다.