Compare commits
4 Commits
master
...
rule/S6384
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a1f24bbe8a | ||
![]() |
ca1bac08b1 | ||
![]() |
2b26f192c2 | ||
![]() |
f0ae1c0e03 |
@ -1,4 +1,4 @@
|
|||||||
=== Documentation
|
=== Documentation
|
||||||
|
|
||||||
* https://support.google.com/faqs/answer/9267555?hl=en[support.google.com] - Remediation for Intent Redirection Vulnerability
|
* Google Support - https://support.google.com/faqs/answer/9267555?hl=en[Remediation for Intent Redirection Vulnerability]
|
||||||
https://developer.android.com/topic/security/risks/intent-redirection[developer.android.com] - Intent redirection
|
* Android Documentation - https://developer.android.com/topic/security/risks/intent-redirection[Intent redirection]
|
||||||
|
62
rules/S6384/impact.adoc
Normal file
62
rules/S6384/impact.adoc
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
=== What is the potential impact?
|
||||||
|
|
||||||
|
An affected component that forwards a malicious externally provided intent does so using the vulnerable application's context. In particular, the new component is created with the same permissions as the application and without limitations on what feature can be reached.
|
||||||
|
|
||||||
|
Therefore, an attacker exploiting an intent redirection vulnerability could
|
||||||
|
manage to access a private application's components. Depending on the features
|
||||||
|
privately exposed, this can lead to further exploitations, sensitive data
|
||||||
|
disclosure, or even persistent code execution.
|
||||||
|
|
||||||
|
==== Information disclosure
|
||||||
|
|
||||||
|
An attacker can use the affected feature as a gateway to access other components
|
||||||
|
of the vulnerable application, even if they are not exported. This includes
|
||||||
|
features that handle sensitive information.
|
||||||
|
|
||||||
|
Therefore, by crafting a malicious intent and submitting it to the vulnerable
|
||||||
|
redirecting component, an attacker can retrieve most data exposed by private
|
||||||
|
features. This affects the confidentiality of information that is not
|
||||||
|
protected by an additional security mechanism, such as an encryption algorithm.
|
||||||
|
|
||||||
|
==== Attack surface increase
|
||||||
|
|
||||||
|
Because the attacker can access most components of the application, they can
|
||||||
|
identify and exploit other vulnerabilities that would be present in them. The
|
||||||
|
actual impact depends on the nested vulnerability. Exploitation probability
|
||||||
|
depends on the in-depth security level of the application.
|
||||||
|
|
||||||
|
==== Privilege escalation
|
||||||
|
|
||||||
|
If the vulnerable application has privileges on the underlying devices, an
|
||||||
|
attacker exploiting the redirection issue might take advantage of them. For
|
||||||
|
example by crafting a malicious intent action, the attacker could be able to
|
||||||
|
pass phone calls on behalf of the entitled application.
|
||||||
|
|
||||||
|
This can lead to various attack scenarios depending on the exploited
|
||||||
|
permissions.
|
||||||
|
|
||||||
|
==== Persistent code execution
|
||||||
|
|
||||||
|
A lot of applications rely on dynamic code loading to implement a variety of
|
||||||
|
features, such as:
|
||||||
|
|
||||||
|
* Minor feature updates.
|
||||||
|
* Application package size reduction.
|
||||||
|
* DRM or other code protection features.
|
||||||
|
|
||||||
|
When a component exposes a dynamic code loading feature, an attacker could use
|
||||||
|
it during the redirection's exploitation to deploy malicious code into the
|
||||||
|
application. The component can be located in the application itself or one of
|
||||||
|
its dependencies.
|
||||||
|
|
||||||
|
Such an attack would compromise the application execution environment entirely
|
||||||
|
and lead to multiple security threats. The malicious code could:
|
||||||
|
|
||||||
|
* Intercept and exfiltrate all data used in the application.
|
||||||
|
* Steal authentication credentials to third-party services.
|
||||||
|
* Change the application's behavior to serve another malicious purpose
|
||||||
|
(phishing, ransoming, etc)
|
||||||
|
|
||||||
|
Note that in most cases, the deployed malware can persist application or
|
||||||
|
hosting device restarts.
|
||||||
|
|
@ -8,12 +8,13 @@ include::../../common/fix/code-rationale.adoc[]
|
|||||||
|
|
||||||
[source,java,diff-id=1,diff-type=noncompliant]
|
[source,java,diff-id=1,diff-type=noncompliant]
|
||||||
----
|
----
|
||||||
public class Noncompliant extends AppCompatActivity {
|
public class MainActivity extends AppCompatActivity {
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
Intent intent = getIntent();
|
Intent intent = getIntent();
|
||||||
Intent forward = (Intent) intent.getParcelableExtra("anotherintent");
|
Intent forward = (Intent) intent.getParcelableExtra("anotherintent");
|
||||||
startActivity(forward); // Noncompliant
|
startActivity(forward);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
@ -26,13 +27,10 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
Intent intent = getIntent();
|
Intent intent = getIntent();
|
||||||
Intent forward = (Intent) intent.getParcelableExtra("anotherintent");
|
Intent forward = (Intent) intent.getParcelableExtra("anotherintent");
|
||||||
|
|
||||||
ComponentName name = forward.resolveActivity(getPackageManager());
|
ComponentName name = forward.resolveActivity(getPackageManager());
|
||||||
if (name.getPackageName().equals("safePackage") &&
|
if (name.getPackageName().equals("safePackage") && name.getClassName().equals("safeClass")) {
|
||||||
name.getClassName().equals("safeClass")) {
|
|
||||||
startActivity(forward);
|
startActivity(forward);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,77 +1,8 @@
|
|||||||
== Why is this an issue?
|
== Why is this an issue?
|
||||||
|
|
||||||
Intent redirection vulnerabilities occur when an application publicly exposes a
|
include::../rationale.adoc[]
|
||||||
feature that uses an externally provided intent to start a new component.
|
|
||||||
|
|
||||||
In that case, an application running on the same device as the affected one can
|
|
||||||
launch the exposed, vulnerable component and provide it with a specially crafted
|
|
||||||
intent. Depending on the application's configuration and logic, this intent will
|
|
||||||
be used in the context of the vulnerable application, which poses a security
|
|
||||||
threat.
|
|
||||||
|
|
||||||
|
|
||||||
=== What is the potential impact?
|
|
||||||
|
|
||||||
An affected component that forwards a malicious externally provided intent does so using the vulnerable application's context. In particular, the new component is created with the same permissions as the application and without limitations on what feature can be reached.
|
|
||||||
|
|
||||||
Therefore, an attacker exploiting an intent redirection vulnerability could
|
|
||||||
manage to access a private application's components. Depending on the features
|
|
||||||
privately exposed, this can lead to further exploitations, sensitive data
|
|
||||||
disclosure, or even persistent code execution.
|
|
||||||
|
|
||||||
==== Information disclosure
|
|
||||||
|
|
||||||
An attacker can use the affected feature as a gateway to access other components
|
|
||||||
of the vulnerable application, even if they are not exported. This includes
|
|
||||||
features that handle sensitive information.
|
|
||||||
|
|
||||||
Therefore, by crafting a malicious intent and submitting it to the vulnerable
|
|
||||||
redirecting component, an attacker can retrieve most data exposed by private
|
|
||||||
features. This affects the confidentiality of information that is not
|
|
||||||
protected by an additional security mechanism, such as an encryption algorithm.
|
|
||||||
|
|
||||||
==== Attack surface increase
|
|
||||||
|
|
||||||
Because the attacker can access most components of the application, they can
|
|
||||||
identify and exploit other vulnerabilities that would be present in them. The
|
|
||||||
actual impact depends on the nested vulnerability. Exploitation probability
|
|
||||||
depends on the in-depth security level of the application.
|
|
||||||
|
|
||||||
==== Privilege escalation
|
|
||||||
|
|
||||||
If the vulnerable application has privileges on the underlying devices, an
|
|
||||||
attacker exploiting the redirection issue might take advantage of them. For
|
|
||||||
example by crafting a malicious intent action, the attacker could be able to
|
|
||||||
pass phone calls on behalf of the entitled application.
|
|
||||||
|
|
||||||
This can lead to various attack scenarios depending on the exploited
|
|
||||||
permissions.
|
|
||||||
|
|
||||||
==== Persistent code execution
|
|
||||||
|
|
||||||
A lot of applications rely on dynamic code loading to implement a variety of
|
|
||||||
features, such as:
|
|
||||||
|
|
||||||
* Minor feature updates.
|
|
||||||
* Application package size reduction.
|
|
||||||
* DRM or other code protection features.
|
|
||||||
|
|
||||||
When a component exposes a dynamic code loading feature, an attacker could use
|
|
||||||
it during the redirection's exploitation to deploy malicious code into the
|
|
||||||
application. The component can be located in the application itself or one of
|
|
||||||
its dependencies.
|
|
||||||
|
|
||||||
Such an attack would compromise the application execution environment entirely
|
|
||||||
and lead to multiple security threats. The malicious code could:
|
|
||||||
|
|
||||||
* Intercept and exfiltrate all data used in the application.
|
|
||||||
* Steal authentication credentials to third-party services.
|
|
||||||
* Change the application's behavior to serve another malicious purpose
|
|
||||||
(phishing, ransoming, etc)
|
|
||||||
|
|
||||||
Note that in most cases, the deployed malware can persist application or
|
|
||||||
hosting device restarts.
|
|
||||||
|
|
||||||
|
include::../impact.adoc[]
|
||||||
|
|
||||||
// How to fix it section
|
// How to fix it section
|
||||||
|
|
||||||
@ -94,4 +25,10 @@ ifdef::env-github,rspecator-view[]
|
|||||||
Change this code to not perform arbitrary intent redirection.
|
Change this code to not perform arbitrary intent redirection.
|
||||||
|
|
||||||
|
|
||||||
endif::env-github,rspecator-view[]
|
endif::env-github,rspecator-view[]
|
||||||
|
|
||||||
|
'''
|
||||||
|
== Implementation Specification
|
||||||
|
(visible only on this page)
|
||||||
|
|
||||||
|
include::../message.adoc[]
|
||||||
|
47
rules/S6384/kotlin/how-to-fix-it/android.adoc
Normal file
47
rules/S6384/kotlin/how-to-fix-it/android.adoc
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
== How to fix it in Android
|
||||||
|
|
||||||
|
=== Code examples
|
||||||
|
|
||||||
|
include::../../common/fix/code-rationale.adoc[]
|
||||||
|
|
||||||
|
==== Noncompliant code example
|
||||||
|
|
||||||
|
[source,kotlin,diff-id=1,diff-type=noncompliant]
|
||||||
|
----
|
||||||
|
class MainActivity : AppCompatActivity() {
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
val forward = intent.getParcelableExtra("anotherintent") as? Intent
|
||||||
|
startActivity(forward)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
==== Compliant solution
|
||||||
|
|
||||||
|
[source,kotlin,diff-id=1,diff-type=compliant]
|
||||||
|
----
|
||||||
|
class MainActivity : AppCompatActivity() {
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
val forward = intent.getParcelableExtra("anotherintent") as? Intent
|
||||||
|
val name = forward?.resolveActivity(packageManager)
|
||||||
|
if (name?.packageName == "safePackage" && name.className == "safeClass")
|
||||||
|
startActivity(forward)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
=== How does this work?
|
||||||
|
|
||||||
|
include::../../common/fix/introduction.adoc[]
|
||||||
|
|
||||||
|
include::../../common/fix/destination.adoc[]
|
||||||
|
|
||||||
|
The example compliant code uses the `resolveActivity` method of the inner intent
|
||||||
|
to determine its target component. It then uses the `packageName` and
|
||||||
|
`className` properties to validate this destination is not sensitive.
|
||||||
|
|
||||||
|
include::../../common/fix/origin.adoc[]
|
||||||
|
|
||||||
|
include::../../common/fix/permissions.adoc[]
|
2
rules/S6384/kotlin/metadata.json
Normal file
2
rules/S6384/kotlin/metadata.json
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
{
|
||||||
|
}
|
34
rules/S6384/kotlin/rule.adoc
Normal file
34
rules/S6384/kotlin/rule.adoc
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
== Why is this an issue?
|
||||||
|
|
||||||
|
include::../rationale.adoc[]
|
||||||
|
|
||||||
|
include::../impact.adoc[]
|
||||||
|
|
||||||
|
// How to fix it section
|
||||||
|
|
||||||
|
include::./how-to-fix-it/android.adoc[]
|
||||||
|
|
||||||
|
== Resources
|
||||||
|
|
||||||
|
include::../common/resources/docs.adoc[]
|
||||||
|
|
||||||
|
include::../common/resources/standards.adoc[]
|
||||||
|
|
||||||
|
ifdef::env-github,rspecator-view[]
|
||||||
|
|
||||||
|
'''
|
||||||
|
== Implementation Specification
|
||||||
|
(visible only on this page)
|
||||||
|
|
||||||
|
=== Message
|
||||||
|
|
||||||
|
Change this code to not perform arbitrary intent redirection.
|
||||||
|
|
||||||
|
|
||||||
|
endif::env-github,rspecator-view[]
|
||||||
|
|
||||||
|
'''
|
||||||
|
== Implementation Specification
|
||||||
|
(visible only on this page)
|
||||||
|
|
||||||
|
include::../message.adoc[]
|
4
rules/S6384/message.adoc
Normal file
4
rules/S6384/message.adoc
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
=== Message
|
||||||
|
|
||||||
|
Change this code to not perform arbitrary intent redirection.
|
||||||
|
|
9
rules/S6384/rationale.adoc
Normal file
9
rules/S6384/rationale.adoc
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
Intent redirection vulnerabilities occur when an application publicly exposes a
|
||||||
|
feature that uses an externally provided intent to start a new component.
|
||||||
|
|
||||||
|
In that case, an application running on the same device as the affected one can
|
||||||
|
launch the exposed, vulnerable component and provide it with a specially crafted
|
||||||
|
intent. Depending on the application's configuration and logic, this intent will
|
||||||
|
be used in the context of the vulnerable application, which poses a security
|
||||||
|
threat.
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user