Skip to content

Commit f6d9302

Browse files
1 parent 6050337 commit f6d9302

1 file changed

Lines changed: 211 additions & 0 deletions

File tree

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-64hg-93w9-fc35",
4+
"modified": "2026-05-28T17:22:36Z",
5+
"published": "2026-05-28T17:22:36Z",
6+
"aliases": [
7+
"CVE-2026-45754"
8+
],
9+
"summary": "Symfony's Mailjet Mailer Webhook Parser Never Verifies the Configured Secret — Unauthenticated Webhook Event Injection",
10+
"details": "### Description\n\nThe Mailjet mailer bridge and the LOX24 SMS notifier bridge both ship webhook request parsers used to authenticate and decode the event callbacks each provider POSTs to an application's webhook endpoint. Their `doParse(Request $request, #[\\SensitiveParameter] string $secret)` methods receive the configured webhook secret but never read it; they convert and return the payload unconditionally.\n\nAs a result, an application that wires up either webhook endpoint accepts **any** POST to that URL, even when a webhook secret is configured (the recommended setup). An attacker who knows the endpoint exists can submit forged event payloads, fake bounce / blocked / spam / open / click / delivery events, leading to suppression-list corruption, delivery-metrics fraud, etc.\n\n### Resolution\n\n`MailjetRequestParser::doParse()` now rejects the request unless it carries the expected HTTP Basic credentials, Mailjet's webhook authentication mechanism, using a constant-time comparison. The configured webhook secret is matched against the credentials embedded in the Mailjet webhook URL as `user:password` (use `:password` when the URL has no username).\n\n`Lox24RequestParser::doParse()` now rejects the request unless it carries an `X-LOX24-Token` HTTP header whose value matches the configured secret, using a constant-time comparison. The same token must be configured in the LOX24 dashboard under the callback settings.\n\nWhen no secret is configured the behaviour is unchanged: webhook authentication remains opt-in, but it is now actually enforced once opted in.\n\nThe Mailjet patch is available [here](https://github.com/symfony/symfony/commit/3e52bf5ab733ee32e35eeeeb2631d859c941838e) for branch 6.4.\n\nThe LOX24 patch is available [here](https://github.com/symfony/symfony/commit/4aaa45dd054f73445f1ab254968b7e60b546cc77) for branch 7.4 (the LOX24 bridge was introduced in 7.1 and is not present in 6.4).\n\n### Credits\n\nSymfony would like to thank Himanshu Anand for reporting the issue, and Alexandre Daubois and Nicolas Grekas for providing the fixes.",
11+
"severity": [
12+
{
13+
"type": "CVSS_V4",
14+
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/E:U"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Packagist",
21+
"name": "symfony/lox24-notifier"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "7.1.0"
29+
},
30+
{
31+
"fixed": "7.4.12"
32+
}
33+
]
34+
}
35+
]
36+
},
37+
{
38+
"package": {
39+
"ecosystem": "Packagist",
40+
"name": "symfony/lox24-notifier"
41+
},
42+
"ranges": [
43+
{
44+
"type": "ECOSYSTEM",
45+
"events": [
46+
{
47+
"introduced": "8.0.0"
48+
},
49+
{
50+
"fixed": "8.0.12"
51+
}
52+
]
53+
}
54+
]
55+
},
56+
{
57+
"package": {
58+
"ecosystem": "Packagist",
59+
"name": "symfony/symfony"
60+
},
61+
"ranges": [
62+
{
63+
"type": "ECOSYSTEM",
64+
"events": [
65+
{
66+
"introduced": "6.4.0"
67+
},
68+
{
69+
"fixed": "6.4.40"
70+
}
71+
]
72+
}
73+
]
74+
},
75+
{
76+
"package": {
77+
"ecosystem": "Packagist",
78+
"name": "symfony/symfony"
79+
},
80+
"ranges": [
81+
{
82+
"type": "ECOSYSTEM",
83+
"events": [
84+
{
85+
"introduced": "7.0.0"
86+
},
87+
{
88+
"fixed": "7.4.12"
89+
}
90+
]
91+
}
92+
]
93+
},
94+
{
95+
"package": {
96+
"ecosystem": "Packagist",
97+
"name": "symfony/symfony"
98+
},
99+
"ranges": [
100+
{
101+
"type": "ECOSYSTEM",
102+
"events": [
103+
{
104+
"introduced": "8.0.0"
105+
},
106+
{
107+
"fixed": "8.0.12"
108+
}
109+
]
110+
}
111+
]
112+
},
113+
{
114+
"package": {
115+
"ecosystem": "Packagist",
116+
"name": "symfony/mailjet-mailer"
117+
},
118+
"ranges": [
119+
{
120+
"type": "ECOSYSTEM",
121+
"events": [
122+
{
123+
"introduced": "6.4.0"
124+
},
125+
{
126+
"fixed": "6.4.40"
127+
}
128+
]
129+
}
130+
]
131+
},
132+
{
133+
"package": {
134+
"ecosystem": "Packagist",
135+
"name": "symfony/mailjet-mailer"
136+
},
137+
"ranges": [
138+
{
139+
"type": "ECOSYSTEM",
140+
"events": [
141+
{
142+
"introduced": "7.0.0"
143+
},
144+
{
145+
"fixed": "7.4.12"
146+
}
147+
]
148+
}
149+
]
150+
},
151+
{
152+
"package": {
153+
"ecosystem": "Packagist",
154+
"name": "symfony/mailjet-mailer"
155+
},
156+
"ranges": [
157+
{
158+
"type": "ECOSYSTEM",
159+
"events": [
160+
{
161+
"introduced": "8.0.0"
162+
},
163+
{
164+
"fixed": "8.0.12"
165+
}
166+
]
167+
}
168+
]
169+
}
170+
],
171+
"references": [
172+
{
173+
"type": "WEB",
174+
"url": "https://github.com/symfony/symfony/security/advisories/GHSA-64hg-93w9-fc35"
175+
},
176+
{
177+
"type": "WEB",
178+
"url": "https://github.com/symfony/symfony/commit/4aaa45dd054f73445f1ab254968b7e60b546cc77"
179+
},
180+
{
181+
"type": "WEB",
182+
"url": "https://github.com/FriendsOfPHP/security-advisories/blob/master/symfony/lox24-notifier/CVE-2026-45754.yaml"
183+
},
184+
{
185+
"type": "WEB",
186+
"url": "https://github.com/FriendsOfPHP/security-advisories/blob/master/symfony/mailjet-mailer/CVE-2026-45754.yaml"
187+
},
188+
{
189+
"type": "WEB",
190+
"url": "https://github.com/FriendsOfPHP/security-advisories/blob/master/symfony/symfony/CVE-2026-45754.yaml"
191+
},
192+
{
193+
"type": "PACKAGE",
194+
"url": "https://github.com/symfony/symfony"
195+
},
196+
{
197+
"type": "WEB",
198+
"url": "https://symfony.com/cve-2026-45754"
199+
}
200+
],
201+
"database_specific": {
202+
"cwe_ids": [
203+
"CWE-287",
204+
"CWE-306"
205+
],
206+
"severity": "MODERATE",
207+
"github_reviewed": true,
208+
"github_reviewed_at": "2026-05-28T17:22:36Z",
209+
"nvd_published_at": null
210+
}
211+
}

0 commit comments

Comments
 (0)