Skip to content
Heist/ feed
Back to feed
Medium

CI4MS: Stored XSS in Blog Content via Broken `html_purify` Validation Rule

Type: advisorySources: OSV

CI4MS is a CodeIgniter 4-based content management system skeleton. Prior to version 0.31.9.0, the custom `html_purify` validation rule used to sanitize blog post bodies relies on by-reference mutation (`?string &$str`), but CodeIgniter 4's validator passes a local copy of the value, so the sanitized text is silently discarded. The Blog controller writes `$lanData['content']` directly into `blog_langs.content`, and the public template echoes it without escaping — yielding stored XSS executable in any visitor's browser, including the superadmin when previewing or editing posts. Version 0.31.9.0 patches the issue.

Products
Not specified
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2026-45138
Confirmed fixed CVEs
Not specified
Updated in this feed
7 Nov 2026, 03:16 UTC · Revision 1

Source evidence

CI4MS: Stored XSS in Blog Content via Broken `html_purify` Validation Rule

core-osv · Original source

Published 19 Jul 2026, 23:18 UTC

CI4MS is a CodeIgniter 4-based content management system skeleton. Prior to version 0.31.9.0, the custom `html_purify` validation rule used to sanitize blog post bodies relies on by-reference mutation (`?string &$str`), but CodeIgniter 4's validator passes a local copy of the value, so the sanitized text is silently discarded. The Blog controller writes `$lanData['content']` directly into `blog_langs.content`, and the public template echoes it without escaping — yielding stored XSS executable in any visitor's browser, including the superadmin when previewing or editing posts. Version 0.31.9.0 patches the issue.

osv:CVE-2026-45138
Complete source record
{
  "id": "86b19687d73b31983055856f95cfaff794a21bcd55725a6549ad1c8dbd5fe79d",
  "url": "https://osv.dev/vulnerability/CVE-2026-45138",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "CI4MS: Stored XSS in Blog Content via Broken `html_purify` Validation Rule",
    "summary": "CI4MS is a CodeIgniter 4-based content management system skeleton. Prior to version 0.31.9.0, the custom `html_purify` validation rule used to sanitize blog post bodies relies on by-reference mutation (`?string &$str`), but CodeIgniter 4's validator passes a local copy of the value, so the sanitized text is silently discarded. The Blog controller writes `$lanData['content']` directly into `blog_langs.content`, and the public template echoes it without escaping — yielding stored XSS executable in any visitor's browser, including the superadmin when previewing or editing posts. Version 0.31.9.0 patches the issue.",
    "evidence": "osv:CVE-2026-45138",
    "products": [],
    "severity": "medium",
    "structured": {
      "id": "CVE-2026-45138",
      "aliases": [
        "CVE-2026-45138",
        "GHSA-2m69-jmvh-6chr"
      ],
      "metrics": [
        {
          "type": "CVSS_V3",
          "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "repo": "https://github.com/ci4-cms-erp/ci4ms",
              "type": "GIT",
              "events": [
                {
                  "introduced": "0"
                },
                {
                  "fixed": "e1aad282cf9ae5395bdce7c7f75f8a9803cee75b"
                }
              ],
              "database_specific": {
                "extracted_events": [
                  {
                    "range": [
                      {
                        "introduced": "0"
                      },
                      {
                        "fixed": "0.31.9.0"
                      }
                    ],
                    "source": "AFFECTED_FIELD",
                    "strategy": "StringRangeExpression"
                  },
                  {
                    "range": [
                      {
                        "fixed": "e1aad282cf9ae5395bdce7c7f75f8a9803cee75b"
                      }
                    ],
                    "source": "REFERENCES_TAG",
                    "original_tag": "0.31.9.0"
                  },
                  {
                    "range": [
                      {
                        "introduced": "0"
                      },
                      {
                        "fixed": "0.31.9.0"
                      }
                    ],
                    "source": "DESCRIPTION"
                  }
                ]
              }
            }
          ],
          "versions": [
            "0.31.8.0",
            "0.31.7.0",
            "0.31.6.0",
            "0.31.5.0",
            "0.31.4.0",
            "0.31.3.0",
            "0.31.2.0",
            "0.31.1.0",
            "0.31.0.0",
            "0.28.6.0",
            "0.28.5.0",
            "0.28.4.0",
            "0.28.3.0",
            "0.28.0.0",
            "0.27.0.0",
            "0.26.3.4",
            "0.26.3.3",
            "0.26.3.2",
            "0.26.3.1",
            "0.26.3.0",
            "0.26.2.0",
            "0.26.1.0",
            "0.26.0.0",
            "0.25.3.0",
            "0.25.2.0",
            "0.25.1.0",
            "0.25.0.43",
            "0.25.0.39",
            "0.25.0.30",
            "0.25.0.2",
            "0.25.0.1",
            "0.25.0.0",
            "0.24.0.60",
            "0.24.0.45",
            "0.24.0.42",
            "0.24.0.27",
            "0.24.0.20",
            "0.24.0.19",
            "0.24.0.18",
            "0.24.0.16",
            "0.24.0.0",
            "0.23.1.0",
            "0.23.0.0",
            "0.21.3.7",
            "0.21.3.6",
            "0.21.3.5",
            "0.21.3.4",
            "0.21.3.3",
            "0.21.3.2",
            "0.21.3.1",
            "0.21.3",
            "0.21.2",
            "0.21.1",
            "0.21.0"
          ],
          "database_specific": {
            "source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-45138.json"
          }
        }
      ],
      "modified": "2026-10-28T02:30:49.315079239Z",
      "provider": "osv",
      "references": [
        "https://github.com/ci4-cms-erp/ci4ms/releases/tag/0.31.9.0",
        "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/45xxx/CVE-2026-45138.json",
        "https://github.com/ci4-cms-erp/ci4ms/security/advisories/GHSA-2m69-jmvh-6chr",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-45138"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-79"
        ],
        "cna_assigner": "GitHub_M",
        "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/45xxx/CVE-2026-45138.json"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-45138",
        "evidence": "/id"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 517680,
  "published_at": "2026-07-19T23:18:51.312+00:00"
}