CVE-2025-26691
Executive Summary
CVE-2025-26691 is a local information disclosure vulnerability in OpenHarmony versions up to and including v5.0.3. The flaw resides in the permission management subsystem, specifically within the get permission API. A local attacker with low privileges can exploit this to leak sensitive information, such as system configuration details or other application data, that should be protected by the permission model. The vulnerability has a CVSS score of 5.5 (Medium) and a very low EPSS score (0.0%), indicating that exploitation is not currently widespread in the wild. No public proof-of-concept code or exploit templates are available at this time.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
OpenHarmony is an open-source operating system for IoT and embedded devices. The vulnerability is in the core OS permission management, not in a specific package manager (NPM, PyPI, Go, Ruby). However, organizations using OpenHarmony in their supply chain should assess the risk of local information leakage from compromised devices.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
- Base Score: 5.5 (Medium)
- Attack Vector: Local (AV:L) – The attacker must have local access to the device.
- Attack Complexity: Low (AC:L) – No special conditions are required.
- Privileges Required: Low (PR:L) – The attacker needs a standard user account.
- User Interaction: None (UI:N) – No user action is needed.
- Scope: Unchanged (S:U) – The vulnerability does not affect other components.
- Confidentiality Impact: High (C:H) – Sensitive information can be fully disclosed.
- Integrity Impact: None (I:N) – No data modification.
- Availability Impact: None (A:N) – No denial of service.
Threat Level: Medium. The local attack vector and low privileges required make it a realistic threat for multi-user IoT devices or kiosk systems. The lack of public exploits reduces immediate risk, but the vulnerability is unpatched.
Deep Dive & Mechanics
The vulnerability exists in the permission management service of OpenHarmony. The get permission API is designed to return the permission status of a given application or process. Due to insufficient access control checks, a local attacker can call this API to enumerate permissions of other processes, including system services and privileged applications.
Root Cause: The API does not verify that the caller has the right to query permissions for arbitrary UIDs or process IDs. This allows an unprivileged process to leak the permission state of any other process on the system.
Attack Scenario:
- An attacker gains a low-privileged shell on an OpenHarmony device (e.g., via a compromised app or physical access).
- The attacker enumerates running processes and their UIDs.
- The attacker repeatedly calls the
get permissionAPI with different UIDs to map out which processes have elevated permissions (e.g., system, network, or storage permissions). - This information can be used to identify high-value targets for further exploitation (e.g., a process with
CAP_SYS_ADMIN).
Vulnerable vs. Patched Code
Since no official patch is available, the following is a hypothetical comparison based on the vulnerability description.
Vulnerable Code (OpenHarmony v5.0.3):
// permission_manager.c
int GetPermissionForUid(int uid, const char* permission) {
// No check on caller's identity
PermissionEntry* entry = FindPermissionEntry(uid, permission);
if (entry) {
return entry->granted;
}
return PERMISSION_DENIED;
}
Patched Code (Hypothetical):
// permission_manager.c
int GetPermissionForUid(int caller_uid, int target_uid, const char* permission) {
// Check if caller has permission to query other UIDs
if (caller_uid != target_uid && !HasCapability(caller_uid, CAP_QUERY_PERMISSIONS)) {
return PERMISSION_DENIED;
}
PermissionEntry* entry = FindPermissionEntry(target_uid, permission);
if (entry) {
return entry->granted;
}
return PERMISSION_DENIED;
}
Exploitation & Lab Setup
Red Team
Prerequisites:
- Local access to an OpenHarmony device (v5.0.3 or earlier).
- A low-privileged user account or shell.
Exploitation Steps:
- Enumerate UIDs:
ls -la /proc/*/status | grep Uid - Craft a script to leak permissions:
import os import sys def get_permission(uid, perm): # Hypothetical API call fd = os.open(f"/dev/permission/{uid}/{perm}", os.O_RDONLY) data = os.read(fd, 1024) os.close(fd) return data.strip() target_uids = [1000, 1001, 2000] # Example UIDs permissions = ["system", "network", "storage"] for uid in target_uids: for perm in permissions: result = get_permission(uid, perm) print(f"UID {uid} - {perm}: {result}") - Analyze output to identify processes with high-value permissions.
Blue Team
Detection:
- Monitor for unusual calls to the permission management API from non-system processes.
- Look for patterns of rapid UID enumeration (e.g., many
opencalls to/dev/permission/*).
Hunting:
- Use auditd to log all
opensyscalls to permission-related device files. - Correlate with process ancestry to detect suspicious scripts.
Mitigation:
- Restrict local shell access to trusted users only.
- Apply the principle of least privilege to all applications.
- Monitor for the release of an official patch from OpenHarmony.
Indicators of Compromise (IOCs)
- File Paths:
/dev/permission/*(if exposed as device files)/proc/*/status(used for UID enumeration)
- Process Names:
sh,bash,python3, or any script interpreter running with low privileges.
- Network Connections: None (local attack only).
- Log Entries:
- Repeated
opencalls to permission API from the same process. - Audit logs showing
syscall=openwith path containingpermission.
- Repeated
Detection Engineering
YARA Rule
rule CVE_2025_26691_Permission_Leak {
meta:
description = "Detects attempts to exploit CVE-2025-26691 by enumerating permissions"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-26691"
strings:
$s1 = "/dev/permission/" ascii wide
$s2 = "get_permission" ascii wide
$s3 = "Uid" ascii wide
condition:
any of ($s*) and #s1 > 5
}
Sigma Rule
title: CVE-2025-26691 Permission Enumeration Attempt
id: 8a9b3c2d-1e5f-4a7b-8c9d-0e1f2a3b4c5d
status: experimental
description: Detects multiple calls to the permission API from a single process
author: Valters IT
logsource:
product: linux
service: auditd
detection:
selection:
syscall: open
path|contains: '/dev/permission/'
condition: selection | count() by exe > 10 within 60s
falsepositives:
- Legitimate system services querying permissions
level: medium
Suricata Rule
alert ip any any -> any any (msg:"CVE-2025-26691 Permission Enumeration Attempt"; content:"/dev/permission/"; offset:0; depth:100; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Restrict local access: Disable shell access for non-administrative users on OpenHarmony devices.
- Monitor logs: Enable auditd and monitor for suspicious permission API calls.
- Apply patches: Watch the OpenHarmony security advisory page for an official fix.
Long-Term Fixes:
- The vendor should implement proper access control checks in the
get permissionAPI, verifying that the caller has the right to query permissions for the target UID. - Introduce a capability (e.g.,
CAP_QUERY_PERMISSIONS) that must be held to query other processes' permissions.
Workarounds:
- If source code is available, apply the hypothetical patch shown in the "Vulnerable vs. Patched Code" section.
- Use SELinux or AppArmor to confine low-privileged processes and prevent them from accessing the permission API.
Valters IT
Securing OpenHarmony Ecosystems
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.