Home/ Blog/ Security news/ Article
Blog · Security news

VulnCheck: Zbtlink routers ship a factory root shell with no fix. The model list is not where you start.

VulnCheck found a factory-shipped remote-access implant in 20 Zbtlink router models that calls home and hands a remote root shell. There is no patched firmware.

Small networking box on a plain surface with one thin thread reaching upward off frame

Start with the part the coverage buried: you cannot patch this, and you may not know you own one. VulnCheck disclosed a remote-access implant baked into the firmware of 20 router models sold under the Zbtlink name and its white-label siblings, and the vendor has no fixed firmware to ship. The affected-model list is real, but it is the wrong place a defender starts, because the same hardware ships rebranded under several labels. The signal you can actually trust is the router calling out to a stranger every 35 seconds.

VulnCheck CTO Jacob Baines found the implant after a test router on his desk kept trying to reach servers he had never configured. His team named it ENDLESSDOORS. It is built on rctl, a small remote-control-for-Linux project last touched in 2015, and it rides in 21 firmware images across 20 models. Zbtlink stated the capability was meant only for after-sales maintenance and debugging on sample units, then pulled the affected firmware from its download page and acknowledged unspecified firmware security issues. Baines' team reads it as a deliberate implant rather than a later compromise.

What the implant actually does

Two processes pose as the Linux kernel worker thread kworker, run with root privileges, and come up at boot from an init script called skworker. One of them calls out to hardcoded command servers as often as every 35 seconds, per VulnCheck. Its check-in carries little more than a padded label and the device's own LAN MAC address, with no key exchange and nothing on the wire to prove who is on the other end. Replies from the server drop straight into popen() as root, unfiltered and unsandboxed, and one trigger string opens a live interactive shell on port 7001. Control the four servers and you hold every one of these routers at the same moment.

Four endpoints steer the fleet, spread across Alibaba Cloud, Vultr, and a Jiangsu host so no single takedown clears them:

  • zbtctl.epplink[.]net at 47.100.190[.]96
  • 47.107.224[.]89, hardcoded with no name attached
  • online-string[.]com at 45.32.81[.]152
  • rbdg4nzqadui.wikaba[.]com at 43.248.136[.]125

That traffic rides port 7000. One more detail worth sitting with: VulnCheck chose not to warn the vendor first. Telling Zbtlink about a capability Zbtlink built, they reasoned, would mostly alert whoever operates the servers.

Why the model list is the wrong starting point

The affected units are white-label boards from one Shenzhen manufacturer, resold under Zbtlink, Wiflyer, ZBT, and ZBTWiFi labels. So the sticker on the case and the model in your asset inventory may not line up with VulnCheck's list, and a defender who only greps a spreadsheet of SKUs will miss the rebranded ones. The reliable tell is behavioral, not nominal: an edge device reaching a fixed set of foreign IPs on port 7000 on a tight, machine-regular interval is doing something no home or small-office router should do on its own. Hunt the call-out, then confirm the model. Not the other way around.

That check-in is also cleaner to catch than most command traffic because it is dumb and periodic. Human-driven malware jitters its callbacks to blend in. A maintenance implant on a fixed 35-second timer does not. A single rule on your gateway segment that flags any internal device holding a steady outbound rhythm to a small set of external hosts on an odd high port will surface this and a dozen unrelated problems worth knowing about.

The fake-kworker heuristic, and why it travels

The masquerade the implant uses is a gift, because it breaks a rule that real kernel threads never break. A genuine kworker is a kernel thread. It has no file on disk, it never holds a network socket, and its parent is kthreadd at PID 2. The implant is a userland program wearing that name. So a process claiming to be kworker that owns a TCP connection, or that maps back to an on-disk binary, is by definition an impostor. That check is worth adding to your hunt library well beyond this vendor, because naming a payload after a kernel thread is a tired trick plenty of other implants reuse.

SignalReal kworkerENDLESSDOORS impostor
Backing file on diskNone (kernel thread)Yes, at /usr/sbin/kworker
Holds a network socketNeverYes, outbound TCP 7000
Parent processkthreadd (PID 2)Userland init chain
Config fileNone/etc/kworker.cfg
Source: Suriq Research Desk, from VulnCheck's ENDLESSDOORS analysis.

On a device you can reach a shell on, the on-disk indicators are direct: the fake binary at /usr/sbin/kworker, the loader /usr/lib/librctl.so, the config at /etc/kworker.cfg, and the boot script /etc/init.d/skworker. On a device you cannot log into, which is most consumer routers, the network call-out is your only vantage point, which is exactly why the egress rule matters more than the file list.

No patch is coming, so treat the router as untrusted hardware

There is no fixed firmware, and even if Zbtlink ships one, the honest question is whether you would trust an update channel that already delivered a standing root shell across two dozen models and years of releases. A root-level implant with no vendor fix cannot be cleaned in place. The sound response is to isolate the device, replace it, and treat everything that transited it as observed: any credential, session, or management traffic that crossed one of these routers should be considered exposed and rotated. Blocking egress to the four endpoints above is a stopgap, not a cure, because the operator can move infrastructure faster than you can chase it.

If any of this feels familiar, it should. We have watched a forgotten router turn into a scanning node, a legacy Cisco flaw get exploited with no patch on the way, and a run of backdoors dressed up as ordinary tooling. The recurring lesson is not about one brand. The edge device nobody configured, the one humming quietly in a closet, is often the one carrying the standing shell. The gear at the boundary deserves the same egress monitoring and the same suspicion you already give your servers, because the boundary is where the quiet command channel lives.

Topics

Frequently asked questions

Which Zbtlink router models are affected by ENDLESSDOORS?

VulnCheck listed 20 models across 21 firmware images, including the WE and WG series such as WE1326, WE3326, WG1608-DSIM, and Z8102AX-2DSIM. The same boards ship rebranded under Wiflyer, ZBT, and ZBTWiFi, so the label on your device may not match the list.

Is there a firmware patch for the Zbtlink backdoor?

No fixed firmware exists yet. Zbtlink pulled the affected images from its download page and said it is working on secured firmware. Because the implant runs at root with no vendor fix, the safe response is to isolate and replace affected routers rather than wait for an update.

How do I detect an affected router on my network?

Watch for outbound traffic on port 7000 to a fixed set of foreign hosts on a tight interval near 35 seconds. On a device you can shell into, check for files at /usr/sbin/kworker, /usr/lib/librctl.so, /etc/kworker.cfg, and /etc/init.d/skworker.

Is ENDLESSDOORS a vendor backdoor or malware from an attacker?

VulnCheck characterizes it as an intentional, factory-shipped implant rather than a later compromise, citing its presence across two dozen models and years of firmware. Zbtlink stated the capability was solely for after-sales maintenance and debugging on sample units. The two accounts differ on intent.

What is the risk if an attacker reaches the router?

The implant hands whoever contacts it an unauthenticated interactive root shell. That means full control of the router: reading and redirecting traffic, pivoting to devices behind it, and persisting across reboots. Any credential or session that crossed the device should be treated as exposed.

Ready to meet the Guardians?

Deploys fast - agentless for monitoring and cloud, a lightweight agent for deep endpoint security. Just Suriq, standing watch.