GHSA-hfxh-rjv7-2369

Suggest an improvement
Source
https://github.com/advisories/GHSA-hfxh-rjv7-2369
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2023/11/GHSA-hfxh-rjv7-2369/GHSA-hfxh-rjv7-2369.json
JSON Data
https://api.osv.dev/v1/vulns/GHSA-hfxh-rjv7-2369
Published
2023-11-27T17:25:11Z
Modified
2023-11-27T17:25:11Z
Summary
Uptime Kuma Authenticated remote code execution via TailscalePing
Details

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.

Database specific
{
    "cwe_ids":  [],
    "github_reviewed":  true,
    "github_reviewed_at":  "2023-11-27T17:25:11Z",
    "nvd_published_at":  null,
    "severity":  "MODERATE"
}
References

Affected packages

npm / uptime-kuma

Package

Affected ranges

Type
SEMVER
Events
Introduced
1.23.0
Fixed
1.23.7

Database specific

last_known_affected_version_range
"<= 1.23.6"
source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2023/11/GHSA-hfxh-rjv7-2369/GHSA-hfxh-rjv7-2369.json"