젯팩 네비게이션 취약점을 해결하는 방법

젯팩 네비게이션 취약점을 해결하는 방법
Cozy CodingPosted On Aug 21, 20242 min read

Jetpack Navigation Android 라이브러리에 가능한 취약점이 있을 수 있습니다. 그러나 쉬운 해결 방법이 있습니다.

몇 일 전에 한 기사에서 어떤 공격자가 Jetpack Navigation 라이브러리의 암시적 딥 링크를 이용할 수 있다는 것을 세계에 보여줬어요. 이 기사는 문제에 대해 자세히 다루지만, Google이 의도대로 작동한다고 생각하기 때문에 고치지 않을 가능한 취약성을 완화할 수 있는 해결 방법에 대한 내용이 부족해요.

문제점

당신의 슈퍼 보안 응용 프로그램에서 다음 예제를 고려해보세요:

사용자가 애플리케이션을 열면 "홈" 화면으로 이동하여 "프라이빗" 화면에 대한 게이트키퍼 역할을 합니다.

Jetpack Navigation 라이브러리의 작동 방식은 각 목적지마다 android-app://androidx.navigation/$route 형식의 내부 암묵적 딥 링크가 생성됩니다. 이는 라이브러리 내부에서 navController.navigate("...")가 호출될 때 화면으로 이동하기 위해 사용됩니다.

문제는 이 딥 링크를 통해 앱 외부에서 접근할 수 있다는 점입니다. 공격자가 대상 응용프로그램에 대해 조금 알고 있으면(예: 패키지 이름, 액티비티 이름, 이동하려는 화면 경로), 게이트키퍼 스크린이 제공하는 보안을 우회할 수 있을 수도 있습니다.

위 코드를 호출하면 "홈" 화면을 표시하지 않고 대상 앱의 "프라이빗" 화면을 열 수 있어서 보안이 해제됩니다.

문제 해결 방법

다른 네비게이션 라이브러리를 사용하지 않는 두 가지 솔루션이 있습니다:

  • Google에서 추천하는 조건부 네비게이션 구현
  • 가능한 공격을 방지하는 해결책 사용

우리는 대안을 보여주기 위해 2번을 선택했습니다. 공격자가 특정 URI를 사용해 화면에 접근해야 한다는 것을 알기 때문에, 우리 앱의 인텐트로부터 이를 걸러낼 수 있습니다.

먼저, 네비게이션 링크를 만나면 데이터 세트를 제거하는 Intent용 확장 기능을 소개합니다:

그런 다음 Activity.onCreate(...)에서 setContent '...' 호출 전에 이 기능을 호출하고 Activity의 Intent를 반환된 값으로 설정합니다:

매니페스트에서 기본값 이외의 launchMode를 사용하는 경우, onNewIntent(...) 함수를 재정의해야 할 수도 있습니다 (자세한 내용은 deep link 처리를 참조하십시오):

여기까지입니다! 이제 악의적 공격자가 언급한 공격으로 개인 화면에 액세스하려고 시도하면 NavController가 처리하기 전에 deep link 데이터가 Intent에서 제거됩니다.

대상 및 공격자 애플리케이션이 포함된 테스트 프로젝트는 https://github.com/gregkorossy/jetpack-navigation-vulnerability-workaround에서 사용 가능합니다.