OWASP 카테고리: MASVS-CODE: 코드 품질
개요
맞춤 권한과 관련된 위험은 맞춤 권한 정의가 누락되거나 잘못된 철자가 사용되거나 매니페스트 내에서 상응하는 android:protectionLevel
속성이 오용될 때 발생합니다.
예를 들어 동일한 이름이지만 악성 앱에서 정의하고 다른 보호 수준이 적용된 맞춤 권한을 만들어 이러한 위험을 악용할 수 있습니다.
맞춤 권한은 다른 앱과 리소스 및 기능을 공유할 수 있도록 설계되었습니다. 맞춤 권한을 합법적으로 사용하는 예는 다음과 같습니다.
- 두 개 이상의 앱 간의 프로세스 간 통신 (IPC) 제어
- 서드 파티 서비스에 액세스
- 앱의 공유 데이터에 대한 액세스 제한
영향
이 취약점을 악용하면 악성 앱이 원래 보호하려는 리소스에 액세스할 수 있습니다. 취약성이 미치는 영향은 보호 중인 리소스와 원래 애플리케이션 서비스의 관련 권한에 따라 다릅니다.
위험: 맞춤 권한 오타
맞춤 권한이 매니페스트에 선언되었지만 오타로 인해 내보낸 Android 구성요소를 보호하는 데 다른 맞춤 권한이 사용됩니다. 악의적인 애플리케이션은 다음 중 하나를 통해 권한의 철자가 잘못된 애플리케이션을 활용할 수 있습니다.
- 먼저 해당 권한 등록
- 후속 애플리케이션에서 맞춤법 예상
이로 인해 애플리케이션이 리소스에 대한 무단 액세스 또는 피해자 애플리케이션 제어가 허용될 수 있습니다.
예를 들어 취약한 앱이 READ_CONTACTS
권한을 사용하여 구성요소를 보호하려고 하지만 실수로 권한을 READ_CONACTS
로 잘못 입력합니다. 악성 앱은 READ_CONACTS
를 소유하고 있지 않으므로 READ_CONACTS
를 소유하고 보호된 구성요소에 액세스할 수 있습니다. 이 취약점의 또 다른 일반적인 변형은 android:permission=True
입니다. true
및 false
와 같은 값은 대소문자와 관계없이 권한 선언에 유효하지 않은 입력이며 다른 맞춤 권한 선언 오타와 유사하게 취급됩니다. 이 문제를 해결하려면 android:permission
속성의 값을 유효한 권한 문자열로 변경해야 합니다. 예를 들어 앱이 사용자의 연락처에 액세스해야 하는 경우 android:permission
속성의 값은 android.permission.READ_CONTACTS
여야 합니다.
완화 조치
Android 린트 검사
맞춤 권한을 선언할 때 Android 린트 검사를 사용하여 코드에서 오타 및 기타 잠재적 오류를 찾으세요.
이름 지정 규칙
일관된 이름 지정 규칙을 사용하여 오타를 더 눈에 띄게 만듭니다. 앱 매니페스트의 맞춤 권한 선언에서 오타가 있는지 주의 깊게 확인합니다.
위험: 분리된 권한
권한은 앱의 리소스를 보호하는 데 사용됩니다. 앱이 리소스에 액세스하는 데 필요한 권한을 선언할 수 있는 위치는 두 가지가 있습니다.
- AndroidManifest.xml: AndroidManifest.xml 파일에 사전 정의된 권한입니다 (지정하지 않으면
<application>
권한이 사용됨). 예: 제공자 권한, 수신기 권한, 활동 권한, 서비스 권한. - 코드: 런타임 코드에 등록됩니다. 예:
registerReceiver()
.
그러나 이러한 권한이 기기의 APK 매니페스트에 있는 상응하는 <permission>
태그로 정의되지 않는 경우도 있습니다. 이 경우 고아 권한이라고 합니다. 이러한 상황은 다음과 같은 여러 가지 이유로 발생할 수 있습니다.
- 매니페스트의 업데이트와 권한 확인이 포함된 코드 간에 동기화되지 않을 수 있습니다.
- 권한이 있는 APK가 빌드에 포함되지 않았거나 잘못된 버전이 포함되었을 수 있습니다.
- 검사 또는 매니페스트의 권한 이름이 잘못 표기되었을 수 있습니다.
악성 앱이 고아 권한을 정의하고 획득할 수 있습니다. 이 경우 구성요소를 보호하기 위해 고아 권한을 신뢰하는 권한이 있는 애플리케이션이 손상될 수 있습니다.
권한 있는 앱이 구성요소를 보호하거나 제한하는 데 이 권한을 사용하는 경우 악성 앱에 해당 구성요소에 대한 액세스 권한이 부여될 수 있습니다. 예를 들어 권한으로 보호되는 활동을 실행하거나, 콘텐츠 제공자에 액세스하거나, 고아 권한으로 보호되는 broadcast receiver에 브로드캐스트하는 경우가 있습니다.
또한 권한이 있는 애플리케이션이 악성 앱을 합법적인 앱으로 속아 파일이나 콘텐츠를 로드하는 상황이 발생할 수 있습니다.
완화 조치
앱에서 구성요소를 보호하는 데 사용하는 모든 맞춤 권한이 매니페스트에도 정의되어 있는지 확인합니다.
앱은 콘텐츠 제공자에 대한 액세스를 보호하기 위해 맞춤 권한 my.app.provider.READ
및 my.app.provider.WRITE
를 사용합니다.
XML
<provider android:name="my.app.database.CommonContentProvider" android:readPermission="my.app.provider.READ" android:writePermission="my.app.provider.WRITE" android:exported="true" android:process=":myappservice" android:authorities="my.app.database.contentprovider"/>
또한 앱은 이러한 맞춤 권한을 정의하고 사용하여 다른 악성 앱이 이를 실행하지 못하도록 합니다.
XML
<permission android:name="my.app.provider.READ"/>
<permission android:name="my.app.provider.WRITE"/>
<uses-permission android:name="my.app.provider.READ" />
<uses-permission android:name="my.app.provider.WRITE" />
위험: android:protectionLevel 오용
이 속성은 권한의 잠재적 위험 수준을 설명하고 권한 부여 여부를 결정할 때 시스템에서 따라야 하는 절차를 나타냅니다.
완화 조치
정상 또는 위험한 보호 수준 피하기
권한에 정상 또는 위험한 protectionLevel
를 사용하면 대부분의 앱에서 권한을 요청하고 얻을 수 있습니다.
- 'normal'의 경우 선언만 하면 됨
- '위험'은 많은 사용자의 승인을 받습니다.
따라서 이러한 protectionLevels
는 보안 수준이 낮습니다.
서명 권한 사용 (Android 10 이상)
가능하면 서명 보호 수준을 사용합니다. 이 기능을 사용하면 권한을 생성한 앱과 동일한 인증서로 서명된 다른 앱만 이러한 보호된 기능에 액세스할 수 있습니다. 재사용되지 않은 전용 서명 인증서를 사용하고 있는지 확인하고 키 저장소에 안전하게 저장합니다.
매니페스트에서 다음과 같이 맞춤 권한을 정의합니다.
XML
<permission
android:name="my.custom.permission.MY_PERMISSION"
android:protectionLevel="signature"/>
다음과 같이 활동 등의 액세스를 이 맞춤 권한이 부여된 앱으로만 제한합니다.
XML
<activity android:name=".MyActivity" android:permission="my.custom.permission.MY_PERMISSION"/>
그러면 이 맞춤 권한을 선언한 앱과 동일한 인증서로 서명된 다른 모든 앱에 .MyActivity
활동에 대한 액세스 권한이 부여되며 매니페스트에서 다음과 같이 선언해야 합니다.
XML
<uses-permission android:name="my.custom.permission.MY_PERMISSION" />
맞춤 서명 권한에 주의하기 (Android 10 미만)
앱이 Android 10 미만을 타겟팅하는 경우 앱의 사용자 지정 권한이 제거될 때마다(예: 제거 또는 업데이트로 인해) 이러한 사용자 지정 권한을 계속 사용하여 검사를 우회할 수 있는 악성 앱이 있을 수 있습니다. 이는 Android 10에서 해결된 권한 상승 취약점 (CVE-2019-2200
)으로 인해 발생합니다.
이는 맞춤 권한보다 서명 확인을 권장하는 이유 중 하나입니다 (경합 상태의 위험과 함께).
위험: 경합 상태
합법적인 앱 A
이 다른 X
앱에서 사용하는 서명 맞춤 권한을 정의했지만 이후에 제거된 경우, 악성 앱 B
은 다른 protectionLevel
(예: 일반)로 동일한 맞춤 권한을 정의할 수 있습니다. 이렇게 하면 B
가 A
앱과 동일한 인증서로 서명하지 않고도 X
앱에서 맞춤 권한으로 보호되는 모든 구성요소에 액세스할 수 있습니다.
B
가 A
보다 먼저 설치되는 경우에도 마찬가지입니다.
완화 조치
구성요소를 제공하는 앱과 동일한 서명으로 서명된 앱에서만 사용할 수 있도록 하려면 해당 구성요소에 대한 액세스를 제한하는 맞춤 권한을 정의하지 않아도 됩니다. 이 경우 서명 검사를 사용할 수 있습니다. 앱 중 하나가 다른 앱에 요청을 하면 두 번째 앱은 요청을 따르기 전에 두 앱이 동일한 인증서로 서명되었는지 확인할 수 있습니다.
리소스
- 권한 요청 최소화
- 권한 개요
- 보호 수준 설명
- CustomPermissionTypo Android 린트
- Android 린트 사용 방법
- Android 권한에 대한 심층 설명과 흥미로운 퍼징 테스트 결과가 포함된 연구 논문