딥 링크의 안전하지 않은 사용

OWASP 카테고리: MASVS-PLATFORM: 플랫폼 상호작용

개요

딥 링크와 관련된 보안 위험은 모바일 애플리케이션 내에서 원활한 탐색과 상호작용을 지원하는 핵심 기능에서 비롯됩니다. 딥 링크 취약점은 딥 링크의 구현 또는 처리에 취약점이 있기 때문에 발생합니다. 악의적인 행위자가 권한이 있는 기능이나 데이터에 액세스하는 데 이러한 결함을 악용하여 정보 유출, 개인 정보 보호 위반, 승인되지 않은 조치로 이어질 수 있습니다. 공격자는 딥 링크 도용 및 데이터 유효성 검사 공격과 같은 다양한 기법을 통해 이러한 취약점을 악용할 수 있습니다.

영향

적절한 딥 링크 유효성 검사 메커니즘이 없거나 딥 링크가 안전하게 사용되지 않으면 악의적인 사용자가 취약한 애플리케이션의 권한 컨텍스트 내에서 호스트 유효성 검사 우회, 교차 앱 스크립팅, 원격 코드 실행과 같은 공격을 실행하는 데 도움이 될 수 있습니다. 애플리케이션의 특성에 따라 민감한 정보 또는 함수에 대한 무단 액세스가 발생할 수 있습니다.

Android는 설계상 여러 앱이 동일한 딥 링크 URI에 인텐트 필터를 등록할 수 있도록 허용합니다. 악성 앱이 앱을 위한 딥 링크를 가로채지 못하게 하려면 애플리케이션의 AndroidManifestintent-filterandroid:autoVerify 속성을 구현합니다. 이를 통해 사용자는 딥 링크 처리를 위해 선호하는 앱을 선택하여 의도한 작업을 보장하고 악성 애플리케이션이 자동으로 해석하지 못하도록 할 수 있습니다.

Android 12에서는 보안을 개선하기 위해 웹 인텐트를 더 엄격하게 처리하는 기능을 도입했습니다. 이제 Android App Links나 시스템 설정에서 사용자 선택을 통해 특정 도메인의 링크를 처리하려면 앱을 인증해야 합니다. 이렇게 하면 앱이 처리해서는 안 되는 링크를 도용하지 못합니다.

앱의 링크 처리 인증을 사용 설정하려면 다음 형식과 일치하는 인텐트 필터를 추가합니다. 이 예는 Android App Links 확인 문서에서 가져온 것입니다.

  <!-- Make sure you explicitly set android:autoVerify to "true". -->
  <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
  
      <!-- If a user clicks on a shared link that uses the "http" scheme, your
           app should be able to delegate that traffic to "https". -->
      <data android:scheme="http" />
      <data android:scheme="https" />
  
      <!-- Include one or more domains that should be verified. -->
      <data android:host="..." />
  </intent-filter>

딥 링크에는 추가 작업을 실행하는 등 타겟 인텐트에 제공되는 추가 매개변수가 포함될 수 있습니다. 안전한 딥 링크 처리의 기반은 엄격한 데이터 유효성 검사입니다. 딥 링크에서 수신되는 모든 데이터는 개발자가 꼼꼼하게 검증하고 정리하여 악성 코드나 값이 합법적인 애플리케이션 내에 삽입되는 것을 방지해야 합니다. 이는 딥 링크 매개변수의 값을 예상 값의 사전 정의된 허용 목록과 비교하여 구현할 수 있습니다.

앱은 민감한 정보를 노출하기 전에 인증 상태, 승인 등 다른 관련 내부 상태를 확인해야 합니다. 게임 한 레벨을 완료하면 보상을 제공하는 것을 예로 들 수 있습니다. 이 경우 레벨을 완료했다는 기본 조건을 확인하고 완료하지 않은 경우 기본 화면으로 리디렉션하는 것이 좋습니다.

리소스