{"id":"CVE-2026-66747","aliases":["EUVD-2026-53301","GHSA-gf5q-q6h6-j87v"],"status":"published","title":"ENDLESSDOORS: Zbtlink Router rctl/kworker Phone-Home Root Implant","description":"Zbtlink router firmware ships an embedded remote-control implant, ENDLESSDOORS, present in every published build across the product line. It is the open-source ycsunjane/rctl tool built in as an OpenWrt package (librctl.so), started at boot and run as root under the process name kworker to blend in with the kernel's [kworker/*] threads. It opens no listening port; it phones home over cleartext TCP to a hardcoded command-and-control server (command channel 7000, interactive-shell callback 7001) with no authentication and no transport encryption, re-attempting contact roughly every 35 seconds. Its command handler passes any received string to popen() as uid=0, and a reserved rctlbash command returns an interactive root shell. Because the channel is unauthenticated and cleartext, control is not limited to whoever planted it: any party that answers at the C2 address, occupies the network path (DNS or route hijack), or acquires the hardcoded fallback domain obtains unauthenticated remote code execution as root.","severity":{"version":"4.0","score":9.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N","level":"critical","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-10","score":0.00789,"percentile":0.5655,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":true,"fix_available":false},"cwes":["CWE-506"],"published":"2026-08-05T10:50:45Z","modified":"2026-09-09T20:35:08Z","exploits":[{"source":"pocgithub","id":"oiehnow/oieh-router-checker","title":"oiehnow/oieh-router-checker","date":"2026-08-22","url":"https://github.com/oiehnow/oieh-router-checker"}],"products":[{"vendor":"zbtlink","product":"cpe2801 firmware"},{"vendor":"zbtlink","product":"we1026-5g-wd firmware"},{"vendor":"zbtlink","product":"we1326 firmware"},{"vendor":"zbtlink","product":"we2007 firmware"},{"vendor":"zbtlink","product":"we2008-dsim firmware"},{"vendor":"zbtlink","product":"we2416 firmware"},{"vendor":"zbtlink","product":"we3326 firmware"},{"vendor":"zbtlink","product":"we5927 firmware"},{"vendor":"zbtlink","product":"we5931 firmware"},{"vendor":"zbtlink","product":"we5931ac firmware"},{"vendor":"zbtlink","product":"we826-t3-dsim firmware"},{"vendor":"zbtlink","product":"wg108 firmware"},{"vendor":"zbtlink","product":"wg1602 firmware"},{"vendor":"zbtlink","product":"wg1608-dsim firmware"},{"vendor":"zbtlink","product":"wg209 firmware"},{"vendor":"zbtlink","product":"wg2105 firmware"},{"vendor":"zbtlink","product":"wg2107 firmware"},{"vendor":"zbtlink","product":"wg259 firmware"},{"vendor":"zbtlink","product":"wg3526 firmware"},{"vendor":"zbtlink","product":"zbt-z8102ax-2sim firmware"}],"references":[{"url":"https://www.vulncheck.com/blog/zbt-endlessdoors","tags":["technical-description","exploit"]},{"url":"https://www.zbtlink.com/pages/zbt-router-firmware-download","tags":["product"]},{"url":"https://github.com/ycsunjane/rctl"},{"url":"https://www.vulncheck.com/advisories/zbt-endlessdoors","tags":["third-party-advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-66747"},{"url":"https://github.com/advisories/GHSA-gf5q-q6h6-j87v"}],"sources":{"cve":[{"id":"CVE-2026-66747","title":"ENDLESSDOORS: Zbtlink Router rctl/kworker Phone-Home Root Implant","description":"Zbtlink router firmware ships an embedded remote-control implant, ENDLESSDOORS, present in every published build across the product line. It is the open-source ycsunjane/rctl tool built in as an OpenWrt package (librctl.so), started at boot and run as root under the process name kworker to blend in with the kernel's [kworker/*] threads. It opens no listening port; it phones home over cleartext TCP to a hardcoded command-and-control server (command channel 7000, interactive-shell callback 7001) with no authentication and no transport encryption, re-attempting contact roughly every 35 seconds. Its command handler passes any received string to popen() as uid=0, and a reserved rctlbash command returns an interactive root shell. Because the channel is unauthenticated and cleartext, control is not limited to whoever planted it: any party that answers at the C2 address, occupies the network path (DNS or route hijack), or acquires the hardcoded fallback domain obtains unauthenticated remote code execution as root.","status":"published","published":"2026-08-05T10:50:45.576Z","modified":"2026-08-05T14:20:12.478Z","cvss":[{"version":"4.0","score":9.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N","level":"critical","assessor":"cna"},{"version":"3.1","score":9.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"critical","assessor":"cna"}],"cwes":["CWE-506"],"updated_at":"2026-11-02T14:20:12.939084Z"}],"euvd":[{"id":"EUVD-2026-53301","description":"Zbtlink router firmware ships an embedded remote-control implant, ENDLESSDOORS, present in every published build across the product line. It is the open-source ycsunjane/rctl tool built in as an OpenWrt package (librctl.so), started at boot and run as root under the process name kworker to blend in with the kernel's [kworker/*] threads. It opens no listening port; it phones home over cleartext TCP to a hardcoded command-and-control server (command channel 7000, interactive-shell callback 7001) with no authentication and no transport encryption, re-attempting contact roughly every 35 seconds. Its command handler passes any received string to popen() as uid=0, and a reserved rctlbash command returns an interactive root shell. Because the channel is unauthenticated and cleartext, control is not limited to whoever planted it: any party that answers at the C2 address, occupies the network path (DNS or route hijack), or acquires the hardcoded fallback domain obtains unauthenticated remote code execution as root.","status":"published","published":"2026-08-05T10:50:45Z","modified":"2026-08-05T14:20:12Z","cvss":[{"version":"4.0","score":9.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N","level":"critical"}],"updated_at":"2026-11-02T18:02:10.319044Z"}],"ghsa":[{"id":"GHSA-gf5q-q6h6-j87v","title":"Zbtlink router firmware ships an embedded remote-control implant, ENDLESSDOORS, present in every...","description":"Zbtlink router firmware ships an embedded remote-control implant, ENDLESSDOORS, present in every published build across the product line. It is the open-source ycsunjane/rctl tool built in as an OpenWrt package (librctl.so), started at boot and run as root under the process name kworker to blend in with the kernel's [kworker/*] threads. It opens no listening port; it phones home over cleartext TCP to a hardcoded command-and-control server (command channel 7000, interactive-shell callback 7001) with no authentication and no transport encryption, re-attempting contact roughly every 35 seconds. Its command handler passes any received string to popen() as uid=0, and a reserved rctlbash command returns an interactive root shell. Because the channel is unauthenticated and cleartext, control is not limited to whoever planted it: any party that answers at the C2 address, occupies the network path (DNS or route hijack), or acquires the hardcoded fallback domain obtains unauthenticated remote code execution as root.","status":"published","published":"2026-08-05T12:31:30Z","modified":"2026-08-05T12:31:36Z","cvss":[{"version":"4.0","score":9.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","level":"critical"},{"version":"3.1","score":9.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"critical"}],"cwes":["CWE-506"],"updated_at":"2026-11-02T15:10:06.632203Z"}],"nvd":[{"id":"CVE-2026-66747","description":"Zbtlink router firmware ships an embedded remote-control implant, ENDLESSDOORS, present in every published build across the product line. It is the open-source ycsunjane/rctl tool built in as an OpenWrt package (librctl.so), started at boot and run as root under the process name kworker to blend in with the kernel's [kworker/*] threads. It opens no listening port; it phones home over cleartext TCP to a hardcoded command-and-control server (command channel 7000, interactive-shell callback 7001) with no authentication and no transport encryption, re-attempting contact roughly every 35 seconds. Its command handler passes any received string to popen() as uid=0, and a reserved rctlbash command returns an interactive root shell. Because the channel is unauthenticated and cleartext, control is not limited to whoever planted it: any party that answers at the C2 address, occupies the network path (DNS or route hijack), or acquires the hardcoded fallback domain obtains unauthenticated remote code execution as root.","status":"published","published":"2026-08-05T11:16:25.51Z","modified":"2026-09-09T20:35:08.537Z","cvss":[{"version":"4.0","score":9.3,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","level":"critical","assessor":"secondary"},{"version":"3.1","score":9.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","level":"critical","assessor":"secondary"}],"cwes":["CWE-506"],"updated_at":"2026-11-02T14:12:35.031043Z"}]}}
