mirror of
https://github.com/django/django.git
synced 2026-02-09 02:49:25 +08:00
[5.2.x] Fixed CVE-2025-13372 -- Protected FilteredRelation against SQL injection in column aliases on PostgreSQL.
Follow-up to CVE-2025-57833.
Thanks Stackered for the report, and Simon Charette and Mariusz Felisiak
for the reviews.
Backport of 5b90ca1e75 from main.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
from django.db.models.sql.compiler import (
|
||||
SQLAggregateCompiler,
|
||||
SQLCompiler,
|
||||
SQLCompiler as BaseSQLCompiler,
|
||||
SQLDeleteCompiler,
|
||||
)
|
||||
from django.db.models.sql.compiler import SQLInsertCompiler as BaseSQLInsertCompiler
|
||||
@@ -25,6 +25,15 @@ class InsertUnnest(list):
|
||||
return "UNNEST(%s)" % ", ".join(self)
|
||||
|
||||
|
||||
class SQLCompiler(BaseSQLCompiler):
|
||||
def quote_name_unless_alias(self, name):
|
||||
if "$" in name:
|
||||
raise ValueError(
|
||||
"Dollar signs are not permitted in column aliases on PostgreSQL."
|
||||
)
|
||||
return super().quote_name_unless_alias(name)
|
||||
|
||||
|
||||
class SQLInsertCompiler(BaseSQLInsertCompiler):
|
||||
def assemble_as_sql(self, fields, value_rows):
|
||||
# Specialize bulk-insertion of literal values through UNNEST to
|
||||
|
||||
@@ -7,6 +7,14 @@ Django 4.2.27 release notes
|
||||
Django 4.2.27 fixes one security issue with severity "high", one security issue
|
||||
with severity "moderate", and one bug in 4.2.26.
|
||||
|
||||
CVE-2025-13372: Potential SQL injection in ``FilteredRelation`` column aliases on PostgreSQL
|
||||
============================================================================================
|
||||
|
||||
:class:`.FilteredRelation` was subject to SQL injection in column aliases,
|
||||
using a suitably crafted dictionary, with dictionary expansion, as the
|
||||
``**kwargs`` passed to :meth:`.QuerySet.annotate` or :meth:`.QuerySet.alias` on
|
||||
PostgreSQL.
|
||||
|
||||
Bugfixes
|
||||
========
|
||||
|
||||
|
||||
@@ -7,6 +7,14 @@ Django 5.1.15 release notes
|
||||
Django 5.1.15 fixes one security issue with severity "high", one security issue
|
||||
with severity "moderate", and one bug in 5.1.14.
|
||||
|
||||
CVE-2025-13372: Potential SQL injection in ``FilteredRelation`` column aliases on PostgreSQL
|
||||
============================================================================================
|
||||
|
||||
:class:`.FilteredRelation` was subject to SQL injection in column aliases,
|
||||
using a suitably crafted dictionary, with dictionary expansion, as the
|
||||
``**kwargs`` passed to :meth:`.QuerySet.annotate` or :meth:`.QuerySet.alias` on
|
||||
PostgreSQL.
|
||||
|
||||
Bugfixes
|
||||
========
|
||||
|
||||
|
||||
@@ -7,6 +7,14 @@ Django 5.2.9 release notes
|
||||
Django 5.2.9 fixes one security issue with severity "high", one security issue
|
||||
with severity "moderate", and several bugs in 5.2.8.
|
||||
|
||||
CVE-2025-13372: Potential SQL injection in ``FilteredRelation`` column aliases on PostgreSQL
|
||||
============================================================================================
|
||||
|
||||
:class:`.FilteredRelation` was subject to SQL injection in column aliases,
|
||||
using a suitably crafted dictionary, with dictionary expansion, as the
|
||||
``**kwargs`` passed to :meth:`.QuerySet.annotate` or :meth:`.QuerySet.alias` on
|
||||
PostgreSQL.
|
||||
|
||||
Bugfixes
|
||||
========
|
||||
|
||||
|
||||
@@ -1507,3 +1507,14 @@ class AliasTests(TestCase):
|
||||
)
|
||||
with self.assertRaisesMessage(ValueError, msg):
|
||||
Book.objects.alias(**{crafted_alias: FilteredRelation("authors")})
|
||||
|
||||
def test_alias_filtered_relation_sql_injection_dollar_sign(self):
|
||||
qs = Book.objects.alias(
|
||||
**{"crafted_alia$": FilteredRelation("authors")}
|
||||
).values("name", "crafted_alia$")
|
||||
if connection.vendor == "postgresql":
|
||||
msg = "Dollar signs are not permitted in column aliases on PostgreSQL."
|
||||
with self.assertRaisesMessage(ValueError, msg):
|
||||
list(qs)
|
||||
else:
|
||||
self.assertEqual(qs.first()["name"], self.b1.name)
|
||||
|
||||
Reference in New Issue
Block a user