CVE-2026-90938: LangBot through 0.4.17 Unauthenticated Plugin Registration via WebSocket

Published Sep 14, 2026
·
Updated

LangBot's plugin runtime (pip package langbotplugin) through 0.4.17 starts a debug WebSocket server on 0.0.0.0:5401 (/plugin/ws) whose authentication is gated on plugindebugkey, which defaults to an empty string and is never set by the upstream repository, Docker image, or docker-compose (which additionally publishes port 5401 to the host); the key check is therefore skipped entirely. Any remote attacker able to reach the port can register an arbitrary "debug plugin" without credentials. Because events are broadcast to all initialized plugins without filtering, the attacker's plugin receives the full context of every IM message event (including private chats, message chains, and user/sender IDs in plaintext) and can inject forged replies, send messages as any configured bot, enumerate bot UUIDs, invoke configured LLM models, read knowledge-base contents, and register malicious tools that feed every user's LLM pipeline. Registering with "prodmode": true causes later legitimate installations of a plugin with the same author/name to be rejected, resulting in persistent denial of service. No patched version was available at the time of publication.

Affected Software

1 affected component
pypi/langbot_plugin<0.4.17

Event History

Sep 14, 2026
CVE Published
via MITRE·12:48 PM
Data Sourced
via MITRE·12:48 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·01:19 PM
DescriptionSeverityWeakness

Frequently Asked Questions

1

Which deployments are exposed to unauthenticated plugin registration?

Deployments running langbot_plugin through 0.4.17 are exposed when an attacker can reach the debug WebSocket service at 0.0.0.0:5401/plugin/ws. The upstream repository, Docker image, and docker-compose configuration do not set plugin_debug_key, and docker-compose also publishes port 5401 to the host.

2

Does exploitation require credentials or user interaction?

No. The authentication check is skipped when plugin_debug_key is empty, allowing any network-reachable attacker to register a debug plugin without credentials or user interaction.

3

What can an attacker do after registering a plugin?

A malicious plugin can receive the full context of IM message events, including private chats, message chains, and user and sender IDs. It can also forge replies, send messages as configured bots, enumerate bot UUIDs, invoke configured LLM models, read knowledge-base contents, and register tools affecting users' LLM pipelines.

4

Is there a workaround if no patch is available?

Restrict network access to port 5401 so untrusted remote systems cannot reach the WebSocket service, and set a non-empty plugin_debug_key. No patched version was available at publication.

5

Can exploitation persist after the attacker's connection ends?

Yes. An attacker can register a plugin with prod_mode set to true; later legitimate installations using the same author and name are rejected, causing persistent denial of service.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203