Категория OWASP: MASVS-CODE: Качество кода
Обзор
Использование PendingIntent.getCreator*()
или PendingIntent.getTarget*()
для определения того, следует ли доверять отправителю PendingIntent, создает риск эксплуатации.
PendingIntent.getCreator*()
или PendingIntent.getTarget*()
возвращает создателя PendingIntent, который не всегда соответствует отправителю. Создателю можно доверять, но отправителю никогда нельзя доверять, поскольку отправителем может быть вредоносное приложение, которое получило PendingIntent другого приложения, используя различные механизмы, например:
- из
NotificationListenerService
- законные варианты использования, являющиеся частью уязвимого приложения.
Примером законного использования PendingIntent.getCreator*()
или PendingIntent.getTarget*()
может быть показ значка приложения, которое будет запущено PendingIntent.
Влияние
Доверие отправителю PendingIntent, поскольку вы запросили (и доверяете) создателю, может привести к уязвимостям. Если приложение доверяет отправителю PendingIntent на основе его создателя, а затем делится своей логикой аутентификации или авторизации, то всякий раз, когда отправителем PendingIntent является вредоносное приложение, это приведет к обходу аутентификации или, возможно, даже к удаленному выполнению кода на основе недействительных, ненадежных входных данных. , в зависимости от реализации кода уязвимого приложения.
Смягчения
Различайте отправителя и создателя
Любой тип логики аутентификации или авторизации, выполняемой при получении PendingIntent, не должен основываться на предположениях относительно создателя PendingIntent, определенного с помощью PendingIntent.getCreator*()
или PendingIntent.getTarget*()
.
Используйте альтернативные способы проверки вызывающих абонентов
Если вам необходимо аутентифицировать вызывающего абонента, вместо использования PendingIntent вам следует использовать Service или ContentProvider — оба позволяют получать UID вызывающего абонента с помощью Binder.getCallingUid(), когда вы находитесь в контексте отправки входящего IPC. UID можно запросить позже с помощью PackageManager.getPackagesForUid() .
Другой подход, доступный на уровне API 34, заключается в использовании BroadcastReceiver.getSentFromUid() или BroadcastReceiver.getSentFromPackage(), если отправитель согласился на совместное использование идентификатора во время трансляции с помощью BroadcastOptions.isShareIdentityEnabled() .
Вы всегда должны проверять, имеет ли вызывающий пакет ожидаемую подпись, поскольку имена загруженных неопубликованных пакетов могут перекрываться с именами из Play Store.
Ресурсы
,Категория OWASP: MASVS-CODE: Качество кода
Обзор
Использование PendingIntent.getCreator*()
или PendingIntent.getTarget*()
для определения того, следует ли доверять отправителю PendingIntent, создает риск эксплуатации.
PendingIntent.getCreator*()
или PendingIntent.getTarget*()
возвращает создателя PendingIntent, который не всегда соответствует отправителю. Создателю можно доверять, но отправителю никогда нельзя доверять, поскольку отправителем может быть вредоносное приложение, которое получило PendingIntent другого приложения, используя различные механизмы, например:
- из
NotificationListenerService
- законные варианты использования, являющиеся частью уязвимого приложения.
Примером законного использования PendingIntent.getCreator*()
или PendingIntent.getTarget*()
может быть показ значка приложения, которое будет запущено PendingIntent.
Влияние
Доверие отправителю PendingIntent, поскольку вы запросили (и доверяете) создателю, может привести к уязвимостям. Если приложение доверяет отправителю PendingIntent на основе его создателя, а затем делится своей логикой аутентификации или авторизации, то всякий раз, когда отправителем PendingIntent является вредоносное приложение, это приведет к обходу аутентификации или, возможно, даже к удаленному выполнению кода на основе недействительных, ненадежных входных данных. , в зависимости от реализации кода уязвимого приложения.
Смягчения
Различайте отправителя и создателя
Любой тип логики аутентификации или авторизации, выполняемой при получении PendingIntent, не должен основываться на предположениях относительно создателя PendingIntent, определенного с помощью PendingIntent.getCreator*()
или PendingIntent.getTarget*()
.
Используйте альтернативные способы проверки вызывающих абонентов
Если вам необходимо аутентифицировать вызывающего абонента, вместо использования PendingIntent вам следует использовать Service или ContentProvider — оба позволяют получать UID вызывающего абонента с помощью Binder.getCallingUid(), когда вы находитесь в контексте отправки входящего IPC. UID можно запросить позже с помощью PackageManager.getPackagesForUid() .
Другой подход, доступный на уровне API 34, заключается в использовании BroadcastReceiver.getSentFromUid() или BroadcastReceiver.getSentFromPackage(), если отправитель согласился на совместное использование идентификатора во время трансляции с помощью BroadcastOptions.isShareIdentityEnabled() .
Вы всегда должны проверять, имеет ли вызывающий пакет ожидаемую подпись, поскольку имена загруженных неопубликованных пакетов могут перекрываться с именами из Play Store.