확인 방법

이 페이지에서는 Pixel 기기에서 정식 버전의 Pixel 이미지를 실행할 수 있도록 하는 방법 (신뢰도가 가장 높음)을 설명합니다. 여기에는 컴퓨터에 공장 출고 시 이미지를 다운로드하고 다운로드한 아티팩트를 기기에 플래시하기 전에 다운로드한 아티팩트에 로그 포함 증명을 실행하는 작업이 포함됩니다.

Pixel 공장 출고 시 이미지 확인 방법

인증 전제 조건

아티팩트 (펌웨어 또는 APK)가 클레임과 일치하는지 확인하기 전에 네트워크에 연결된 컴퓨터에서 다음 도구를 사용할 수 있는지 확인합니다. 인증 대상에 따라 일부 도구가 필요하지 않을 수도 있습니다.

Golang

인증 도구 는 Go로 작성됩니다. 빌드하려면 Go 사이트에서 Go 1.24 이상을 설치합니다. Go 사이트에서

Android 디버그 브리지 (ADB)

ADB는 Android 기기와 통신하여 이미지를 검사하거나 APK를 추출하는 도구로, Android SDK 플랫폼 도구 웹사이트에서 사용할 수 있습니다.

포함 증명 확인자

포함 증명 확인자는 투명성 로그를 쿼리하고 아티팩트가 로그에 포함되어 있는지 출력하는 Go 모듈입니다. android-binary-transparency GitHub 저장소에 게시됩니다. https://github.com/android/android-binary-transparency/tree/main

AOSP avb 저장소를 클론하려면 다음을 실행합니다.

computer:~$ git clone https://android.googlesource.com/platform/external/avb

android-binary-transparency GitHub 저장소를 클론하려면 다음을 실행합니다.

computer:~$ git clone https://github.com/android/android-binary-transparency

AAPT2

AAPT2 (Android Asset Packaging Tool)는 Android 앱의 리소스를 컴파일하고 패키징하는 데 사용되는 빌드 도구입니다. Android SDK 빌드 도구 버전 26.0.2 이상에서 독립형 도구로 찾을 수 있습니다.

bundletool

bundletool은 Android App Bundle (AAB)을 빌드하는 데 사용되는 도구입니다. APK 코드 서명을 확인하는 데 사용할 수도 있습니다. GitHub에서 다운로드할 수 있습니다.

wget 또는 curl

wgetcurl 은 인터넷에서 파일을 가져오거나 다운로드하는 데 사용할 수 있는 도구입니다. 인증 스크립트가 이러한 도구를 사용할 수 있으므로 이러한 도구 중 하나를 설치해야 합니다.

Avbtool

avbtool 은 공장 출고 시 이미지의 VBMeta 다이제스트를 계산하고 바이너리를 확인하는 데 사용됩니다. 포함 증명 확인자 섹션에 표시된 대로 avb 저장소를 클론한 후 클론된 avb 디렉터리 내에서 avbtool.py를 찾을 수 있습니다. 이 디렉터리를 $PATH 환경 변수에 추가해야 합니다.

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Fbpacktool

fbpacktool 은 Pixel의 bootloader.img에서 개별 구성요소를 압축 해제하는 데 사용되는 Python 스크립트입니다. APK를 확인하는 경우 이 도구가 필요하지 않습니다. 이 도구는 avbtool.py가 인증에 필요한 이미지를 검색할 수 있도록 하므로 중요합니다.

이 도구를 사용하려면 다음 세 가지 Python 스크립트를 avbtool.py가 있는 디렉터리에 다운로드하고 fbpacktool.py를 실행 파일로 만들고 편의를 위해 fbpacktool.pyfbpacktool이라는 심볼릭 링크를 만들어야 합니다.

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 공장 출고 시 이미지 웹사이트에서 다운로드한 이미지를 확인하려면 먼저 빌드 지문 및 VBMeta 다이제스트에서 해당 이미지에 해당하는 페이로드를 구성해야 합니다. 아래에 설명된 대로 수동 또는 자동의 두 가지 옵션이 있습니다.

  • 빌드 지문: 공장 출고 시 이미지의 문자열 식별자
    • 예: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • VBMeta 다이제스트: 공장 출고 시 이미지의 여러 부분을 함께 연결하는 SHA-256 암호화 다이제스트
    • 예: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

수동 페이로드 구성

인증을 위한 페이로드를 수동으로 생성하려면 한 줄에 빌드 지문이 포함된 텍스트 파일 payload.txt을 만든 다음 다음 줄에 VBMeta 다이제스트를 포함하고 빈 새 줄을 추가해야 합니다 (정확한 형식은 로그 콘텐츠 섹션 참고).

공장 출고 시 이미지 웹사이트의 단계를 따른 후 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.pypackedstruct.py) 을 다운로드하여 bootloader.img의 구성요소를 압축 해제해야 합니다. 이러한 파일은 VBMeta struct에 개별적으로 설명되어 있습니다. 압축 해제 프로그램이 있으면 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

확인자는 체크포인트와 로그 콘텐츠 (tile 디렉터리에 있음)를 사용하여 이미지 페이로드가 투명성 로그에 있는지, 즉 Google에서 게시했는지 확인합니다.

명령어의 출력이 stdout에 기록됩니다.

  • 이미지가 로그에 포함된 경우 OK. inclusion check success!
  • 포함되지 않은 경우 FAILURE