CVE-2026-42841: Getgrav/grav Cross-Site Scripting Vulnerability

MODERATE
Advisory Identifier: GHSA-r7fx-8g49-7hhr
CVSS 4.8
CWE-79
Published
Advisory Summary

CVE-2026-42841 is a MODERATE (CVSS 4.8) cross-site scripting vulnerability (CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')) affecting Getgrav/grav libraries in the Packagist ecosystem. The issue involves grav cms vulnerable to stored xss via markdown media attribute() action. Remediation is available by upgrading affected packages to version 2.0.0-beta.2.

CVE-2026-42841 at a Glance

CVE Identifier CVE-2026-42841
GHSA Identifier GHSA-r7fx-8g49-7hhr
Severity MODERATE
CVSS v3.1 Base Score 4.8
CWE Classification CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
Affected Product Getgrav/grav
Package Ecosystem Packagist
Published Date
Last Updated

Security Impact

CVSS: 4.8

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required High (PR:H)
User Interaction Required (UI:R)
Scope Changed (S:C)
Confidentiality Low (C:L)
Integrity Low (I:L)
Availability None (A:N)

How to Fix CVE-2026-42841

To remediate this vulnerability, upgrade all affected Getgrav/grav dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

getgrav/grav fixed: 2.0.0-beta.2
Upgrade getgrav/grav to 2.0.0-beta.2
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for getgrav/grav

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-42841, inspect your project dependencies for Getgrav/grav:

inspect dependencies for getgrav/grav

Analyze the terminal output to locate any version of Getgrav/grav in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 2.0.0-beta.2), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting'), where the product does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users. In Getgrav/grav, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### Summary An authenticated user with page editing permissions can inject an executable JavaScript event-handler attribute into rendered image HTML through Grav's Markdown media action syntax. The issue is caused by Markdown image query parameters being converted into callable media actions. The public `attribute()` media method can be reached this way, allowing an editor to set an arbitrary HTML attribute name and value on the generated image element. For example, this Markdown: ```markdown ![Quarterly market overview](market-overview.gif?attribute=onload,alert(document.domain)) ``` is rendered as an image tag containing an executable `onload` handler: ```html <img onload="alert(document.domain)" alt="Quarterly market overview" src="/user/pages/03.campaigns/market-overview.gif?..."> ``` This results in stored XSS when another user views the affected page. In a multi-user Grav installation, a lower-privileged page editor could use this to target administrators or reviewers who preview or view editor-controlled content. Tested versions: - Grav CMS: 1.7.49.5 - Admin Plugin: 1.10.49.1 Suggested classification: - CWE-79: Improper Neutralization of Input During Web Page Generation - Stored Cross-Site Scripting - Suggested CVSS v4.0 score if page editing is considered high privilege: 6.9 Medium - Suggested CVSS v4.0 vector: `CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:P/VC:H/VI:L/VA:N/SC:H/SI:L/SA:N` - Suggested CVSS v3.1 score if page editing is considered high privilege: 6.9 Medium - Suggested CVSS v3.1 vector: `CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:N` ### Details The issue appears to come from this source-to-sink flow: 1. `ParsedownGravTrait::inlineImage()` processes Markdown images. 2. `Excerpts::processImageExcerpt()` resolves the referenced media object. 3. `Excerpts::processMediaActions()` parses the image URL query string into media actions. 4. `call_user_func_array()` invokes the requested action method on the media object. 5. `MediaObjectTrait::attribute()` stores the attacker-controlled attribute name and value. 6. The media object returns a Parsedown element containing the injected attribute. 7. Parsedown renders the attribute name into the final HTML. Relevant code paths: ```text system/src/Grav/Common/Markdown/ParsedownGravTrait.php system/src/Grav/Common/Page/Markdown/Excerpts.php system/src/Grav/Common/Media/Traits/MediaObjectTrait.php system/src/Grav/Common/Page/Medium/StaticImageMedium.php system/src/Grav/Common/Page/Medium/ImageMedium.php vendor/erusev/parsedown/Parsedown.php ``` In `system/src/Grav/Common/Markdown/ParsedownGravTrait.php`, Markdown image excerpts are passed into Grav-specific media handling: ```php if (isset($excerpt['element']['attributes']['src'])) { $excerpt = $this->excerpts->processImageExcerpt($excerpt); } ``` In `system/src/Grav/Common/Page/Markdown/Excerpts.php`, query string parameters are converted into media action calls. The query parameter name becomes the method name: ```php $carry[] = ['method' => $parts[0], 'params' => $value]; ``` The requested method is later invoked dynamically: ```php $medium = call_user_func_array([$medium, $action['method']], $args); ``` For the payload: ```text attribute=onload,alert(document.domain) ``` the method is `attribute`, and the arguments are `onload` and `alert(document.domain)`. In `system/src/Grav/Common/Media/Traits/MediaObjectTrait.php`, `attribute()` stores the caller-controlled attribute name directly: ```php public function attribute($attribute = null, $value = '') { if (!empty($attribute)) { $this->attributes[$attribute] = $value; } return $this; } ``` The image media classes then return the collected attributes as attributes for an `img` element. In `system/src/Grav/Common/Page/Medium/StaticImageMedium.php`: ```php return ['name' => 'img', 'attributes' => $attributes]; ``` The non-static image path in `system/src/Grav/Common/Page/Medium/ImageMedium.php` also returns image attributes in the same way. Finally, in `vendor/erusev/parsedown/Parsedown.php`, the attribute value is escaped, but the attribute name is rendered as-is: ```php $markup .= ' '.$name.'="'.self::escape($value).'"'; ``` As a result, the attacker-controlled attribute name `onload` is emitted into the final HTML and executes as a browser event handler. The Admin Plugin's save-time XSS detection does not appear to block this because the stored content is Markdown media syntax, not raw HTML: ```markdown ![Quarterly market overview](market-overview.gif?attribute=onload,alert(document.domain)) ``` The dangerous HTML is generated later during Markdown/media rendering. ### PoC I reproduced this on a standard Grav CMS installation with the Admin Plugin enabled. Configuration and prerequisites: - Grav CMS 1.7.49.5 - Admin Plugin 1.10.49.1 - Markdown processing enabled for pages - A user account with permission to create or edit pages - A page media file available in the edited page folder, for example `market-overview.gif` Steps to reproduce: 1. Install Grav CMS with the Admin Plugin. 2. Log in to the Admin panel as a user who can create or edit pages. 3. Create a normal content page or edit an existing one. 4. Add or reference a page media file named `market-overview.gif`. 5. Insert the following Markdown into the page body: ```markdown ![Quarterly market overview](market-overview.gif?attribute=onload,alert(document.domain)) ``` 6. Save the page. 7. Open the rendered frontend page in a browser. 8. The JavaScript payload executes when the image loads. 9. Inspect the generated DOM. The rendered image element contains the injected `onload` attribute. Expected result: The Markdown media action should not be able to generate executable HTML attributes. The payload should be rejected, sanitized, or rendered without the dangerous event-handler attribute. Actual result: The payload is accepted and rendered as an executable image event handler: ```html <img onload="alert(document.domain)" alt="Quarterly market overview" src="/user/pages/03.campaigns/market-overview.gif?..."> ``` Screenshots: - the stored Markdown payload in the page editor <img width="1718" height="1013" alt="edycja" src="https://github.com/user-attachments/assets/8f5e5275-e4ef-4d5e-a2cd-44683537b909" /> - the JavaScript alert executing on the frontend page <img width="1727" height="1002" alt="alert" src="https://github.com/user-attachments/assets/6de81228-830c-49f2-ac41-b15658a8913d" /> - browser DevTools showing the injected `onload` attribute in the rendered DOM <img width="939" height="539" alt="inspect" src="https://github.com/user-attachments/assets/7832c42d-6f3a-4ea2-b072-b837bd3913ed" /> ### Impact This is a stored cross-site scripting vulnerability. An authenticated user with page editing permissions can store a malicious Markdown image reference. When the affected page is rendered, the payload executes in the browser of any user who views that page. In multi-user Grav installations, this may allow a lower-privileged editor to target administrators, reviewers, or other privileged users who preview or view editor-controlled content. Depending on the victim's privileges and deployed plugins, successful exploitation may allow JavaScript execution in the site origin, access to same-origin page data available to the victim, and same-origin actions performed as the victim. CVSS 4.0 rationale: - `AV:N`: the issue is exploitable through the web application. - `AC:L`: no special race condition or complex setup is required after page editing access is obtained. - `AT:P`: exploitation requires the malicious Markdown/media reference to be stored in page content and later rendered to a victim. - `PR:H`: the attacker needs page editing capability. - `UI:P`: a victim must view the affected page. The demonstrated `onload` payload executes on passive page rendering, without requiring a click or form submission by the victim. - `VC:H/VI:L/VA:N`: confidentiality impact can be high when the victim is an administrator or reviewer; integrity impact is limited; no direct availability impact was demonstrated. - `SC:H/SI:L/SA:N`: the injected script executes in the browser/application context and may affect subsequent same-origin interactions available to the victim. ## Maintainer note — fix applied (2026-04-24) Fixed in Grav core on the `2.0` branch: commit [`5a12f9be8`](https://github.com/getgrav/grav/commit/5a12f9be8) — will ship in **2.0.0-beta.2**. **What changed:** `MediaObjectTrait::attribute()` — the sink reached by Markdown like `![alt](img.gif?attribute=onload,alert(1))` — now gates the attribute **name** through an allowlist regex (`^[A-Za-z][A-Za-z0-9_:.\-]*$`) plus an explicit denylist of script-context names: - any `on*` handler (case-insensitive) - `style` (inline CSS expression risk) - `xmlns` (XML namespace tricks) - `srcdoc` (iframe sandbox bypass) - `formaction` (form action override) Invalid names are silently dropped — the attribute isn't stored, so it doesn't survive into the rendered `<img>`. `src`/`href`/`data-*`/`aria-*`/standard media attributes are unaffected. **Files:** - [`system/src/Grav/Common/Media/Traits/MediaObjectTrait.php`](https://github.com/getgrav/grav/blob/2.0/system/src/Grav/Common/Media/Traits/MediaObjectTrait.php) — new `isSafeAttributeName()` gate. - [`tests/unit/Grav/Common/Security/MediaAttributeSecurityTest.php`](https://github.com/getgrav/grav/blob/2.0/tests/unit/Grav/Common/Security/MediaAttributeSecurityTest.php) — 28 cases (14 dangerous-name rejections, 14 safe-name round-trips). ### Discoverers @K-Czaplicki @morzelowski ---

CVE-2026-42841 Affected Getgrav/grav Versions

1 component(s)
Fixed Versions:
2.0.0-beta.2
Product / Package Ecosystem Affected Versions Fixed Version
getgrav/grav
Packagist
< 2.0.0-beta.2
2.0.0-beta.2

References

Frequently Asked Questions

What is CVE-2026-42841?
CVE-2026-42841 is a security vulnerability in Getgrav/grav involving Grav CMS vulnerable to stored XSS via Markdown media attribute() action under CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting').
Which Getgrav/grav versions are affected?
Affected versions include releases prior to 2.0.0-beta.2 across affected packages: getgrav/grav.
What version fixes CVE-2026-42841?
Upgrading to 2.0.0-beta.2 (or the latest patched release for your respective branch) resolves the vulnerability.
Is getgrav/grav affected?
Yes, getgrav/grav is affected in releases prior to 2.0.0-beta.2. Upgrade your dependency to 2.0.0-beta.2 or later.
What is the CVSS score of CVE-2026-42841?
CVE-2026-42841 has a CVSS v3.1 base score of 4.8 (MODERATE) with vector string CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N.
What CWE is associated with CVE-2026-42841?
CVE-2026-42841 is classified under CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') (The product does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users.).
How can I check Packagist dependencies for CVE-2026-42841?
Run the dependency tree command: 'inspect dependencies for getgrav/grav'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-r7fx-8g49-7hhr",
  "modified" : "2026-05-13T13:52:10Z",
  "published" : "2026-05-05T21:24:08Z",
  "aliases" : [ "CVE-2026-42841" ],
  "summary" : "Grav CMS vulnerable to stored XSS via Markdown media attribute() action",
  "details" : "### Summary\n\nAn authenticated user with page editing permissions can inject an executable JavaScript event-handler attribute into rendered image HTML through Grav's Markdown media action syntax.\n\nThe issue is caused by Markdown image query parameters being converted into callable media actions. The public `attribute()` media method can be reached this way, allowing an editor to set an arbitrary HTML attribute name and value on the generated image element.\n\nFor example, this Markdown:\n\n```markdown\n![Quarterly market overview](market-overview.gif?attribute=onload,alert(document.domain))\n```\n\nis rendered as an image tag containing an executable `onload` handler:\n\n```html\n<img onload=\"alert(document.domain)\" alt=\"Quarterly market overview\" src=\"/user/pages/03.campaigns/market-overview.gif?...\">\n```\n\nThis results in stored XSS when another user views the affected page. In a multi-user Grav installation, a lower-privileged page editor could use this to target administrators or reviewers who preview or view editor-controlled content.\n\nTested versions:\n\n- Grav CMS: 1.7.49.5\n- Admin Plugin: 1.10.49.1\n\nSuggested classification:\n\n- CWE-79: Improper Neutralization of Input During Web Page Generation\n- Stored Cross-Site Scripting\n- Suggested CVSS v4.0 score if page editing is considered high privilege: 6.9 Medium\n- Suggested CVSS v4.0 vector: `CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:P/VC:H/VI:L/VA:N/SC:H/SI:L/SA:N`\n- Suggested CVSS v3.1 score if page editing is considered high privilege: 6.9 Medium\n- Suggested CVSS v3.1 vector: `CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:L/A:N`\n\n### Details\n\nThe issue appears to come from this source-to-sink flow:\n\n1. `ParsedownGravTrait::inlineImage()` processes Markdown images.\n2. `Excerpts::processImageExcerpt()` resolves the referenced media object.\n3. `Excerpts::processMediaActions()` parses the image URL query string into media actions.\n4. `call_user_func_array()` invokes the requested action method on the media object.\n5. `MediaObjectTrait::attribute()` stores the attacker-controlled attribute name and value.\n6. The media object returns a Parsedown element containing the injected attribute.\n7. Parsedown renders the attribute name into the final HTML.\n\nRelevant code paths:\n\n```text\nsystem/src/Grav/Common/Markdown/ParsedownGravTrait.php\nsystem/src/Grav/Common/Page/Markdown/Excerpts.php\nsystem/src/Grav/Common/Media/Traits/MediaObjectTrait.php\nsystem/src/Grav/Common/Page/Medium/StaticImageMedium.php\nsystem/src/Grav/Common/Page/Medium/ImageMedium.php\nvendor/erusev/parsedown/Parsedown.php\n```\n\nIn `system/src/Grav/Common/Markdown/ParsedownGravTrait.php`, Markdown image excerpts are passed into Grav-specific media handling:\n\n```php\nif (isset($excerpt['element']['attributes']['src'])) {\n    $excerpt = $this->excerpts->processImageExcerpt($excerpt);\n}\n```\n\nIn `system/src/Grav/Common/Page/Markdown/Excerpts.php`, query string parameters are converted into media action calls. The query parameter name becomes the method name:\n\n```php\n$carry[] = ['method' => $parts[0], 'params' => $value];\n```\n\nThe requested method is later invoked dynamically:\n\n```php\n$medium = call_user_func_array([$medium, $action['method']], $args);\n```\n\nFor the payload:\n\n```text\nattribute=onload,alert(document.domain)\n```\n\nthe method is `attribute`, and the arguments are `onload` and `alert(document.domain)`.\n\nIn `system/src/Grav/Common/Media/Traits/MediaObjectTrait.php`, `attribute()` stores the caller-controlled attribute name directly:\n\n```php\npublic function attribute($attribute = null, $value = '')\n{\n    if (!empty($attribute)) {\n        $this->attributes[$attribute] = $value;\n    }\n    return $this;\n}\n```\n\nThe image media classes then return the collected attributes as attributes for an `img` element.\n\nIn `system/src/Grav/Common/Page/Medium/StaticImageMedium.php`:\n\n```php\nreturn ['name' => 'img', 'attributes' => $attributes];\n```\n\nThe non-static image path in `system/src/Grav/Common/Page/Medium/ImageMedium.php` also returns image attributes in the same way.\n\nFinally, in `vendor/erusev/parsedown/Parsedown.php`, the attribute value is escaped, but the attribute name is rendered as-is:\n\n```php\n$markup .= ' '.$name.'=\"'.self::escape($value).'\"';\n```\n\nAs a result, the attacker-controlled attribute name `onload` is emitted into the final HTML and executes as a browser event handler.\n\nThe Admin Plugin's save-time XSS detection does not appear to block this because the stored content is Markdown media syntax, not raw HTML:\n\n```markdown\n![Quarterly market overview](market-overview.gif?attribute=onload,alert(document.domain))\n```\n\nThe dangerous HTML is generated later during Markdown/media rendering.\n\n### PoC\n\nI reproduced this on a standard Grav CMS installation with the Admin Plugin enabled.\n\nConfiguration and prerequisites:\n\n- Grav CMS 1.7.49.5\n- Admin Plugin 1.10.49.1\n- Markdown processing enabled for pages\n- A user account with permission to create or edit pages\n- A page media file available in the edited page folder, for example `market-overview.gif`\n\nSteps to reproduce:\n\n1. Install Grav CMS with the Admin Plugin.\n2. Log in to the Admin panel as a user who can create or edit pages.\n3. Create a normal content page or edit an existing one.\n4. Add or reference a page media file named `market-overview.gif`.\n5. Insert the following Markdown into the page body:\n\n   ```markdown\n   ![Quarterly market overview](market-overview.gif?attribute=onload,alert(document.domain))\n   ```\n\n6. Save the page.\n7. Open the rendered frontend page in a browser.\n8. The JavaScript payload executes when the image loads.\n9. Inspect the generated DOM. The rendered image element contains the injected `onload` attribute.\n\nExpected result:\n\nThe Markdown media action should not be able to generate executable HTML attributes. The payload should be rejected, sanitized, or rendered without the dangerous event-handler attribute.\n\nActual result:\n\nThe payload is accepted and rendered as an executable image event handler:\n\n```html\n<img onload=\"alert(document.domain)\" alt=\"Quarterly market overview\" src=\"/user/pages/03.campaigns/market-overview.gif?...\">\n```\n\nScreenshots:\n\n- the stored Markdown payload in the page editor\n<img width=\"1718\" height=\"1013\" alt=\"edycja\" src=\"https://github.com/user-attachments/assets/8f5e5275-e4ef-4d5e-a2cd-44683537b909\" />\n- the JavaScript alert executing on the frontend page\n<img width=\"1727\" height=\"1002\" alt=\"alert\" src=\"https://github.com/user-attachments/assets/6de81228-830c-49f2-ac41-b15658a8913d\" />\n- browser DevTools showing the injected `onload` attribute in the rendered DOM\n<img width=\"939\" height=\"539\" alt=\"inspect\" src=\"https://github.com/user-attachments/assets/7832c42d-6f3a-4ea2-b072-b837bd3913ed\" />\n\n### Impact\n\nThis is a stored cross-site scripting vulnerability.\n\nAn authenticated user with page editing permissions can store a malicious Markdown image reference. When the affected page is rendered, the payload executes in the browser of any user who views that page.\n\nIn multi-user Grav installations, this may allow a lower-privileged editor to target administrators, reviewers, or other privileged users who preview or view editor-controlled content. Depending on the victim's privileges and deployed plugins, successful exploitation may allow JavaScript execution in the site origin, access to same-origin page data available to the victim, and same-origin actions performed as the victim.\n\nCVSS 4.0 rationale:\n\n- `AV:N`: the issue is exploitable through the web application.\n- `AC:L`: no special race condition or complex setup is required after page editing access is obtained.\n- `AT:P`: exploitation requires the malicious Markdown/media reference to be stored in page content and later rendered to a victim.\n- `PR:H`: the attacker needs page editing capability.\n- `UI:P`: a victim must view the affected page. The demonstrated `onload` payload executes on passive page rendering, without requiring a click or form submission by the victim.\n- `VC:H/VI:L/VA:N`: confidentiality impact can be high when the victim is an administrator or reviewer; integrity impact is limited; no direct availability impact was demonstrated.\n- `SC:H/SI:L/SA:N`: the injected script executes in the browser/application context and may affect subsequent same-origin interactions available to the victim.\n\n## Maintainer note — fix applied (2026-04-24)\n\nFixed in Grav core on the `2.0` branch: commit [`5a12f9be8`](https://github.com/getgrav/grav/commit/5a12f9be8) — will ship in **2.0.0-beta.2**.\n\n**What changed:** `MediaObjectTrait::attribute()` — the sink reached by Markdown like `![alt](img.gif?attribute=onload,alert(1))` — now gates the attribute **name** through an allowlist regex (`^[A-Za-z][A-Za-z0-9_:.\\-]*$`) plus an explicit denylist of script-context names:\n\n- any `on*` handler (case-insensitive)\n- `style` (inline CSS expression risk)\n- `xmlns` (XML namespace tricks)\n- `srcdoc` (iframe sandbox bypass)\n- `formaction` (form action override)\n\nInvalid names are silently dropped — the attribute isn't stored, so it doesn't survive into the rendered `<img>`. `src`/`href`/`data-*`/`aria-*`/standard media attributes are unaffected.\n\n**Files:**\n- [`system/src/Grav/Common/Media/Traits/MediaObjectTrait.php`](https://github.com/getgrav/grav/blob/2.0/system/src/Grav/Common/Media/Traits/MediaObjectTrait.php) — new `isSafeAttributeName()` gate.\n- [`tests/unit/Grav/Common/Security/MediaAttributeSecurityTest.php`](https://github.com/getgrav/grav/blob/2.0/tests/unit/Grav/Common/Security/MediaAttributeSecurityTest.php) — 28 cases (14 dangerous-name rejections, 14 safe-name round-trips).\n\n### Discoverers\n\n@K-Czaplicki\n@morzelowski\n\n\n---",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N"
  }, {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:P/VC:H/VI:L/VA:N/SC:H/SI:L/SA:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Packagist",
      "name" : "getgrav/grav"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "2.0.0-beta.2"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/getgrav/grav/security/advisories/GHSA-r7fx-8g49-7hhr"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-42841"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/getgrav/grav/commit/5a12f9be8314682c8713e569e330f11805d0a663"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/getgrav/grav"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-79" ],
    "severity" : "MODERATE",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-05-05T21:24:08Z",
    "nvd_published_at" : "2026-05-11T16:17:34Z"
  }
}