대기 중인 인텐트의 발신자

OWASP 카테고리: MASVS-CODE: 코드 품질

개요

PendingIntent.getCreator*() 또는 PendingIntent.getTarget*()를 사용하여 PendingIntent의 발신자를 신뢰할지 여부를 결정하면 악용 위험이 발생합니다.

PendingIntent.getCreator*() 또는 PendingIntent.getTarget*()는 PendingIntent의 생성자를 반환하며, 이는 항상 발신자와 일치하지는 않습니다. 생성자는 신뢰할 수 있지만 발신자는 신뢰할 수 없습니다. 발신자는 다양한 메커니즘을 사용하여 다른 앱의 PendingIntent를 획득한 악성 앱일 수 있기 때문입니다. 예를 들면 다음과 같습니다.

PendingIntent.getCreator*() 또는 PendingIntent.getTarget*()의 적법한 사용의 예는 PendingIntent로 시작될 앱의 아이콘을 표시하는 것입니다.

영향

생성자를 쿼리하고 신뢰하기 때문에 PendingIntent의 발신자를 신뢰하면 취약점이 발생할 수 있습니다. 앱이 생성자를 기반으로 PendingIntent의 발신자를 신뢰한 다음 인증 또는 승인 로직을 공유하면 PendingIntent의 발신자가 악성 앱일 때마다 취약한 애플리케이션 코드의 구현에 따라 무효화되고 신뢰할 수 없는 입력을 기반으로 인증 우회 또는 원격 코드 실행이 발생할 수 있습니다.

완화 조치

발신자와 크리에이터 구분

PendingIntent를 수신할 때 실행되는 모든 유형의 인증 또는 승인 로직은 PendingIntent.getCreator*() 또는 PendingIntent.getTarget*()를 사용하여 식별된 PendingIntent의 생성자에 관한 가정을 기반으로 해서는 안 됩니다.

호출자를 검증하는 대체 방법 사용

호출자를 인증해야 하는 경우 PendingIntent 대신 서비스 또는 ContentProvider를 사용해야 합니다. 둘 다 수신 IPC를 디스패치하는 컨텍스트에 있을 때 Binder.getCallingUid()를 사용하여 호출자 UID를 가져올 수 있습니다. 나중에 PackageManager.getPackagesForUid()를 사용하여 UID를 쿼리할 수 있습니다.

API 수준 34부터 사용할 수 있는 또 다른 접근 방식은 발신자가 BroadcastOptions.isShareIdentityEnabled()를 사용하여 브로드캐스트 중에 ID 공유를 선택한 경우 BroadcastReceiver.getSentFromUid() 또는 BroadcastReceiver.getSentFromPackage()를 사용하는 것입니다.

사이드로드된 패키지는 Play 스토어의 패키지 이름과 중복될 수 있으므로 호출 패키지에 예상되는 서명이 있는지 항상 확인해야 합니다.

리소스