GHSA-C9W5-RWH3-7PM9
Vulnerability from github – Published: 2026-08-07 18:22 – Updated: 2026-08-07 18:22
VLAI
Summary
CodeIgniter: SQL injection in Query Builder deleteBatch() when used with where() conditions
Details
Impact
A SQL injection vulnerability exists in the Query Builder's deleteBatch() method. When deleteBatch() is used together with where() conditions, the bound values from the WHERE clause are substituted directly into the generated SQL with their escape flag ignored, so they are never escaped or quoted. If an application passes user-controlled input to where() before calling deleteBatch(), that input is interpreted as SQL rather than as a value, allowing SQL injection.
This affects only the deleteBatch() code path. Regular delete() operations escape where() binds correctly.
Patches
Upgrade to v4.7.4 or later.
Workarounds
If you cannot upgrade immediately:
- Strictly validate and cast values (e.g. numeric IDs) before using them in conditions - though this does not fully protect string conditions.
- Do not pass user-controlled input to
where()when usingdeleteBatch(). - For user-controlled conditions, use a normal
delete()with Query Builder binds instead ofdeleteBatch(). - Where possible, express required matching values through the batch data and
onConstraint()rather than as separate user-controlledwhere()clauses.
Severity
9.4 (Critical)
{
"affected": [
{
"package": {
"ecosystem": "Packagist",
"name": "codeigniter4/framework"
},
"ranges": [
{
"events": [
{
"introduced": "4.3.0"
},
{
"fixed": "4.7.4"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-63221"
],
"database_specific": {
"cwe_ids": [
"CWE-89"
],
"github_reviewed": true,
"github_reviewed_at": "2026-08-07T18:22:59Z",
"nvd_published_at": "2026-07-31T06:16:31Z",
"severity": "CRITICAL"
},
"details": "### Impact\nA SQL injection vulnerability exists in the Query Builder\u0027s `deleteBatch()` method. When `deleteBatch()` is used together with `where()` conditions, the bound values from the `WHERE` clause are substituted directly into the generated SQL **with their escape flag ignored**, so they are never escaped or quoted. If an application passes user-controlled input to `where()` before calling `deleteBatch()`, that input is interpreted as SQL rather than as a value, allowing SQL injection.\n\nThis affects only the `deleteBatch()` code path. Regular `delete()` operations escape `where()` binds correctly.\n\n### Patches\nUpgrade to v4.7.4 or later.\n\n### Workarounds\nIf you cannot upgrade immediately:\n\n- Strictly validate and cast values (e.g. numeric IDs) before using them in conditions - though this does not fully protect string conditions.\n- Do not pass user-controlled input to `where()` when using `deleteBatch()`.\n- For user-controlled conditions, use a normal `delete()` with Query Builder binds instead of `deleteBatch(`).\n- Where possible, express required matching values through the batch data and `onConstraint()` rather than as separate user-controlled `where()` clauses.",
"id": "GHSA-c9w5-rwh3-7pm9",
"modified": "2026-08-07T18:22:59Z",
"published": "2026-08-07T18:22:59Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/codeigniter4/CodeIgniter4/security/advisories/GHSA-c9w5-rwh3-7pm9"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-63221"
},
{
"type": "WEB",
"url": "https://github.com/codeigniter4/CodeIgniter4/commit/f5e463b9a3e986389ce285963e51a7f1fab6559f"
},
{
"type": "PACKAGE",
"url": "https://github.com/codeigniter4/CodeIgniter4"
},
{
"type": "WEB",
"url": "https://github.com/codeigniter4/CodeIgniter4/releases/tag/v4.7.4"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:H",
"type": "CVSS_V3"
}
],
"summary": "CodeIgniter: SQL injection in Query Builder deleteBatch() when used with where() conditions"
}
Loading…
Loading…
Experimental. This forecast is provided for visualization only and may change without notice. Do not use it for operational decisions.
Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Loading…
The MITRE ATT&CK techniques below are AI-generated suggestions, inferred from the description of the
vulnerability by the CIRCL/vulnerability-attack-technique-classification-roberta-base
model, served locally by ML-Gateway.
They have not been verified by an analyst and are provided for guidance only.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Loading…
Loading…