Submit #990050: Netis Systems (Netcore Group) EAP930 (AX3000 Wireless Gigabit Ceiling Mount Access Point) V0.1.250905.115454 (CWE-912, CWE-798-adjacentm CWE-256/522)info

TitelNetis Systems (Netcore Group) EAP930 (AX3000 Wireless Gigabit Ceiling Mount Access Point) V0.1.250905.115454 (CWE-912, CWE-798-adjacentm CWE-256/522)
BeschreibungDescription: There's a CGI endpoint at /cgi-bin/debug that isn't linked from anywhere in the admin UI. No cookie or ubus session check - none of the auth logic every other admin-facing script on the device uses. Instead it's gated by a signature: DeviceRole=$(uci get wificfg.2G.DeviceRole) if [ "$DeviceRole" = "1" ]; then exit fi SIGNATURE=$(mktemp) cat | head -c 4096 > "$SIGNATURE" MSG_FILE=$(mktemp) ifconfig br-lan | grep HWaddr | awk '{print $5}' | head -c 17 | tr "A-Z" "a-z" > "$MSG_FILE" PUBLICKEY=$(mktemp) write_public_key > "$PUBLICKEY" usign -V -p "$PUBLICKEY" -m "$MSG_FILE" -x "$SIGNATURE" errcode=200 The message being signed is the device's own LAN MAC, lowercased. The public key is hardcoded (comment: "untrusted comment: public key a27b557e0eaaa926") and separate from the key already on the device for opkg verification - this one exists just for this endpoint. POST a signature over the LAN MAC, signed with the matching private key, and the response (via an EXIT trap once errcode is 200) is: return200() { cat <<- EOF Status: 200 OK Content-type: text/html $(uci get system.@system[0].admin) $(uci get system.@system[0].passwd) EOF } Admin username and password, plain text, out of UCI. Which means the password sits in UCI in recoverable form to begin with - not hashed. DeviceRole is the only thing that could block this, so I checked what it's actually set to rather than assume. etc/uci-defaults/60-wificfg defaults it to '0'. Went through the OEM customization layer too (etc/customer.sh, etc/config/customer, both in this firmware's overlay squashfs, applied on first boot) - nothing there touches wificfg.*.DeviceRole. Not blocked on a standard unit. Also checked whether the default admin password itself is derivable from public info, since the provisioning script pulls it from `impd system_key`, and impd's other subcommands (24g_key, 5g_key) are MAC-derived Wi-Fi passwords. Disassembled impd - a stripped ARM64 binary with no section headers at all, so the usual section-table approach doesn't work; had to pull symbols and relocations straight out of PT_DYNAMIC. The function handling system_key isn't a hash or derivation - it's a loop checking a buffer for a 0xFF byte, the standard check for whether flash still holds its erased pattern. So the password looks like a genuine per-device factory secret in NVRAM, not computable from the MAC. Proof of Concept: Same firmware as the previous report. Generated an Ed25519 test keypair with the real usign binary from this firmware (not Netis's key - I don't have that), substituted the test public key into a copy of the script in place of the embedded one, and ran it - real busybox ash, real usign, real uci reading a test config - under qemu-user with binfmt_misc registered so the chained usign/uci calls actually execute. Garbage signature: Status: 403 Forbidden Content-type: text/html <h1>403 Forbidden</h1> Valid signature (test key, fake MAC, script's embedded key swapped for the test public key, UCI test config carrying admin/TestPlaintextPassword123): Status: 200 OK Content-type: text/html admin TestPlaintextPassword123 Both match what the set -e / trap EXIT / errcode control flow predicts, run against the actual shipped script logic. Impact: Not exploitable by an arbitrary attacker today - requires the private half of the key behind a27b557e0eaaa926, which as far as I can tell only Netis holds. Regardless of who currently has it, this is undocumented backdoor functionality in production firmware, gated by one static key, disclosing plaintext admin credentials with no audit trail and no session requirement. Signing-key leaks at router vendors aren't hypothetical. If this key ever leaks, every device carrying this public key becomes a one-request credential dump given nothing but its LAN MAC. Vendor contact: Same note as the previous submission - sent to [email protected] on 2026-09-08, no security contact found published anywhere, no reply as of this submission.
Benutzer
 arpe1618 (UID 101090)
Einreichung18.09.2026 07:52 (vor 1 Monat)
Moderieren19.10.2026 16:52 (1 month later)
StatusAkzeptiert
VulDB Eintrag422394 [Netis EAP930 1.250905.115454 CGI Endpoint /cgi-bin/debug return200 SIGNATURE erweiterte Rechte]
Punkte17

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!