The CVE published two days after the vendor was notified, the researcher’s own advisory still lists public disclosure as pending, and no fixed version is named.
What happened
On September 5, 2026, VulnCheck published CVE-2026-86185 against Bilibili Desktop, the Windows client for the Chinese video platform. The NVD record went live at 2026-09-05T12:16:49.240 and describes the flaw in one sentence:
“Bilibili Desktop through 1.18.0 disables TLS certificate verification process-wide and executes unsigned remote JavaScript configuration without integrity checks. An attacker in an on-path network position can intercept configuration fetches, inject arbitrary JavaScript executed in the renderer with access to the privileged IPC bridge, and execute system commands or steal login credentials.”
VulnCheck, acting as the assigning CNA, scores it 8.0 on CVSS 3.1 — AV:A/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H — and 8.6 on CVSS 4.0. The AV:A is the important character in that string: this is an adjacent-network attack, not an internet-facing one. The weakness is recorded as CWE-295, improper certificate validation. Affected versions are given as “0 through 1.18.0” on Windows. No fixed version is named, in the NVD record or in VulnCheck’s own advisory.
The mechanism comes from the researcher’s advisory, published by LeoWSY-hashblue and referenced by the CVE. It has two halves that only matter together.
The first is a single line in the main-process entry point: process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0". That is Node.js’s global kill switch for certificate validation. Set there, every HTTPS request the application’s main process makes will accept any certificate, from anyone.
The second is what the application does with one of those requests. On startup it fetches configuration from GET https://api.bilibili.com/x/elec-frontend/config/injectcode. The response, per the advisory, carries an enable flag, a set of url regular expressions, and a js field containing JavaScript source. There is no signature and no integrity check on that payload. On each in-app browser page load whose URL matches one of those patterns, the client passes the js content to executeJavaScript().
The code that runs has access to window.biliBridgePc, which the advisory describes as a privileged IPC bridge exposing 211 registered channels, including the ability to launch executables. The chain, as the researcher lays it out: an attacker on the same network intercepts the config fetch, presents a self-signed certificate that the client accepts because verification is off, returns JavaScript of their choosing, and gets it executed with bridge access the next time the victim opens a page inside the app.
The advisory’s own timeline reads: discovery on September 2, 2026; vendor notified on September 3 through the vulbox platform; CVE published by the VulnCheck CNA; public disclosure listed as to be determined, under a 90-day coordinated window. The repository holding it contains a single file, advisory.md, and the repository description calls it a “Sanitized advisory.” There is no exploit code in it.
Why it matters
Neither half of this would draw much attention alone. Shipping with certificate validation disabled is a bad bug that gets you traffic interception and credential theft on a hostile network — serious, bounded, and common enough that it rarely makes anyone’s morning reading. Fetching executable JavaScript from your own backend and running it in a privileged context is not a bug at all; it is a feature, and a widely used one. Hot-patching client behavior without shipping a release is exactly why an endpoint called injectcode exists.
Put them in the same binary and the second feature inherits the first bug’s trust model. The channel that delivers code to the privileged context is now a channel anyone on the path can write to. That is the whole finding, and it is why the CWE assignment is worth arguing with. NVD carries CWE-295 and nothing else. The researcher’s own repository description names three: CWE-295, CWE-494 (download of code without integrity check), and CWE-94 (code injection). Only one of those three made it into the record. A team that filters advisories by weakness class — watching for code-injection and integrity-check failures in desktop software, as plenty do — will not see this one at all. It is filed under a certificate bug, and the certificate bug is the least interesting part.
The NODE_TLS_REJECT_UNAUTHORIZED = "0" line deserves naming as a class. It is the desktop equivalent of verify=False in a Python script: a development-time workaround for a self-signed test certificate or a corporate proxy, set once to make an error go away, and then never removed. Node prints a warning to stderr when the variable is set. In a packaged Electron application, stderr goes nowhere anyone reads. The guardrail exists and is structurally invisible in exactly the deployment where it matters most.
The 211 channels are the other number to sit with. The point of an IPC bridge in an Electron app is to expose a deliberately narrow set of main-process capabilities to renderer code that should not be trusted. A bridge with 211 channels on it, one of which starts processes, is not a narrow interface. It is a second API surface, and it means that any renderer-side code execution — from this bug, from a cross-site scripting flaw in embedded content, from anything — converts more or less directly into main-process code execution. The bridge size is a design decision made long before this CVE, and it is what turns “attacker runs JavaScript in a web view” into “attacker runs commands.”
On urgency, be plain: there is no observed exploitation, and the attacker has to be on the network path. AV:A means a shared Wi-Fi network, a hotel or conference LAN, a compromised router, or an upstream hop. That is a real position and an unglamorous one to obtain, and it is not the internet. The realistic risk profile is a targeted user on an untrusted network, not a mass event.
The disclosure sequence is its own small story. The vendor was notified on September 3. The CVE, carrying a description that states the mechanism plainly enough to reproduce from, was published on September 5 — two days later. The researcher’s advisory, written before that, still lists public disclosure as pending under a 90-day coordinated window. That window closed the moment the CVE went out, and the researcher did not close it. A third-party CNA publishing a record is under no obligation to hold to the reporting researcher’s embargo, and this is what it looks like when those two clocks disagree. Worth noting alongside it: the researcher’s timeline dates the CVE publication to September 6, while both NVD and VulnCheck’s own advisory page date it to September 5. Small, but it is the kind of drift that makes a disclosure timeline hard to audit later.
What to do
There is no patch. Treat every build through 1.18.0 as affected, and do not assume a later version fixes it — nothing in the record says one does.
For most organizations reading this, the decision is inventory rather than remediation. Bilibili Desktop is a consumer media client; the question is whether it is installed on managed endpoints, and if so, why. Check your software inventory for it. Where it is present and needed, keep it off untrusted networks, and note that the trigger is opening a page in the app’s built-in browser — the risky action is in-app navigation, not merely having the client running.
The transferable work is on your own applications, and it is cheap. Grep every Electron or Node build you ship for NODE_TLS_REJECT_UNAUTHORIZED, including in dependencies and build scripts; a match is a finding, not a style question. Then find every remote configuration endpoint your clients fetch, and ask of each one whether the response can contain code, and whether the response is signed. If the answer is yes and no in that order, you have this bug. Finally, count the channels on your IPC bridge. If the number surprises you, that is the audit.
For detection, the config fetch itself is distinctive: requests to api.bilibili.com/x/elec-frontend/config/injectcode from a managed endpoint tell you the client is installed and reaching for remote code, regardless of whether anyone is tampering with the response.
Sourcing note
Checked directly: the NVD record for CVE-2026-86185 (published 2026-09-05T12:16:49.240, last modified the same), for the description quoted in full above, both CVSS vectors, the CWE assignment, the affected-version range, and the absence of a named fixed version; VulnCheck’s advisory page for the same CVE, for its disclosure date of September 5, 2026 and its credit to LeoWSY-hashblue; and the researcher’s advisory.md on GitHub for the technical mechanism, the environment variable, the configuration endpoint, the bridge channel count, and the disclosure timeline.
The repository itself was checked for exploit code. It contains one file, advisory.md, and its description calls the contents sanitized. Nothing weaponized is published there as of this writing.
Unresolved: whether Bilibili has responded to the September 3 report. The advisory records the notification and nothing after it, VulnCheck’s page states no vendor status, and this publication has no independent confirmation either way — so the absence of a vendor response here is an absence of information, not a finding about the vendor. Also unresolved is whether the flaw reaches the platform’s other desktop builds; the CVE names Windows, and neither source addresses macOS or Linux clients. The record carries no CISA KEV fields and there is no federal deadline attached.
One conflict, stated as a conflict: the researcher’s timeline dates the CVE publication to September 6, 2026; NVD and VulnCheck both date it to September 5, 2026. This story uses September 5, because that is what the two primary records say.

