GHSA-hfxh-rjv7-2369 json
Uptime Kuma Authenticated remote code execution via TailscalePing
published 2y ago modified 2y ago
- cvss
- —
- not scored
- cisa kev
- Not listed
- not in CISA's catalog
- epss
- —
- no score, EPSS covers CVEs only
- public exploits
- 0
- none known
Summary
### Summary
The `runTailscalePing` method of the `TailscalePing` class injects the `hostname` parameter inside a shell command, leading to a command injection and the possibility to run arbitrary commands on the server.
### Details
When adding a new monitor on Uptime Kuma, we can select the "Tailscale Ping" type. Then we can add a hostname and insert a command injection payload into it. The front-end application requires that the field follow a specific pattern, this validation only happens on the front-end and can be removed by removing the attribute `pattern` on the `input` element.
https://github.com/louislam/uptime-kuma/blob/dc4242019331e65a79ac16deef97510144e01b12/server/monitor-types/tailscale-ping.js#L40-L46
We can finally add the new monitor and observe that our command is being executed.
**NOTE:** When using Uptime Kuma inside a container, the "TailScale Ping" type is not visible. We can fake this information by intercepting WebSocket messages and set the `isContainer` option to `false`.
### PoC
* Authenticate. * Create a new monitor. * Select the TailScale Ping type (if not visible, see the note in the details section). * Insert the command injection payload inside the `hostname` field. (for example `$(id >&2)`) * Remove the `pattern` requirement on the field. * Save and start the monitor.
### Impact
An authenticated user can execute arbitrary command on the server running Uptime Kuma.
### Remediation
There are other command execution in the codebase, they use a method `spawn` from the `child_process` module which does not interpret the command as a shell command, the same thing should be done here.
**NOTE:** The Tailscale CLI seems to support the `--` sequence. It should be used between the `ping` subcommand and the `hostname` argument to avoid argument injection.
Patch / fix
- npm uptime-kuma 1.23.7
Is GHSA-hfxh-rjv7-2369 in your dependencies? Fencer shows which of your repositories are affected as soon as an advisory lands, and opens the fix as a pull request.
Check with FencerAffected packages
| ecosystem | package | affected | fixed in |
|---|---|---|---|
| npm | uptime-kuma | >=1.23.0, <1.23.7 |
1.23.7 |
References
Sources
- GitHub Advisory GHSA-hfxh-rjv7-2369
Fencer Intel keeps one entry per vulnerability: the CVE id wins, then GHSA, and records that alias each other are merged, except that two CVEs always keep separate entries. The same data is available as JSON.