Implicit PendingIntent
隐式 PendingIntent
描述
Android 应用程序中的隐式意图 (implicit intent) 漏洞,特别是隐式 PendingIntent,会带来重大的安全风险。当开发人员使用隐式意图而未明确指定目标组件,而是依赖意图过滤器来确定接收者时,就会出现这些漏洞。攻击者可能会通过发送与隐式意图条件相匹配的恶意意图来利用这一点,从而导致未经授权的操作或访问。常见的问题包括意图欺骗 (intent spoofing)(即伪造意图),以及恶意应用程序注册与隐式意图标准匹配的意图过滤器的可能性。权限提升、数据暴露和不安全的组件是额外的隐患,以下是由隐式 PendingIntent 可能引起的安全问题列表:
- 意图欺骗 (Intent Spoofing):
-
攻击者可能会尝试发送与隐式
PendingIntent标准匹配的虚假意图。这可能导致应用程序执行意外操作,从而引发安全漏洞。 -
恶意意图过滤器:
-
如果未仔细配置意图过滤器,恶意应用程序可能会注册与隐式
PendingIntent标准匹配的意图过滤器。这可能导致意外组件执行敏感操作。 -
权限提升:
-
如果目标组件需要某些权限,隐式
PendingIntent可能会导致权限提升。攻击者可以利用这一点来触发需要更高权限的操作,从而导致未经授权的访问。 -
数据暴露:
-
如果通过隐式
PendingIntent传递敏感数据,一旦该意图被拦截或篡改,就存在数据暴露的风险。开发人员应确保对通过意图发送的数据进行适当的加密和验证。 -
动态注册 Broadcast Receiver:
-
如果可以动态注册接收器,则触发 Broadcast Receiver 的隐式
PendingIntent可能容易受到攻击。攻击者可以注册自己的接收器来拦截广播并执行恶意操作。 -
不安全的组件:
-
如果未对隐式
PendingIntent指定的目标组件(Activity、Service、Broadcast Receiver)进行适当的安全保护,则它可能容易受到各种攻击,包括权限提升或数据篡改。 -
使用不可信输入:
-
如果隐式
PendingIntent涉及使用不可信输入,例如从外部源接收的数据,则它可能引入注入攻击等漏洞。验证并清理输入以防止此类安全风险。 -
不受保护的 Extras:
-
在没有适当保护的情况下通过隐式
PendingIntent中的 extras 传递敏感信息可能会导致数据泄露。开发人员应谨慎对待包含在 extras 中的信息,并确保其得到妥善保护。 -
过于宽泛的意图过滤器:
-
如果意图过滤器过于宽泛,它们可能会匹配意外的组件,从而增加攻击面,并可能允许攻击者触发并非预期的操作。
-
未能检查调用者身份:
- 由隐式
PendingIntent启动的组件应验证调用者的身份以防止未经授权的访问。不这样做可能会导致安全漏洞。
- 由隐式
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class YourActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create an implicit base Intent and wrap it in a PendingIntent
Intent base = new Intent("ACTION_FOO");
base.setPackage("some_package");
PendingIntent pi = PendingIntent.getService(this, 0, base, 0);
}
}
建议
开发人员可以通过应用以下任何(甚至更好的是所有)方法来解决该漏洞:
- 确保设置了基础意图的 action、package 和 component 字段(显式意图);
- 确保
PendingIntent仅传递给受信任的组件; - 使用
FLAG_IMMUTABLE(在 SDK 23 中添加)来创建PendingIntents。这可以防止接收到PendingIntent的应用程序填充未填充的属性。如果应用程序也在运行 SDK 22 或更旧版本的设备上运行,我们建议开发人员在应用以前的选项的同时,使用以下模式来加强PendingIntent的创建: - 谨慎处理意图中包含的数据。
- 在不再需要
PendingIntents时取消它们。 - 使用最新的 Android 安全实践保持您的应用程序更新。
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class YourActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT >= 23) {
// Create a PendingIntent using FLAG_IMMUTABLE
Intent base = new Intent("ACTION_FOO");
base.setPackage("some_package");
PendingIntent pi = PendingIntent.getService(this, 0, base, PendingIntent.FLAG_IMMUTABLE);
} else {
Intent base = new Intent("ACTION_FOO");
base.setPackage("some_package");
PendingIntent pi = PendingIntent.getService(this, 0, base, 0);
}
}
}
链接
标准
- OWASP_MASVS_L1:
- MSTG_PLATFORM_2
- OWASP_MASVS_L2:
- MSTG_PLATFORM_2
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_6_3
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_CODE_4
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- CC_9_1
- HIPAA_CONTROLS:
- SECURITY221
- SECURITY212
- SECURITY213