이번 포스팅에서는 앱에 사용된 디펜던시의 취약점을 확인하는 방법에 대해 알아보도록 하겠습니다.
안드로이드 앱을 만드는 과정에는 많은 오픈소스 라이브러리들이 사용되게 되는데요, 이러한 오픈소스 라이브러리는 잘 관리되는 경우도 있지만 버그나 보안면에서 문제가 있는 경우도 있습니다.
OWASP(Open Web Application Security Project) 재단에서는 프로젝트의 디펜던시에 포함된 취약점을 탐지하는 SCA(Software Composition Analysis) 도구를 제공하고 있습니다. Dependency-Check 라는 이름의 이 도구는 디펜던시를 분석하여 CPE(Common Platform Enumeration) 식별자를 확인한 뒤 그에 연결된 CVE(Common Vulnerability and Exposure) 목록을 나열해 줍니다. 이 때 CVE 데이터는 NIST의 National Vulnerability Database를 참조하게 됩니다.
안드로이드 프로젝트에서는 그래들을 이용해 검사를 수행할 수 있습니다. 여기서는 저의 Modern Android Development 인프런 강의에서 만들어 본 BookSearchApp에 기능을 적용해 보도록 하겠습니다. 우선은 project 레벨의 build.gradle에 Dependency-Check를 추가해 줍니다.
1
2
3
|
plugins {
id("org.owasp.dependencycheck") version "8.0.1" apply false
}
|
다음은 app레벨의 build.gradle에서 플러그인을 사용하도록 선언해 줍니다.
1
2
3
|
plugins {
id("org.owasp.dependencycheck")
}
|
그러면 다음 명령으로 검사를 수행할 수 있습니다.
1
|
./gradlew dependencyCheckAnalyze
|
작업이 끝나면 다음과 같이 취약점이 발견된 검사결과가 간략하게 표시됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
One or more dependencies were identified with known vulnerabilities in app:
checker-3.1.1.jar/META-INF/maven/com.google.guava/guava/pom.xml (pkg:maven/com.google.guava/guava@28.1-jre, cpe:2.3:a:google:guava:28.1:*:*:*:*:*:*:*) : CVE-2020-8908
checker-3.1.1.jar/META-INF/maven/org.apache.bcel/bcel/pom.xml (pkg:maven/org.apache.bcel/bcel@6.2.0.2, cpe:2.3:a:apache:commons_bcel:6.2.0.2:*:*:*:*:*:*:*) : CVE-2022-42920
checker-3.1.1.jar/META-INF/maven/org.apache.commons/commons-text/pom.xml (pkg:maven/org.apache.commons/commons-text@1.8, cpe:2.3:a:apache:commons_text:1.8:*:*:*:*:*:*:*) : CVE-2022-42889
datastore-preferences-core-1.0.0.jar/META-INF/maven/com.google.protobuf/protobuf-javalite/pom.xml (pkg:maven/com.google.protobuf/protobuf-javalite@3.10.0, cpe:2.3:a:google:protobuf-java:3.10.0:*:*:*:*:*:*:*, cpe:2.3:a:google:protobuf-javalite:3.10.0:*:*:*:*:*:*:*) : CVE-2022-3171, CVE-2021-22569
gson-2.8.0.jar (pkg:maven/com.google.code.gson/gson@2.8.0, cpe:2.3:a:google:gson:2.8.0:*:*:*:*:*:*:*) : CVE-2022-25647
guava-27.0.1-android.jar (pkg:maven/com.google.guava/guava@27.0.1-android, cpe:2.3:a:google:guava:27.0.1:*:*:*:*:*:*:*) : CVE-2020-8908
guava-28.2-android.jar (pkg:maven/com.google.guava/guava@28.2-android, cpe:2.3:a:google:guava:28.2:*:*:*:*:*:*:*) : CVE-2020-8908
jsoup-1.12.2.jar (pkg:maven/org.jsoup/jsoup@1.12.2, cpe:2.3:a:jsoup:jsoup:1.12.2:*:*:*:*:*:*:*) : CVE-2021-37714, CVE-2022-36033
kotlin-stdlib-1.5.32.jar (pkg:maven/org.jetbrains.kotlin/kotlin-stdlib@1.5.32, cpe:2.3:a:jetbrains:kotlin:1.5.32:*:*:*:*:*:*:*) : CVE-2022-24329
protobuf-lite-3.0.1.jar (pkg:maven/com.google.protobuf/protobuf-lite@3.0.1, cpe:2.3:a:google:protobuf-java:3.0.1:*:*:*:*:*:*:*) : CVE-2022-3171, CVE-2021-22569
room-compiler-processing-2.4.2.jar (pkg:maven/androidx.room/room-compiler-processing@2.4.2, cpe:2.3:a:processing:processing:2.4.2:*:*:*:*:*:*:*) : CVE-2018-1000840
symbol-processing-api-1.6.10-1.0.2.jar (pkg:maven/com.google.devtools.ksp/symbol-processing-api@1.6.10-1.0.2, cpe:2.3:a:processing:processing:1.6.10.1:*:*:*:*:*:*:*) : CVE-2018-1000840
See the dependency-check report for more details.
|
구체적인 검사 내용은 다음 경로에 html
형식으로 저장됩니다.
1
|
./app/build/reports/dependency-check-report.html
|
결과를 보면 kotlin-stdlib-1.5.32.jar
에서 CVE-2022-24329
취약점이 검출되었다고 나오네요. kotlin 1.6.0 이하에서만 발생하는 취약점이라는 설명이 있으니 코틀린 버전을 업데이트하면 취약점을 없앨 수 있겠네요.
그 중에는 제가 직접 추가하지 않은 guava의 취약점도 검출되는데, 이것은 다른 디펜던시의 하위 디펜던시로 추가된 것입니다. 다음 명령을 실행하면 전체 디펜던시의 구조를 확인할 수 있습니다.
1
|
./gradlew app:dependencies
|
실행 결과 guava는 truth에 종속된 디펜던시라는 것을 알 수 있으니 truth를 업데이트하면 취약점을 해결할 수 있겠죠.
1
2
3
4
|
./gradlew app:dependencies
+--- androidx.test.ext:truth:1.4.0
| +--- androidx.test:core:1.4.0 (*)
| +--- com.google.guava:guava:27.0.1-android
|
이렇게 해서 안드로이드 프로젝트에 포함된 디펜던시의 취약점을 검사하는 방법에 대해 알아보았습니다.