Aug 18, 2026·7 min read·2 visits
MobSF prior to 4.5.1 validates the hostname of an Android App Link but appends the port afterward without validation, enabling SSRF and port scanning via crafted APK uploads.
A Server-Side Request Forgery (SSRF) vulnerability exists in Mobile Security Framework (MobSF) prior to version 4.5.1. The flaw occurs in the Android App Link validation process, where a split-validation vulnerability allows an authenticated attacker to perform port restriction bypasses and potential DNS rebinding attacks against internal infrastructure.
Mobile Security Framework (MobSF) is an automated, open-source mobile application security testing framework. It performs static and dynamic analysis on mobile application binaries, including Android APKs. During static analysis, MobSF parses the AndroidManifest.xml file to extract components, permissions, and deep link configurations. The vulnerability resides specifically within the Android App Link (Asset Links) verification engine.
The Asset Links mechanism allows Android applications to associate themselves with a web domain to handle URLs directly. MobSF attempts to verify these associations by checking for a valid Digital Asset Links JSON file at the standard path on the target host. Because this verification involves making outbound HTTP requests, it represents a significant attack surface if input validation is insufficient.
CVE-2026-68927 defines a server-side request forgery (SSRF) vulnerability where an authenticated attacker can bypass intended network restrictions. By uploading a specially crafted APK, the attacker can force the MobSF server to initiate outbound HTTP connections to non-standard ports or internal systems. This occurs because of a disconnect between how the application validates the target host and how it assembles the final destination URL.
The root cause of CVE-2026-68927 is a split-validation flaw (also known as a validation-vs-use discrepancy) within the App Link parsing logic. When parsing AndroidManifest.xml files, the function get_browsable_activities() in mobsf/StaticAnalyzer/views/android/manifest_analysis.py extracts the schema, host, and port configurations defined inside intent filters. These parameters are used to construct the target verification URL.
To prevent SSRF attacks against internal interfaces, the framework uses a security function named valid_host(). This function resolves the target host's DNS and inspects the resulting IP address. If the IP resides in a local, loopback, or private range (such as RFC 1918 space), the request is blocked. However, this safety check is only executed on the isolated hostname string without its associated port.
After valid_host() validates the bare hostname, the application performs a blind string concatenation. If an android:port attribute is specified in the manifest, MobSF appends this port to the validated hostname without subjecting the port to any validation. This allows the target URL to point to internal services or arbitrary restricted ports, bypassing the boundary checks enforced by the host validator.
The vulnerability is located in mobsf/StaticAnalyzer/views/android/manifest_analysis.py. Below is the vulnerable code segment showing the blind concatenation of the port parameter after validation has occurred.
# Vulnerable Implementation
shost = f'{scheme}://{host}'
if port and is_number(port):
# The port is appended to the URL without validating if it is a standard HTTP/HTTPS port
c_url = f'{shost}:{port}{WELL_KNOWN_PATH}'
else:
c_url = f'{shost}{WELL_KNOWN_PATH}'The patched implementation introduces validation in both get_browsable_activities() and _check_url() to reject non-standard ports. This implements a defense-in-depth model where the port is checked during URL construction and verified again before sending the HTTP request.
# Patched Implementation in get_browsable_activities()
shost = f'{scheme}://{host}'
if port and is_number(port):
# Enforce that only standard web ports (80, 443) are allowed
if int(port) not in (80, 443):
logger.warning(
'Non-standard port rejected in assetlinks '
'check (port %s bypasses valid_host): %s',
port, host)
continue
c_url = f'{shost}:{port}{WELL_KNOWN_PATH}'
else:
c_url = f'{shost}{WELL_KNOWN_PATH}'# Patched Implementation in _check_url()
purl = urlparse(url)
if (purl.path != WELL_KNOWN_PATH
or len(purl.query) > 0
or len(purl.params) > 0):
logger.warning('Invalid Assetlinks URL: %s', url)
continue
# Final check to verify that the parsed port is strictly safe
if purl.port and purl.port not in (80, 443):
logger.warning(
'Non-standard port in assetlinks URL rejected: %s', url)
continueAn attacker must first obtain authentication credentials to the target MobSF instance and possess privileges to upload files. The attacker then crafts a malicious Android application package (APK) with a custom AndroidManifest.xml payload. This manifest contains a browsable intent filter specifying a public domain name under the attacker's control along with a restricted target port, such as port 6379 (Redis) or port 22 (SSH).
If the attacker implements a DNS rebinding attack, they configure their domain name server with a low Time-To-Live (TTL) value of zero. When MobSF performs the initial DNS resolution during the valid_host() check, the domain name resolves to a legitimate public IP address (such as 8.8.8.8). The security validator approves the connection because the resolved IP is public and benign.
Immediately afterward, when the Python requests library resolves the domain name again to initiate the actual socket connection, the DNS server returns a private loopback or local IP address (such as 127.0.0.1). The connection is routed directly to the internal host on the specified non-standard port. By observing the difference in response times or connection states in the application logs, the attacker can conduct network scanning of internal assets.
The concrete security impact of this vulnerability is a partial compromise of confidentiality, resulting in internal service scanning and host detection. An attacker can determine whether specific ports are open or closed on the loopback interface of the MobSF server or within its local area network (LAN). This intelligence facilitates reconnaissance phase planning during multi-stage internal network penetration.
The severity of the exploit is constrained by multiple architectural factors. First, the HTTP GET request is made with the parameter allow_redirects=False inside _check_url(), which prevents the attacker from using HTTP redirects to pivot to other resources. Second, the path of the request is hardcoded to /.well-known/assetlinks.json, meaning the attacker cannot submit custom API calls or payloads to internal endpoints.
Because the request uses the GET method and cannot transmit arbitrary payloads, the integrity and availability of internal systems are not directly threatened. The CVSS score of 3.0 reflects these limitations. However, in environments where internal services trust requests originating from localhost or use HTTP GET parameters to trigger administrative actions, the threat profile may increase.
To remediate CVE-2026-68927, administrators must upgrade all instances of Mobile Security Framework to version 4.5.1 or later. The patch effectively blocks arbitrary port specification by restricting the allowed ports in the asset links check to standard web ports (80 and 443). This prevents attackers from reaching high-risk internal administration interfaces like Redis, database servers, or shell endpoints.
While the applied patch successfully mitigates the port-abuse vector, it is important to note that DNS rebinding risks are not entirely eliminated. If the application environment allows outbound requests on ports 80 or 443 to resolve to internal services via DNS rebinding, those endpoints remain exposed. A complete mitigation would involve performing DNS resolution once, validating the IP address, and then routing the HTTP request directly to that validated IP while setting the original hostname in the HTTP Host header.
In scenarios where upgrading is delayed, administrators can deploy external controls to limit the risk. Configuring egress firewall rules to restrict outbound connections from the MobSF server to the internal network prevents the server from contacting other local systems. Additionally, monitoring container network traffic for unauthorized outgoing HTTP requests can help detect exploitation attempts.
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Mobile-Security-Framework-MobSF MobSF | < 4.5.1 | 4.5.1 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-918 |
| Attack Vector | Network (AV:N) |
| CVSS Score | 3.0 (Low) |
| EPSS Score | N/A |
| Impact | Low Confidentiality |
| Exploit Status | Proof-of-Concept / Conceptual |
| KEV Status | Not Listed |
The web application receives a URL or similar request parameter from an untrusted source and attempts to read or send data to that destination without sufficient validation.
CVE-2026-73974 is a local path traversal vulnerability in linuxfabrik-lib and Linuxfabrik Monitoring Plugins. Under standard monitoring configurations running with elevated privileges via sudo, this flaw can be exploited by an unprivileged local user to read arbitrary root-only files, resulting in local privilege escalation.
CVE-2026-71417 is an authorization bypass vulnerability (CWE-639) in Netflix Lemur, an open-source TLS certificate management framework. In versions prior to 1.9.3, a low-privileged authenticated user can bypass role and certificate-level permission boundaries to revoke arbitrary managed TLS certificates at the upstream Certificate Authority (CA). This vulnerability stems from an architectural issue where Lemur evaluates authorization against internal database row ownership rather than the unique, cryptographic identity of the certificate. An attacker can exploit this flaw by uploading a duplicate record of a target certificate and requesting its revocation, triggering a downstream CA-side revocation and a subsequent denial-of-service (DoS) condition for services relying on the target certificate.
CVE-2026-68923 describes a critical security regression in the Mobile Security Framework (MobSF) where vital security middleware, including Cross-Site Request Forgery (CSRF) validation, clickjacking protection, and standard HTTP security controls, was deactivated. The vulnerability arose from a partial migration of Django's middleware settings, which silently omitted security-critical components while preserving legacy definitions. Authenticated sessions on vulnerable instances were left exposed to arbitrary administrative state modifications initiated via cross-site vectors.
CVE-2026-68922 is a path traversal vulnerability in Mobile Security Framework (MobSF) prior to version 4.5.1. The vulnerability exists within the Android icon extraction process when analyzing uploaded ZIP or APK archives, allowing an authenticated attacker to read arbitrary files from the server.
An improper input validation vulnerability (CWE-20) in the RabbitMQ Java Client prior to version 5.33.0 allows a compromised or malicious AMQP broker to trigger heap memory exhaustion and Denial of Service in client applications during the connection handshake.
A logical authorization bypass vulnerability in copyparty allows an attacker possessing a restricted file-level key to escalate privileges to directory-level access, exposing directory listings and adjacent files.