Android Package Context created without security restrictions
セキュリティ制限なしで作成されたAndroid Package Context
説明
AndroidにおけるCONTEXT_INCLUDE_CODEおよびCONTEXT_IGNORE_SECURITYを用いたcreatePackageContextの使用に関連する脆弱性は、プロセス間通信(IPC)メカニズムを悪用することにより、攻撃者が脆弱なアプリケーションのコンテキストで任意のコードを実行できるようにする可能性があります。
Androidでは、各アプリケーションはサンドボックス化されており、リソースやシステム機能への不正アクセスを防いでいます。しかし、アプリケーションはcreatePackageContextのようなIPCメカニズムを通じて互いにやり取りすることができます。このメソッドは、特定のパッケージ名のContextオブジェクトを作成するために使用され、あるアプリケーションが別のアプリケーションのリソースやコンポーネントにアクセスすることを可能にします。
android.permission.QUERY_ALL_PACKAGESパーミッションを要求し、CONTEXT_INCLUDE_CODEおよびCONTEXT_IGNORE_SECURITYを用いたcreatePackageContextを使用することで、アプリケーションは要求されたパッケージのリソースを読み込み、場合によってはそのコード用のクラスローダーも作成します。これにより、ターゲットパッケージに含まれるクラスは、アプリケーションのコンテキストに対する署名検証や制限なしに、現在のアプリケーションのコンテキストで読み込まれます。
CONTEXT_INCLUDE_CODEフラグは、アプリケーションがターゲットパッケージからクラスを読み込むことを許可し、CONTEXT_IGNORE_SECURITYフラグはセキュリティ制限を無視します。これらのフラグを使用すると、アプリケーションが潜在的なセキュリティリスクにさらされる可能性があります。
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import java.lang.reflect.Method;
import java.util.List;
public final class InsecurePackageContext {
public static void main(String[] args) {
Context context = getContext();
PackageManager packageManager = context.getPackageManager();
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);
for (PackageInfo info : installedPackages) {
String packageName = info.packageName;
if (packageName.startsWith("co.ostorlab.")) {
try {
Context packageContext = context.createPackageContext(packageName,
Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
Class<?> loaderClass = packageContext.getClassLoader().loadClass("co.ostorlab.payload");
Method updateMethod = loaderClass.getMethod("Update", Context.class);
updateMethod.invoke(null, context);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
}
推奨事項
CONTEXT_INCLUDE_CODEおよびCONTEXT_IGNORE_SECURITYフラグを使用したcreatePackageContextによる安全でないパッケージコンテキストの作成に関連する脆弱性を軽減するために、開発者は以下を行う必要があります。
1- 別々のAPKファイルを使用するのではなく、必要なコンポーネントをアプリケーション自体に組み込むことにより、createPackageContextの使用を避けます。
2- createPackageContextの使用が必要な場合は、CONTEXT_INCLUDE_CODEおよびCONTEXT_IGNORE_SECURITYフラグの使用を避け、代わりにCONTEXT_RESTRICTEDを使用します。これにより特定の機能が無効になる可能性がありますが、サードパーティアプリケーションの攻撃に対してアプリケーションがより堅牢になります。
3- パッケージがインストール済みパッケージのリストにあるかどうかを確認する際、startsWithやendsWithのような緩い比較を避け、代わりにパッケージ名と正確に一致させるようにします。
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import java.lang.reflect.Method;
import java.util.List;
public final class InsecurePackageContext {
public static void main(String[] args) {
Context context = getContext();
PackageManager packageManager = context.getPackageManager();
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);
for (PackageInfo info : installedPackages) {
String packageName = info.packageName;
if (packageName.equals("co.ostorlab.plugins.camera")) {
try {
Context packageContext = context.createPackageContext(packageName,
Context.CONTEXT_RESTRICTED);
Class<?> loaderClass = packageContext.getClassLoader().loadClass("co.ostorlab.plugins.camera.Main");
Method updateMethod = loaderClass.getMethod("Update", Context.class);
updateMethod.invoke(null, context);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
}
リンク
標準
- OWASP_MASVS_L1:
- MSTG_PLATFORM_2
- OWASP_MASVS_L2:
- MSTG_PLATFORM_2
- CWE_TOP_25:
- GDPR:
- ART_5
- ART_25
- ART_32
- ART_35
- PCI_STANDARDS:
- 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
- HIPAA_CONTROLS:
- SECURITY221
- SECURITY212
- SECURITY213