Create rule S7206: Implicit PendingIntents should be immutable (SONARKT-581) (#4710)
* Create rule S7206 * Initial commit * Fix code tags * Fix typo --------- Co-authored-by: egon-okerman-sonarsource <egon-okerman-sonarsource@users.noreply.github.com> Co-authored-by: Egon Okerman <egon.okerman@sonarsource.com>
This commit is contained in:
parent
1f6f5da0e3
commit
b34a35ee48
44
rules/S7206/kotlin/metadata.json
Normal file
44
rules/S7206/kotlin/metadata.json
Normal file
@ -0,0 +1,44 @@
|
||||
{
|
||||
"title": "Implicit PendingIntents should be immutable",
|
||||
"type": "VULNERABILITY",
|
||||
"status": "ready",
|
||||
"remediation": {
|
||||
"func": "Constant\/Issue",
|
||||
"constantCost": "5min"
|
||||
},
|
||||
"tags": [
|
||||
"cwe",
|
||||
"android"
|
||||
],
|
||||
"defaultSeverity": "Major",
|
||||
"ruleSpecification": "RSPEC-7206",
|
||||
"sqKey": "S7206",
|
||||
"scope": "All",
|
||||
"defaultQualityProfiles": [
|
||||
"Sonar way"
|
||||
],
|
||||
"securityStandards": {
|
||||
"OWASP Mobile": [
|
||||
"M1"
|
||||
],
|
||||
"OWASP Mobile Top 10 2024": [
|
||||
"M4",
|
||||
"M8"
|
||||
],
|
||||
"MASVS": [
|
||||
"MSTG-PLATFORM-4"
|
||||
],
|
||||
"CWE": [
|
||||
927
|
||||
]
|
||||
},
|
||||
"quickfix": "unknown",
|
||||
"code": {
|
||||
"impacts": {
|
||||
"MAINTAINABILITY": "HIGH",
|
||||
"RELIABILITY": "MEDIUM",
|
||||
"SECURITY": "LOW"
|
||||
},
|
||||
"attribute": "CONVENTIONAL"
|
||||
}
|
||||
}
|
107
rules/S7206/kotlin/rule.adoc
Normal file
107
rules/S7206/kotlin/rule.adoc
Normal file
@ -0,0 +1,107 @@
|
||||
Mutable implicit ``PendingIntent``s should be avoided, as they allow malicious applications to modify the underlying intent and redirect
|
||||
it to their own components, potentially gaining unauthorized access to the sender app's permissions. This vulnerability enables
|
||||
privilege escalation attacks, where an attacker can perform operations using the victim app's identity.
|
||||
|
||||
== Why is this an issue?
|
||||
|
||||
Mutable implicit ``PendingIntent``s create a serious security vulnerability by essentially lending the Android app's identity and permissions
|
||||
to other applications. Because such a ``PendingIntent`` does not have an exact component specified to receive it (implicit) and can be altered,
|
||||
other apps that are able to receive this ``PendingIntent`` can modify its destination and contents. Since ``PendingIntent``s lend permissions to
|
||||
other apps, an attacker could abuse this to execute actions the user never gave permission for.
|
||||
|
||||
The real-world impact for users can be severe. An attacker exploiting this vulnerability could access sensitive data that the app has permission
|
||||
to use (contacts, location, photos, etc.) For example, if the app has the ``READ_CONTACTS`` permission and creates a mutable implicit ``PendingIntent``,
|
||||
a malicious app could redirect that intent to steal all the user's contacts. This completely bypasses Android's permission system and violates user
|
||||
trust, potentially leading to privacy breaches, data theft, or even financial fraud depending on what permissions the app holds.
|
||||
|
||||
== How to fix it
|
||||
|
||||
=== Code examples
|
||||
|
||||
==== Noncompliant code example
|
||||
|
||||
On Android 12 and higher, ``PendingIntent``s are only mutable if ``PendingIntent.FLAG_MUTABLE`` is set.
|
||||
|
||||
[source,kotlin,diff-id=1,diff-type=noncompliant]
|
||||
----
|
||||
val intent = Intent("com.example.ACTION_VIEW")
|
||||
val pendingIntent = PendingIntent.getActivity(
|
||||
context,
|
||||
0,
|
||||
intent,
|
||||
PendingIntent.FLAG_MUTABLE // Noncompliant
|
||||
)
|
||||
----
|
||||
|
||||
On Android versions 11 and below, ``PendingIntent``s are mutable by default. So even if ``PendingIntent.FLAG_MUTABLE`` is not set,
|
||||
the Android app might be using mutable ``PendingIntent``s on some end user devices.
|
||||
|
||||
[source,kotlin,diff-id=2,diff-type=noncompliant]
|
||||
----
|
||||
val intent = Intent("com.example.ACTION_VIEW")
|
||||
val pendingIntent = PendingIntent.getActivity(
|
||||
context,
|
||||
0,
|
||||
intent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT // Noncompliant
|
||||
)
|
||||
----
|
||||
|
||||
==== Compliant solution
|
||||
|
||||
Explicitly marking the ``PendingIntent`` using ``PendingIntent.FLAG_IMMUTABLE`` resolves this issue.
|
||||
|
||||
[source,kotlin,diff-id=1,diff-type=compliant]
|
||||
----
|
||||
val intent = Intent("com.example.ACTION_VIEW")
|
||||
val pendingIntent = PendingIntent.getActivity(
|
||||
context,
|
||||
0,
|
||||
intent,
|
||||
PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
----
|
||||
|
||||
In addition, it is recommended for the ``Intent`` within to be explicit instead of implicit.
|
||||
|
||||
[source,kotlin,diff-id=2,diff-type=compliant]
|
||||
----
|
||||
val intent = Intent("com.example.ACTION_VIEW")
|
||||
intent.setClass(context, MyActivity::class.java)
|
||||
val pendingIntent = PendingIntent.getActivity(
|
||||
context,
|
||||
0,
|
||||
intent,
|
||||
PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
----
|
||||
|
||||
=== How does this work?
|
||||
|
||||
There are two ways to prevent mutable implicit ``PendingIntent``s from being abused: making the ``PendingIntent`` immutable and making the ``Intent`` explicit.
|
||||
|
||||
By making the ``PendingIntent`` immutable, an attacker is not able to alter it to redirect to their own components. This is done by setting the ``PendingIntent.FLAG_IMMUTABLE``
|
||||
flag when creating the ``PendingIntent``. This flag is available on Android 6.0 and higher. If a lower version of Android is targeted, it is recommended to make the wrapped
|
||||
``Intent`` explicit.
|
||||
|
||||
An ``Intent`` can be made explicit by setting the component that should receive the ``Intent``. This way, the ``Intent`` can only be received by the specified component and
|
||||
cannot be received by an attacker. This is done by calling ``Intent.setClass()`` or ``Intent.setComponent()`` with the target component.
|
||||
|
||||
Note that mutable implicit ``PendingIntent``s are explicitly blocked when an application is targeting Android 14 or higher.
|
||||
|
||||
== Resources
|
||||
=== Documentation
|
||||
|
||||
* Android Documentation - https://developer.android.com/privacy-and-security/risks/implicit-intent-hijacking[Implicit intent hijacking]
|
||||
* Android Documentation - https://developer.android.com/reference/android/app/PendingIntent[``PendingIntent`` API reference]
|
||||
|
||||
=== Articles & blog posts
|
||||
|
||||
* Google - https://support.google.com/faqs/answer/10437428[Remediation for Implicit PendingIntent Vulnerability]
|
||||
* Dimitrios Valsamaras - https://valsamaras.medium.com/pending-intents-a-pentesters-view-92f305960f03[PendingIntents: A Pentester's View]
|
||||
|
||||
=== Standards
|
||||
|
||||
* OWASP Mobile Application Security Testing Guide - https://mas.owasp.org/MASTG/0x05h-Testing-Platform-Interaction/#pending-intents[Android Platform APIs]
|
||||
* OWASP Mobile Application Security Testing Guide - https://mas.owasp.org/MASTG/tests/android/MASVS-PLATFORM/MASTG-TEST-0030/[MASTG-TEST-0030: Testing for Vulnerable Implementation of PendingIntent]
|
||||
* CWE - https://cwe.mitre.org/data/definitions/927[CWE-927 - Use of Implicit Intent for Sensitive Communication]
|
1
rules/S7206/metadata.json
Normal file
1
rules/S7206/metadata.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
Loading…
x
Reference in New Issue
Block a user