손상된 Gradle 종속 항목은 보안 위험을 야기합니다. 악의적인 행위자는 종속 항목 확인 중에 중간자 공격을 통해 수정된 종속 항목을 빌드 프로세스에 삽입할 수 있습니다.
빌드 종속 항목 (라이브러리)이 손상되면 애플리케이션이 기기에서 실행되는 방식에 영향을 줄 수 있습니다. 플러그인 종속 항목이 손상되면 빌드가 작동하는 방식이 변경되거나 빌드 머신에서 외부 명령어가 실행될 수도 있습니다.
이 문제를 완화하려면 빌드에서 종속 항목 확인을 사용 설정하면 됩니다.
라이브러리 체크섬 및 서명
라이브러리 작성자는 다운로드하는 종속 항목의 진위성을 확인하는 데 도움이 되는 두 가지 메타데이터를 제공할 수 있습니다. gradle/verification-metadata.xml
라는 파일을 정의하여 승인할 값을 지정합니다. 다음을 포함할 수 있습니다.
체크섬: 전송 중에 아티팩트가 손상되지 않았는지 확인하는 데 사용할 수 있는 아티팩트의 해시입니다. 체크섬이 신뢰할 수 있는 소스에서 가져온 경우 아티팩트가 변경되지 않았음을 나타내므로 중간자 공격을 줄일 수 있습니다.
단점은 체크섬이 아티팩트에서 계산되므로 출시마다 변경되므로 업그레이드할 때마다
gradle/verification-metadata.xml
를 업데이트해야 한다는 점입니다.서명: 종속 항목 사용자가 지정된 아티팩트의 공개 키를 지정하여 이 아티팩트가 해당 공개 키의 인증된 소유자인 라이브러리 작성자가 빌드하고 서명했는지 확인할 수 있습니다. 이는 라이브러리 작성자에게 더 많은 작업이지만 비공개 키 자체가 손상되지 않는 한 서명은 라이브러리가 적법함을 나타냅니다.
라이브러리 작성자가 아티팩트의 각 버전에 동일한 키로 서명하는 경우 업그레이드할 때
gradle/verification-metadata.xml
를 업데이트할 필요가 없습니다.
종속 항목 확인 사용 설정
Gradle 종속 항목 확인은 빌드 중에 체크섬과 서명을 비교합니다.
다음이 포함된 gradle/verification-metadata.xml
파일을 만듭니다.
<?xml version="1.0" encoding="UTF-8"?>
<verification-metadata
xmlns="https://schema.gradle.org/dependency-verification"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://schema.gradle.org/dependency-verification https://schema.gradle.org/dependency-verification/dependency-verification-1.3.xsd">
<configuration>
<!-- verify .pom and .module files -->
<verify-metadata>true</verify-metadata>
<!-- verify .asc PGP files that come with the artifacts -->
<verify-signatures>true</verify-signatures>
<!-- use human readable keyring format -->
<keyring-format>armored</keyring-format>
<!-- read keys in a local file, fewer requests to network -->
<key-servers enabled="false">
<key-server uri="https://keyserver.ubuntu.com"/>
<key-server uri="https://keys.openpgp.org"/>
</key-servers>
</configuration>
<components>
</components>
</verification-metadata>
이 숫자는 시작점으로 삼을 수 있으며 곧 업데이트될 예정입니다.
./gradlew assembleDebug
를 실행하여 빌드가 어떻게 변경되는지 확인합니다. 다음과 같은 메시지가 표시됩니다.
* What went wrong:
Error resolving plugin [id: 'com.android.application', version: '8.7.3', apply: false]
> Dependency verification failed for configuration 'detachedConfiguration1'
One artifact failed verification: com.android.application.gradle.plugin-8.7.3.pom ...
This can indicate that a dependency has been compromised ...
Open this report for more details: .../dependency-verification-report.html
Gradle에서 명시적으로 승인하지 않은 종속 항목 버전을 가져오고 있다고 알려줍니다.
체크섬 및 서명 데이터 부트스트랩
초기 설정 신뢰할 수 있는 키와 구성요소를 부트스트랩할 수 있습니다. 이 프로세스는 프로젝트에서 사용하는 모든 라이브러리의 현재 서명과 체크섬을 수집합니다.
다음을 실행하여 초기 메타데이터 생성
./gradlew --write-verification-metadata pgp,sha256 --export-keys help
이 명령어는 Gradle에 이 프로젝트에서 사용되는 모든 종속 항목의 PGP 키 및 대체 체크섬 목록을 빌드하도록 지시합니다. verification-metadata.xml에 다음과 같은 여러 항목이 포함된 변경사항이 표시됩니다.
<trusted-key id="8461EFA0E74ABAE010DE66994EB27DB2A3B88B8B">
<trusting group="androidx.activity"/>
</trusted-key>
이렇게 하면 Gradle이 Maven 그룹 androidx.activity
의 종속 항목을 발견하면 함께 제공되는 .asc 파일(저장소에 저장된 서명)이 해당 키와 일치하는지 확인합니다.
부트스트랩을 실행하면 빌드에 사용되는 공개 PGP 키가 포함된 gradle/verification-keyring.keys
도 생성됩니다. 이러한 두 파일을 모두 버전 추적 시스템에 체크인합니다. 향후 verification-metadata.xml
또는 verification-keyring.keys
를 수정하는 변경사항은 신중하게 검토해야 합니다.
신뢰할 수 있는 키에서 버전 제거
서명 키는 라이브러리 출시 간에 거의 변경되지 않습니다. gradle/verification-metadata.xml
파일의 생성된 데이터에는 버전 세부정보가 포함되어 있으므로 새 종속 항목 버전마다 키 정보를 다시 추가해야 합니다.
이를 방지하고 키가 라이브러리의 모든 버전에 적용되도록 지정하려면 버전 사양을 삭제하세요.
Android 스튜디오 편집기에서 Edit > Find > Replace...를 사용하여 정규 표현식을 사용하여 신뢰할 수 있는 키의 모든 버전 사양을 바꿉니다.
- 출발:
<trusted-key(.*) version=\".*\"/>
- 받는사람:
<trusted-key$1/>
Android 스튜디오 동기화
지금까지 명령줄 빌드는 작동하지만 Android 스튜디오에서 동기화하려고 하면 다음과 같은 오류가 표시됩니다.
A build operation failed.
Dependency verification failed for configuration ':app:detachedConfiguration3'
One artifact failed verification: gradle-8.10.2-src.zip (gradle:gradle:8.10.2) from repository Gradle distributions
If the artifacts are trustworthy, you will need to update the gradle/verification-metadata.xml file. For more on how to do this, please refer to https://docs.gradle.org/8.10.2/userguide/dependency_verification.html#sec:troubleshooting-verification in the Gradle documentation.
Android 스튜디오에서 다른 소스 및 문서와 함께 Gradle 소스를 다운로드하려고 합니다. 이 문제를 해결하는 가장 쉬운 방법은 모든 소스 및 javadoc을 신뢰하는 것입니다.
gradle/verification-metadata.xml
에 <trusted-artifacts>
를 추가합니다.
<verification-metadata ...>
<configuration>
<trusted-artifacts>
<trust file=".*-javadoc[.]jar" regex="true"/>
<trust file=".*-sources[.]jar" regex="true"/>
<trust group="gradle" name="gradle"/>
</trusted-artifacts>
...
</configuration>
</verification-metadata>
이제 명령줄과 Android 스튜디오에서 빌드가 제대로 작동합니다.