Skip to content
  • Categories
  • Recent
  • Popular
  • Tags
  • Users
  • Groups
  • Documentation
  • Downloads
  • Report a bug
  • GitHub mirror
  • Paid support
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
hMailServer Community Forum
hMailServer 6.3.8 is the current release, signed 2 November 2026. Windows and Linux, and an in-place upgrade from 5.3 or later, but for the original hMailServer's 5.7.Download 6.3.8 Documentation FAQ

administrators

Private

Posts


  • Known issue in 6.3.7 and 6.3.8: mail to some DNSSEC-signed domains stays in the queue
    chrisC chris
    Announcements & releases

    Who this affects: servers on 6.3.7 or 6.3.8 that deliver mail directly to recipients' mail servers. 6.3.6 may be affected too. Mail sent through an SMTP relay or a route isn't affected.

    What you'll see: messages to some domains stay in the delivery queue and are retried later, even though your DNS server is working. If that goes on long enough, the sender gets a bounce. We've seen it with paypal.com, seznam.cz, kpnmail.nl and xs4all.nl, and it isn't limited to those. With application logging on, the log says the DNSSEC lookup of the TLSA records "could not be completed".

    The cause: a bug in our DNSSEC checking. Some signed domains prove that a name doesn't exist in a valid way that our code misreads as incomplete. The server then can't tell whether the domain requires DANE, so it holds the message rather than risk sending it insecurely.

    What to do: the fix is in testing for 6.3.9, which has no date yet. If you have mail stuck now:

    1. In the Control Panel, open Transport security, then the Encryption tab, and find DANE & DNSSEC.
    2. Untick "Honour recipient DANE/TLSA records when sending", then choose Save changes.
    3. Open the delivery queue and choose Deliver all now.

    This turns off DANE checks for all your outgoing mail, so tick it again once you're on 6.3.9. Use the Control Panel rather than editing hMailServer.ini, because an ini edit is hard to undo. If you run on Linux, which has no Control Panel, post here and we'll help you with this step.

    If nearly all your outgoing mail is stuck, the cause is more likely a DNS server or firewall that drops DNSSEC data or blocks DNS over TCP. The same steps get mail moving while you look at that.

    If you're seeing something else, please post the log line here with addresses and passwords removed.


  • hMailServer 6.3.8: security fixes for every earlier version, read before upgrading, and a Helm chart that starts a server
    chrisC chris
    Announcements & releases

    hMailServer 6.3.8, Progressive Robot's fork of hMailServer, was published on 2 November 2026. It is a security release: it fixes vulnerabilities the project found in its own code, each a work item with a CVE request through GitLab's CNA, and the four narrower cases of work item 78 that 6.3.7's notes left open. Between them they reach back to 6.0.0's first beta: upgrade every server running 6.3.7 or earlier. It was first decided, while releases pause, because the published Helm charts of 6.3.6 and 6.3.7 did not start a server, which only a release puts right, and that reason stands beside the fixes; it also puts right the container image, which could not reach a MariaDB database, and the Windows installer, which ran over an installation of the original hMailServer's 5.7, and it carries everything that landed on master after 6.3.7. The schema stays at 6108: from 6.3.6 or 6.3.7 the upgrade changes no table.

    Who is affected, and what to do

    • Every server running 6.3.7 or earlier: upgrade. "What 6.3.8 fixes" lists the vulnerabilities, each with its work item and CVE request; "Upgrading" says how each version upgrades.
    • Read "Before you upgrade" first. Some fixes change what an upgraded server does, above all for TlsMode=verify-full without TlsCaFile to a MySQL or MariaDB server on the same machine, for file names outside ASCII, and for sign-in names spelt otherwise than the stored address.
    • Anyone who installed the Helm chart of 6.3.6 or 6.3.7: its pod never started. Move the release to 6.3.8's chart as "Before you upgrade" says.
    • Anyone running the container image against MariaDB: the images of 6.3.7 and earlier could not reach it; 6.3.8's carries MariaDB's client library, and the release's pipeline starts each platform's image beside MariaDB and asks it for SMTP, the REST API and the schema it laid out.
    • Windows, on the original hMailServer's 5.7 - 5.7.0 and its pre-release builds 2788 and 2843, 5.7.1 or 5.7.2: this fork's installers of 6.3.7 and earlier must never be run over it; 6.3.8's refuses it before it changes anything. Move such a server's mail over IMAP instead (Migration.md, "From the original hMailServer").

    Before you upgrade

    The 6.3.8 section of CHANGELOG.md, "What changes on upgrade without a switch", lists what an upgraded server does differently with no setting turned. These are the most likely to need something done:

    • Back up the database and the data directory, each with its own tools (Upgrading.md). 6.3.8 adds no schema step; from 6.3.5 or older the upgrade runs 6.3.6's three one-way steps to 6108, and the backup is the only way back. From 6.3.6 or earlier, 6.3.7's "Before you upgrade" and its list hold as well, and from 6.3.5 or earlier 6.3.6's list.
    • A Helm release of the 6.3.6 or 6.3.7 chart: helm repo update, then helm upgrade <release> hmailserver/hmailserver --reset-then-reuse-values (Helm 3.14 or later), then kubectl delete pod <release>-hmailserver-0, since the StatefulSet never replaces the stuck pod by itself; --reuse-values instead keeps the old chart's fsGroup 1000 and database.port 5432. Where a cluster's policy refuses every sysctl, set unprivilegedPortsSysctl: false.
    • A Compose deployment made from an earlier Compose file: keep its HM_REST_CERTIFICATE_FILE, HM_REST_PRIVATE_KEY_FILE and ./certs mount in the new file, the key readable by 999, or its REST API does not start.
    • ACME: AcmeDomains listing a host the certificate lacks. The first check orders a certificate for every host on the list; a host the CA cannot validate fails the whole order, at most three times an hour, and holds the renewal for the other hosts: take it off the list first.
    • TlsMode=verify-full on MySQL or MariaDB without TlsCaFile, to a database server on this machine: through MariaDB Connector/C, the client the Windows installer bundles and the Linux server loads, 6.3.8 refuses the connection with HM7535. Name in TlsCaFile a CA that issues nothing but the database's certificates, the one that issued its certificate, or set TlsMode=require, before upgrading (DatabaseTls.md).
    • On Windows, a file whose path holds characters outside ASCII - the database's TlsCaFile or PostgreSQLSslRootCert, a TLS certificate or private key file, dh2048.pem, a client-certificate CA file, MessageStoreObjectCaFile, OAuth2PublicKeyFile or AcmeCertificateDirectory: 6.3.8 may refuse its name, with HM7534 or HM7536, and then the database is not reached, or what the file is for does not work. Give each such file, and the folders above it, an ASCII name before upgrading.
    • A Linux server that ran under a LANG that is not UTF-8, with files or folders named outside ASCII: 6.3.8 names files in UTF-8 whatever LANG says, so rename each to its UTF-8 name before upgrading, for example with convmv -f iso-8859-1 -t utf-8 -r --notest <folder>.
    • IP ranges of your own that allow some addresses none of SMTP, POP3 and IMAP, with the web services listener on: such a range now closes that listener to those addresses too, and with it ACME's http-01 validation there, MTA-STS, CalDAV, CardDAV, Autodiscover, autoconfiguration and the Web Key Directory, so check that the certificate authority, the sending MTAs and these services' clients do not come from one.
    • A REST client of your own that sends a body that is not one JSON object, names a member twice, holds an escaped U+0000 or passes the bounds (100,000 values, 32 levels deep), or writes a member whose absence is the wider setting as another type than its route reads: the server answers it with 400.
    • A mail client that signs in with another spelling of the account's address than the stored one, in more than the case of the letters A to Z, or with white space at either end: it may no longer sign in. Correct the name in the client.
    • Installing with Chocolatey: give the administrator password in HM_ADMIN_PASSWORD, set in the elevated prompt, not with /adminpassword in --install-arguments: the install now passes the installer /LOG, and the log records setup's command line.
    • On Windows, a program folder, Bin or ControlPanel, or a folder or a link on the way to them, that another account than SYSTEM, the Administrators and TrustedInstaller controls: setup refuses it with exit code 7, naming the icacls that deals with it, and asks for a restart of Windows before it runs again (ServiceAccount.md).
    • Monitoring that counts the error log, or an OnError script, during a stop: a stop's interruption is now a line in the debug log, and an event script's call that meets a stop fails with "The server is stopping. The request was not completed."
    • The .NET 10 Desktop Runtime is installed only where none is, so an upgraded server keeps the one it had: bring it up to date through Microsoft Update.

    What 6.3.8 fixes

    The vulnerabilities first, each found by the hMailServer project (Progressive Robot Ltd), each work item public now and each with a CVE request through GitLab's CNA; the 6.3.8 section of CHANGELOG.md, linked above, gives each, with how it is tested.

    • The database layer's test for the marker that lets a statement's error be ignored, and the log's and the trace's redaction of a statement's literals, read a literal as each engine does (work item 100, CVE requested).
    • The auto-ban saves the IP range it adds under a name of its own, so that it bans the address (work item 102, CVE requested).
    • A sign-in's name is matched to its account as the per-name lockout and the compromised-account hold count it (work item 104, CVE requested).
    • The web services listener (CardDAV, CalDAV, Autodiscover) refuses an address an auto-ban or an IP range bans (work item 105, CVE requested).
    • A failed sign-in at the web services listener through a proxy is no longer charged to the proxy's address (work item 106, CVE requested).
    • A failed account sign-in at the REST listener through a reverse proxy on the same machine is no longer charged to 127.0.0.1 (work item 107, CVE requested).
    • The REST API, and the reader of a report mailed to a domain's report address, read a JSON body in time and memory that follow its bytes (work item 110, CVE requested; work item 111, CVE requested).
    • TlsMode=verify-full on MySQL and MariaDB checks the database server's certificate against the CA file TlsCaFile names (work item 112, CVE requested). Its entry corrects what 6.3.7's notes said of a named TlsCaFile as the mitigation for CVE-2026-107819, MariaDB Connector/C's own flaw. On Linux the client is the distribution's, which should be Connector/C 3.4.11 or later; where it is older and not patched, name the CA in TlsCaFile.
    • The database client's TlsMode=verify-full check of a database server on this machine, on MySQL and MariaDB (work item 113, CVE requested).
    • On Windows the database clients check the database server's certificate against the root certificate file named, or refuse its name (work item 114, CVE requested).
    • On Windows the files the server hands to OpenSSL by name are read from the file configured, or refused (work item 115, CVE requested).
    • On Windows the bundled MySQL and MariaDB client, MariaDB Connector/C, loads its authentication plugins from the installation's own plugin folder, or from none (work item 116, CVE requested).
    • On Windows, setup makes or hardens the program folder, Bin and ControlPanel before it copies a file or runs a program of the installation, and refuses a folder or a link on the way to them, or a program, library or script in them, that another account controls - the four narrower cases of work item 78 that 6.3.7's notes listed as still open, each with a request of its own: a new folder (CVE requested), a folder already there (CVE requested), a link on the way to them (CVE requested), and a program, library or script in them (CVE requested).
    • Published with it: the advisory for a flaw in the auto-ban on MySQL and MariaDB that 6.3.4 fixed (work item 103, CVE requested).

    The other fixes and changes an administrator meets:

    • The Helm chart starts a server. The charts of 6.3.6 and 6.3.7 stopped at "container has runAsNonRoot and image has non-numeric user (hmailserver)", and, given the user by number, at an empty configuration volume that hid the image's settings file. 6.3.8's chart runs the pod as the image's user by number, 999:999, fills new volumes in an init container and secures a new installation at its first start, as the packaged systemd unit does; so does the Compose file.
    • The container image reaches a MariaDB database. It carries MariaDB Connector/C now, and the release's pipeline starts each platform's image beside PostgreSQL and beside MariaDB and asks each for SMTP, the REST API and the schema it laid out; a chart told MySQL no longer dials MariaDB on PostgreSQL's port. Found by the project's own audit of its listings. Its entrypoint also secures a new installation by itself, whatever the container's command, and takes the database and administrator passwords out of the environment before it runs any program.
    • The Windows installer refuses an installation of the original hMailServer's 5.7. Both projects' installers register as hMailServer_is1, so those of 6.3.7 and earlier took the original's 5.7 builds of August and September 2026 (schema 5709 to 5711, which this fork's upgrade chain has no step from) for their own and replaced its programs. 6.3.8's setup refuses such an installation before it changes anything; silent, it ends with exit code 1 and writes the reason to its log and to hMailServer-setup-refused.txt in %TEMP%. Installations of this fork, and of the original up to 5.6 and its 5.7 development builds up to schema 5708, are upgraded as before.
    • A host added to AcmeDomains no longer waits for the renewal, and a check can be asked for (work item 98, ThiagoES84). A certificate that does not name every host on the list is now due at once, and GET /api/v1/acme, POST /api/v1/acme/run, COM and the Control Deck's Certificates page give its state and ask for a check, with the CA's rate limits kept (Acme.md).
    • An event after an IMAP move, for scripts (work item 109, ThiagoES84). OnIMAPMessageMoved is called once for each message an IMAP MOVE or UID MOVE moved between two folders of the account signed in, after the command and off the IMAP thread. Off as shipped: IMAPMessageMovedEvents switches it on.
    • Rspamd learns from the Junk folder, beside SpamAssassin (work item 108, ThiagoES84). A message a user moves into Junk is taught as spam, and one moved out as ham, to the filter MoveLearningBackend names, SpamAssassin by default; nothing is sent to Rspamd until it is chosen and its controller and classifier are set (JunkFolderLearning.md).
    • A stop of the servers is no longer reported as errors of their own. Work that outlasted a stop wrote its interruption to the error log as a failure and ran an installed OnError script; it now writes a line to the debug log and ends as the stop asked, a database connection it held goes back to the pool, and on Linux a session or a task that went on after a stop no longer ends the process.
    • Also: a REST request body meant to be JSON must be one JSON object; on Linux a file's name outside ASCII is one name, UTF-8, whatever LANG says; the Linux server reaches clamd over its Unix socket; and the command-line clients and the Control Panel have fixes of their own.
    • New ways to install: an Ansible collection, a Kubernetes operator for Operator Lifecycle Manager, and a container on Proxmox VE (Proxmox.md), whose scripts have not yet run on a Proxmox VE host.

    Reported from outside and answered besides: on-demand ACME issuance (work item 98), Rspamd learning from the Junk folder (work item 108) and an event after an IMAP move (work item 109), each asked for by ThiagoES84. Thank you.

    Upgrading

    • By the live update, from 6.3.7 or 6.3.6. 6.3.8 is signed with Sigstore as its own pipeline at the project's group path, with the project's id, 86730559, in the certificate, a signer every server from 6.3.4 on has compiled in; the running version's own file is its rollback image. A Windows service running as LocalSystem installs it itself; for one running as NT SERVICE\hMailServer an administrator presses Install update on the Control Panel's Server status page, on the server, and Windows asks once. On Linux the installed version's update helper applies it to the generic .deb and .rpm and both AppImages.
    • From 6.3.4 or 6.3.5, as 6.3.7's notes said: a service running as LocalSystem installs 6.3.8 by its live update; for one running as NT SERVICE\hMailServer, download hMailServer-6.3.8-x64.exe, check that Get-AuthenticodeSignature says Valid for CN=Progressive Robot Ltd, and run it as an administrator, once, keeping the service account on the installer's Service account page (SmartScreen's More info names Progressive Robot Ltd, and Run anyway installs it). On Linux, install it with apt, dnf or zypper rather than by the live update, or turn the live update's apply off first with systemctl disable --now hmailserver-update.path.
    • A server from one of 6.3.6's or 6.3.7's per-distribution packages is offered the generic package, which apt refuses on Debian 12 and dnf on Enterprise Linux 9: upgrade it with its release's own package of 6.3.8.
    • A server whose UpdateSigningIdentity, UpdateSigningIssuer and UpdateSourceRepository still name the path the project began at refuses 6.3.8: clear the three first (UpdateFeed.md).
    • By hand, from 6.2.28 to 6.3.3, or on Linux from 6.3.3's AArch64 packages or AppImages: those versions trust only the GitHub workflow that signed the releases up to 6.3.3, so run hMailServer-6.3.8-x64.exe over the installation, install the package with apt or dnf, or replace the AppImage, once; keep UpdateAutoDownload off there until then.
    • Older than 6.2.28: run the installer, as always; the upgrade chain runs from every earlier version of this fork, and from the original hMailServer up to 5.6 and its 5.7 development builds up to schema 5708, and not from the original's 5.7 releases, which 6.3.8's installer refuses.
    • The container image, registry.gitlab.com/hmailserver/hmailserver:6.3.8, also tagged 6.3 and latest, for linux/amd64 and linux/arm64. In the container the update check names the image to pull and installs nothing (ContainerImage.md).

    What the release carries

    62 files, each with its Sigstore bundle, <file>.cosign.bundle, beside it: the x64 and ARM64 Windows installers, Authenticode-signed; the generic .deb and .rpm and each supported distribution's own package, for x86-64 and AArch64; both AppImages, and beside them the source of the libraries they carry and of those their runtime links; the source tarball; the Helm chart; the PowerShell module; an SBOM for each compiled file and the tarball, and the source tree's two; and hmailserver-linux-6.3.8-SHA256SUMS.txt. Beside them, hmailserver-6.3.8.intoto.sigstore.json is SLSA v1 build provenance that names each of them by its SHA-256, and hmailserver-6.3.8.intoto.jsonl the same as one line of JSON. https://updates.progressiverobot.com/download/ leads to the newest stable release's page, and /download/hMailServer-x64.exe, /download/hmailserver_amd64.deb, /download/hmailserver.x86_64.rpm and the rest of the download links to that file of it.

    How to check a download

    With cosign and OpenSSL, with the file and its bundle beside you:

    cosign verify-blob --bundle hMailServer-6.3.8-x64.exe.cosign.bundle \
      --certificate-identity 'https://gitlab.com/hmailserver/hmailserver//.gitlab-ci.yml@refs/tags/v6.3.8' \
      --certificate-oidc-issuer https://gitlab.com hMailServer-6.3.8-x64.exe
    jq -r .verificationMaterial.certificate.rawBytes hMailServer-6.3.8-x64.exe.cosign.bundle \
      | base64 -d | openssl x509 -inform DER -noout -text | grep -A1 1.3.6.1.4.1.57264.1.15
    

    The first must say Verified OK, and the second print ..86730559, the project's own id, which cosign does not check. sha256sum -c --ignore-missing hmailserver-linux-6.3.8-SHA256SUMS.txt must say OK for each Linux file; on Windows, Get-AuthenticodeSignature on either installer must answer Valid, signed by CN=Progressive Robot Ltd, and the x64 installer's published SHA-256 is 4b9b9c3102cbed743f6c826289c54cec25c395d02208e55cdd3219187fbf8654. SECURITY.md, "Verifying a release", gives the other checks - the tag's signature and a file against the build provenance among them - and ContainerImage.md the image's and the chart's.

    How it was checked

    The tag's pipeline (https://gitlab.com/hmailserver/hmailserver/-/pipelines/3016341592) ran every gate before anything was published: the Windows suite, in two halves on the project's two Windows benches, 4,569 tests, 4,489 passed, 0 failed, 80 skipped; the Linux suite on one of the project's Linux runners, 2,749 tests, 2,374 passed, 0 failed, 375 skipped; the rebuild of the x86-64 server, .deb and .rpm byte for byte; the install of every Linux package in a clean container of its release, by that release's own package manager, the AArch64 ones under emulation, but for the generic x86-64 .rpm, which is built on Ubuntu and was installed on Fedora 44 with rpm --nodeps, its dependencies not resolved; the start of the generic x86-64 .deb and of the generic AArch64 .deb and .rpm against a database; the REUSE check; the static analysis, Semgrep and the dependency scan. It then checked every signature with the server's own verifier, hmailserver --verify-update, built from the same commit. The signed installer went through the installer smoke test: an upgrade from 6.3.7 passed 105 checks and a new installation 65, none failed. The published chart, installed from the project's Helm repository into a one-node cluster, started its pod with 6.3.8's image and answered SMTP with STARTTLS and the REST API over TLS.

    Known issues

    • The ARM64 installer has never run on ARM64 hardware. It is cross-compiled on the project's x64 Windows runner and remains a preview (WindowsOnArm.md); the AArch64 Linux files are cross-compiled, and installed - the generic .deb and .rpm started as well - in the release's pipeline under emulation: no AArch64 machine has run them. If you install either, please say how it went, working or not, in an issue.
    • The channels are sent 6.3.8 by jobs started by hand once the release is published: the Ubuntu PPA, Fedora Copr, Docker Hub, Chocolatey (listed once its moderators approve it), PyPI and the PowerShell Gallery; the openSUSE Build Service once its package holds this release's new _service, until then keeping 6.3.7; and the snaps on the Snap Store's edge and candidate channels, stable being promoted by hand. The Ansible collection is not on Ansible Galaxy yet, and the one in the tree installs 6.3.7 unless it is given another release's SHA-256; the operator's pull request to OperatorHub.io is made by hand (Channels.md).
    • The Proxmox VE scripts have not run on a Proxmox VE host, only as a dry run, with stand-ins of its commands, and in a container made from its own debian-13-standard template. If you run them, please say how it went in an issue.
    • The image's OpenSSL, Ubuntu 24.04's 3.0.13, has neither the hybrid post-quantum key exchange groups nor Argon2id: its server logs HM5720 and takes the classical groups and scrypt, and GET /api/v1/status says false for both.
    • An AppImage on Fedora, Enterprise Linux or openSUSE runs on the host's glibc and cannot require its extra character-set converters: install glibc-gconv-extra (Fedora, EL) or glibc-gconv-modules-extra (openSUSE) by hand; the server says when they are missing.

    While releases pause

    6.3.6 was the last release planned by date, by the owner's decision of 28 September 2026; the releases since are security releases, each cut from master with whatever finished work it holds then, until the maintainers say otherwise in SECURITY.md, "While releases pause". A confirmed vulnerability still ships: a critical or high one as soon as its fix has passed the gates, and none held past 90 days from its acknowledgement. 6.3.8 was first decided on 24 October 2026, under the owner's delegation, because the published Helm charts of 6.3.6 and 6.3.7 start no server, which only a release can put right; the project's own work since found the vulnerabilities above, and 6.3.8 is made as a security release, that reason standing beside them. One of its fixes, work item 100's, was public on GitLab from 19 October 2026 and on master from 20 October 2026, a week before it was judged a vulnerability, longer than the day SECURITY.md allows; the others were pushed with the release. The 6.3 line receives security fixes until 30 September 2027. To hear of a release, switch the server's update check on (UpdateCheckEnabled), or follow the releases' feed.

    Reporting a vulnerability

    Not in a thread here, and not in a public issue. Report it privately, as SECURITY.md says: a confidential issue on GitLab - check that it is still marked confidential before you submit it, and choose the Security template - or an email to contact-project+hmailserver-hmailserver-86730559-issue-@incoming.gitlab.com, which GitLab files as a confidential issue, so no GitLab account is needed.

    Release notes, checksums and downloads · Mirror on GitHub · Newest stable release


  • hMailServer 6.3.7: security fixes for every earlier version, read before upgrading, and the first security release of the pause
    chrisC chris
    Announcements & releases

    This release is superseded by hMailServer 6.3.8, a security release published on 2 November 2026. Upgrade every server running 6.3.7 or earlier, and read its announcement before upgrading.

    hMailServer 6.3.7 was published on 17 October 2026. It is a security release: it fixes the security flaws listed under Security below, in every earlier version, among them a way for any account that could sign in to a Windows computer to replace the programs of an hMailServer installed at the root of a drive, the DKIM signing of mail from outside in a hosted domain's name, and any sender's way past the rule loop limit; and its Windows installers carry the .NET Desktop Runtime 10.0.13, and its x64 installer MariaDB Connector/C 3.4.11. The schema stays at 6108: from 6.3.6 the upgrade changes no table. It is the first release since 6.3.6 and the first security release made while releases pause, and it carries more than fixes: the work that was under way on 13 October 2026, which the owner decided that day to finish and fold into one batch, and, by his decision of 15 October 2026, the work already done for a later release - the first step of the Control Deck's and the webmail's rebuild planned for 6.4: the framework decision, the threat model of the web surface and the authorisation matrix with its check, with no product code.

    Who is affected, and what to do

    • Every server running 6.3.6 or earlier: upgrade. The security section below says why.
    • Before upgrading, read "Before you upgrade". Some changes alter what an upgraded server does without anything being switched on - above all for accounts that send as another hosted domain's addresses, for rules and Sieve scripts that rewrite who a message is from, for an account given the serveradmin role with a list of domains that administers the whole server over COM, and for a database account that signs in with MySQL Enterprise's Windows authentication.
    • On 6.3.6: the live update installs 6.3.7, with the exceptions under "Upgrading". On a Windows server whose service runs as NT SERVICE\hMailServer, an administrator presses Install update on the Control Panel's Server status page, on the server, and Windows asks once.
    • On 6.3.4 or 6.3.5: the live update installs 6.3.7 too, with the exceptions under "Upgrading".
    • On 6.2.28 to 6.3.3, or on a Linux server from 6.3.3's AArch64 packages or AppImages: upgrade by hand, once. Those versions trust only the GitHub workflow that signed the releases up to 6.3.3.
    • Older than 6.2.28: run the installer, as always; the upgrade chain runs from every earlier hMailServer version.

    Before you upgrade

    • Back up the database and the data directory, each with its own tools (Upgrading.md). 6.3.7 adds no schema step, so the live update's rollback to 6.3.6, should 6.3.7 not start, meets no newer schema. From 6.3.5 or older the upgrade runs 6.3.6's three one-way steps to 6108, 6.3.6's announcement applies, and the backup is the only way back; from 6.3.3 or older 6.3.4's steps come first, and 6.3.4's notes apply as well.
    • Accounts that send as another hosted domain. An authenticated submission is now signed as another domain hosted here only when its account may send as the address its From names - its own, an alias pointing at it, a mailbox that granted it the post right, an address it proved, or a masked address of its own. Otherwise the mail is still accepted and sent, unsigned as that domain. Give such an account the alias or the grant before upgrading.
    • Rules and Sieve scripts that rewrite who a message is from. A domain's or an account's rule may no longer set From, Sender, Resent-From, Resent-Sender or DKIM-Signature, or the loop count, and its Reply goes only from an address its owner may send as; a Sieve script may no longer add or delete those fields, Auto-Submitted or the loop count, and its notify goes from the account's own address unless its :from reaches the account. One stored before the upgrade still runs, without that action or edit, and the application log names it. To set From on a domain's mail, make the rule a server rule with a condition on the domain.
    • RuleLoopLimit 0 now stops out-of-office replies, as it stopped every other generated message.
    • The serveradmin role with a list of domains. An account given the serveradmin role with a list of domains is, over COM as over REST, confined to those domains and no longer the server's administrator: give the role with no list to an account that is to administer the whole server, a script's or a Control Panel's account among them.
    • Event scripts that use a transaction. A script that goes on in a transaction after Database.ExecuteSQL has failed is refused every statement after it once the database has ended the transaction, and Database.CommitTransaction then fails: call Database.RollbackTransaction and run the whole transaction again, or stop.
    • The x64 installer's MySQL and MariaDB client is MariaDB Connector/C 3.4.11, built from MariaDB's source, with seven authentication plugins where 6.3.6's had nine. A database account that signs in with MySQL Enterprise's Windows authentication can no longer sign in, and the server then cannot open its database. No such setup is known to the project; ThirdPartyBinaries.md says what one would have to do before upgrading.
    • The .NET 10 Desktop Runtime is not replaced. The Control Panel and the setup tools run on it; the mail server itself does not. The installers carry 10.0.13, Microsoft's security release of 13 October 2026, but install it only where no .NET 10 Desktop Runtime is installed at all: an upgraded server keeps the one it had - 10.0.12 where 6.3.4, 6.3.5 or 6.3.6 installed it - against which Microsoft published advisories that day, several of them rated High; whether hMailServer's own tools reach the code they concern has not been established. Bring it to 10.0.13 or later through Microsoft Update (on Windows Server, WSUS or the Microsoft Update Catalog, or Automatic Updates where the server has been opted in), or with Microsoft's installer from https://dotnet.microsoft.com/download/dotnet/10.0; dotnet --list-runtimes lists what a machine has.
    • Windows: the program folder, Bin and ControlPanel. At every installation and upgrade /ProtectFolders now hardens the three: they keep no entry that lets another user change them, a file's own entry aside, which a CHECK line names, and under Program Files the first run makes their inherited entries their own. An installation at the root of a drive is hardened by the upgrade itself; to have it hardened before the upgrade runs anything from it, follow the steps "Before upgrading an installation at a drive's root" in ServiceAccount.md first. Reinstall the programs from the release into a new folder that only the administrators may change, not over the installation, where accounts that are not administrators could sign in to the computer while it was installed so, where anybody but SYSTEM, the Administrators or TrustedInstaller owned one of the three folders, a file directly in the program folder, or Events, WebAdmin, DBScripts, Addons or Languages or anything in them or in Bin or ControlPanel, or where one of the three had an entry of its own that let anybody else change it, or one the steps could not take away: setup leaves in place every file it does not ship, and puts the event script in Events, which the service runs, and the scripts in Addons only where none is there. The documentation says how: nothing run from the old folder, its uninstaller included; the mail, the built-in database and the settings file copied into the new folder before setup runs, since setup run into a folder without a settings file sets up a new, empty server; the settings file - its [Directories] and administrator password - and the event script read first; and setup given the new folder with /DIR=, since over an installation it installs into the folder it finds, once a 32-bit installation's uninstall entry, which overrides /DIR=, is taken away.
    • Sign-in and relaying. SMTP, POP3 and ManageSieve refuse a SASL PLAIN sign-in that asks to act as another account. With SRS on, mail to an SRS address this server handed out is held to the relay rules unless it is a bounce.
    • The anti-virus action Remove all attachments and deliver the text (Delete infected attachments only in 6.3.6's Control Panel) now delivers a message that is one attachment as the note alone, and deletes a message the server cannot read, telling its recipients.
    • Forwards of mail from outside. A forward, a redirect or a rule's forward of mail from outside whose From names the forwarding domain's own organisation, and that did not pass DMARC for it when it arrived, keeps the envelope sender it came with, with no SRS address or rewritten sender; a copy of it with an empty envelope sender is not sent to an outside address under this server's host name where that name is in the same organisation; a copy whose own envelope sender is at this server's host name, or at a hosted domain or a subdomain of one, in the organisation its From names is not sent to an outside address at all - the message stays in the mailbox, and the application log names each recipient - nor is such a message sent where an alias or a distribution list expands to an outside address; and a managed list does not distribute a posting whose From names the list domain's organisation unless it passed. No pass is recorded for a message the DMARC check did not judge - with ASDMARCEnabled off, from a sender on the anti-spam white list or an IP range with spam protection off, larger than antispammaxsize (1024 KB as shipped), already scored by the tests before it at the higher of the spam thresholds, imported from a file or downloaded - nor for a From whose domain publishes no DMARC record.

    Security

    Each of these was found by the project's own review, and each is fixed in 6.3.7, unless it says otherwise. Each links its work item, which gives the details, and the Security section of CHANGELOG.md says what changed.

    • CVE-2026-107571, work item #78 - on Windows, where hMailServer was installed in a folder that took its permissions from the root of a drive, any account that could sign in to the computer could replace the programs the service runs; every version from 6.0.0 to 6.3.6. The default folder under Program Files was never affected. Four narrower cases are not fixed in 6.3.7 (Known issues, below).
    • CVE-2026-107567, work item #84 - mail from outside whose From named a domain hosted here was signed with that domain's DKIM key, and so was every forward and copy of it, so that it passed DMARC for that domain elsewhere; and an authenticated submission was signed as whatever hosted domain its From named, which 6.3.7 does only where the account may send as that address; every version from 6.0.0 to 6.3.6 that signs. An upgrade stops the signing; only rotating a domain's key ends the signatures already made.
    • CVE-2026-114478 and CVE-2026-114474, work item #90 and work item #91 - a forward, a redirect, a list's copy or an alias's copy of mail from outside, a forward of a message downloaded from an external account among them, was given an envelope sender, or for a null one was sent under a host name, in the organisation of a domain its From names, so that it could pass that domain's DMARC policy through SPF; every version from 6.0.0 to 6.3.6. 6.3.7 does so only when the message passed DMARC for it on arrival.
    • CVE-2026-107568, work item #82 - an account's Sieve notify was sent from whatever its :from said, and signed as that address's domain where the server signs for it; 6.2.22 to 6.3.6.
    • CVE-2026-107566, work item #83 - an account's Sieve editheader could rewrite From, Sender or DKIM-Signature ahead of a redirect, which the server then sent and signed in that name; 6.2.22 to 6.3.6. A domain's or an account's rule had the same gap, in every version - a Reply from an address its owner may not send as, a Set header value of From, Sender, the Resent- pair or DKIM-Signature - and is held the same way, under work items #82 and #83.
    • CVE-2026-107569, work item #81 - any sender could lift the rule loop limit off a message, an account's own Sieve script or rule could reset it, and a Sieve notify did not consult it, so that a loop of generated mail could run without bound; every version from 6.0.0 to 6.3.6.
    • CVE-2026-114489, work item #86 - on a server with several tenants, a credential confined to named domains - a domain administrator, an account or API key given another role that manages accounts in named domains, or a full-scope API key issued for named domains - could rename a domain, create a domain alias, set on a domain's or an account's rule an action that reaches the server's own addresses, a configured route's stored credentials or a function of the event script, and point its domain's relay host at the server's own network, over the REST and the COM APIs; every version from 6.0.0 to 6.3.6.
    • CVE-2026-114475, work item #89 - such a credential, a full-scope API key issued for named domains or the serveradmin role given with a list of domains, could rewrite over the REST API a custom role that accounts in other domains hold, and create custom roles or delete one that no account holds; 6.3.4 to 6.3.6.
    • CVE-2026-114477, work item #96 - a credential confined to named domains that may read their configuration, such as a domain administrator, the auditor role given a list of domains or an API key issued for named domains, could read the server-wide metric history over the REST API; 6.2.25 to 6.3.6.
    • CVE-2026-114490, work item #87 - over COM, an account given the serveradmin role with a list of domains was the server's administrator, its list aside, and one given domainadmin with a list that leaves out its own domain administered that domain's ordinary accounts, where the REST API refused both; 6.3.4 to 6.3.6, on Windows.
    • CVE-2026-114476, work item #88 - over the REST API, a credential that holds manage_roles in named domains could take a role away from an account in those domains whose admin level is the server administrator's, and so hand that account the server administrator's authority; 6.3.4 to 6.3.6.
    • CVE-2026-114470, work item #93 - a page on another site could make a browser that held a REST API credential from HTTP Basic send a state-changing request to the server, a cross-site request forgery; every version from 6.0.0 to 6.3.6.
    • CVE-2026-114472, work item #97 - the ACME HTTP-01 challenge responder served one connection at a time, so idle clients could make a certificate's issuance or renewal fail; every version from 6.0.0 to 6.3.6. It now serves up to 64 connections at once and closes one past that; a client that holds 64 idle connections open through a whole validation can still make it fail (the work item says what remains).
    • CVE-2026-114479, work item #92 - with the anti-virus action that removes attachments (AVAction 1: Delete infected attachments only in 6.3.6's Control Panel, Remove all attachments and deliver the text in 6.3.7's), a message whose one part is an attachment, and an S/MIME message signed as one part, were delivered as they arrived, with what the scanner had found in them; every version from 6.0.0 to 6.3.6. The default action, which deletes the message, was never affected.
    • CVE-2026-114473, work item #94 - with SRS on, which it is not by default, mail to an SRS address this server had handed out was not held to the relay rules; 6.2.1 to 6.3.6. Found by upstream hMailServer's review of its own SRS (upstream PR 649).
    • CVE-2026-114471, work item #95 - with SMTP logging on, which it is not by default, the SMTP log wrote some credentials in the clear - an AUTH PLAIN sent before EHLO or not in its one exact form, the bearer token of AUTH XOAUTH2 and AUTH OAUTHBEARER, and the lines of SCRAM-SHA-256, OAUTHBEARER and GSSAPI; every version from 6.0.0 to 6.3.6, each mechanism from the version that brought it. Found by upstream hMailServer (upstream issue 654).

    The same release fixes or hardens more without a CVE request: the ARC seals this server makes attest its own SPF result, are made by the domain that relayed the message and name the domains their results are for; the stored-secrets key is no longer left in memory freed without being written over, nor a mailbox key encrypted at rest open past its idle minutes (both from 6.3.4); and, found by upstream hMailServer in code this project shares with it, an SRS address or a BATV tag almost a whole cycle old is no longer taken for fresh (upstream PR 649), and a SASL PLAIN client that asks SMTP, POP3 or ManageSieve to act as another account is refused, where it was signed in as itself (upstream issue 652). The Windows installers carry the .NET Desktop Runtime 10.0.13 (Microsoft's security release of 13 October 2026, where 6.3.4 to 6.3.6 carried 10.0.12), and the x64 installer MariaDB Connector/C 3.4.11, the first release of Connector/C with the fix of CVE-2026-107819, a flaw of the Connector/C 3.4.9 that 6.2.3 to 6.3.6 carried; the ARM64 installer carries no MySQL or MariaDB client. Upgrade every server running 6.3.6 or earlier.

    Five of these fixes, those of work items 78 and 81 to 84, and their descriptions in CHANGELOG.md, were public in the project's repository before this release - on GitLab from 6 and 7 October 2026, and on master from 7 and 9 October 2026. That was the owner's decision, and an exception: the rule, which holds again after 6.3.7, is that a security fix becomes public about a day before the release that ships it (SECURITY.md, "What gets a release").

    Upgrading

    • By the live update, from 6.3.6. Every file of 6.3.7 is signed with Sigstore as this release's own pipeline at the project's group path, https://gitlab.com/hmailserver/hmailserver//.gitlab-ci.yml@refs/tags/v6.3.7, with the project's id, 86730559, in the certificate; every server from 6.3.4 on has that signer compiled in and requires the id for it. From 6.3.6 the live update installs 6.3.7, with 6.3.6's own file as its rollback image. On Windows a service running as LocalSystem installs it itself; one running as NT SERVICE\hMailServer downloads and verifies it, and an administrator installs it with Install update on the Server status page of the Control Panel on the server - one Windows prompt, and the installer is checked again, elevated, before it runs. On Linux 6.3.6's own update helper applies it, for the generic .deb and .rpm of either architecture and for both AppImages; an ARM64 Windows server finds the ARM64 installer by name. No live update had installed a release signed at the group's path when this was written.
    • From 6.3.4 or 6.3.5, what 6.3.6's notes said of those two versions still holds, since the update is applied by the version already installed. A Windows service running as LocalSystem installs 6.3.7 by its live update, from 6.3.5 with 6.3.5's file as its rollback image and from 6.3.4 without one; that image is no way back once the upgrade's schema steps have run, and the backup taken before the upgrade is. One running as NT SERVICE\hMailServer downloads and verifies it, then leaves the install to an administrator (HM7463), whose Install update on 6.3.4 and 6.3.5 cannot do it: download hMailServer-6.3.7-x64.exe from the release, check that Get-AuthenticodeSignature says Valid for CN=Progressive Robot Ltd, and run it as an administrator, keeping the service account on the installer's Service account page - once, since every release after it installs with one click. On a machine that has not seen the file before, Windows SmartScreen may say that it "prevented an unrecognized app from starting": More info names the publisher, Progressive Robot Ltd, and with the signature checked, Run anyway installs it. On Linux, install 6.3.7 with apt, dnf or zypper rather than by the live update, whose apply step on 6.3.4 and 6.3.5 is the one 6.3.6 fixed (CVE-2026-104658), or turn the apply off until then with systemctl disable --now hmailserver-update.path.
    • Three settings left from 6.3.5's by-hand route. A server whose UpdateSigningIdentity, UpdateSigningIssuer and UpdateSourceRepository still name the path the project began at refuses 6.3.7. Clear the three first: on 6.3.4 and 6.3.5 in the Control Panel, with DELETE /api/v1/settings/ini/<name> or on Linux with hmailserver --set-setting <name>=, not in the file, which those versions put back; on 6.3.6, which reads them from hMailServer.ini alone, by deleting their lines from [Settings] with an editor run as an administrator, or on Linux with sudo hmailserver --set-setting <name>=, and restarting the service.
    • By hand, from 6.2.28 to 6.3.3, and from 6.3.3's AArch64 packages or AppImages. On Windows run hMailServer-6.3.7-x64.exe over the existing installation; on Linux install the package with apt or dnf, or replace the AppImage with 6.3.7's. Those versions refuse a release signed on GitLab, and one pointed at this project's feed with UpdateFeedUrl downloads the installer at every check and refuses it: keep UpdateAutoDownload off there until then.
    • A server from one of 6.3.6's per-distribution packages is offered the generic package by its live update, which apt refuses on Debian 12 and dnf on Enterprise Linux 9. There, upgrade with the package manager and your release's own package of 6.3.7.
    • The container image, registry.gitlab.com/hmailserver/hmailserver:6.3.7, also tagged 6.3 and latest. In the container the update check names the image to pull and installs nothing (ContainerImage.md).

    What else changes on upgrade

    The 6.3.7 section of CHANGELOG.md lists everything under "What changes on upgrade without a switch". The rest, in short:

    • Database errors: on MySQL, MariaDB, SQL Server and SQL Server Compact an insert that forgives a duplicate key forgives that alone, and any other failure is reported (HM5032), where it was taken as done with no row written; on MySQL and MariaDB a lost connection is reconnected and the statement run again, so the statement after a database restart, a failover or wait_timeout no longer fails. An error log that was quiet may now name failures that were hidden.
    • IMAP: COPY and MOVE by message number read their set in the client's numbering, and a set that names a message another session has just expunged is refused, NO [EXPUNGEISSUED], for the client to send again; a COPY or MOVE that fails part way leaves the destination as it was; SEARCH, SORT and THREAD ask a criterion named again beside itself once; FETCH BODY[N.MIME], and BODY[N] of a multipart, are the stored octets.
    • POP3: classic Outlook for Windows, Outlook 2016 to 2024, downloads its mail again: the server accepts the UTF8 it sends after the login, until the session's first STAT, LIST, UIDL, RETR, TOP, DELE or RSET.
    • DNS: a DNS lookup that fails is a failure, not a name with no addresses (upstream PR 640). The HELO and PTR tests no longer score a name they could not look up, a DNS blacklist and SURBL no longer read a failed lookup as "not listed", and delivery whose mail servers' lookup failed tells the sender that the DNS query failed (4.4.4) and retries.
    • Anti-spam: a link's host that is not ASCII is read by UTS 46, and an HTML part's character references as a browser reads them, for the SURBL test and the sender lists' URL entries; and SpamAssassin is sent a collected message's own Return-Path, so its SPF and envelope rules may score such mail differently.
    • Large messages: a message over 80 MB goes through the rules, the forwards, a bounce and the spam headers by its header alone, where it went through them as if it had no header; the rule conditions that need the body do not match, each with a line in the application log.
    • Stops: setup, the live update's silent install and the uninstaller wait ShutdownDrainSeconds plus 90 seconds for the service's stop, where they waited plus 30; and on Windows a stop no longer waits past a work queue's ten seconds for a thread held by a host or a database that has stopped answering.
    • Rules: a rule's Run function is refused when it is saved unless it names a plain function, for a rule of every owner, over COM and REST.
    • The quarantine: a quarantined copy's file name carries where the message came from, its SPF result and the relaying domain (<GUID>.spf-fail.outside.eml, .relay-<id>); a tool that reads the quarantine folder by name meets the longer names.
    • The Control Panel: Updates is a page of its own under Maintenance; the sidebar has Compliance and Virus scanning groups; API & monitoring is Monitoring & alerts; the PROXY protocol and XCLIENT are a card on Incoming relays; and Ctrl+K takes every old title and route to its page. A Control Panel signed in to a server on another computer shows and saves the server's hMailServer.ini [Settings] values.

    Reported from outside and fixed besides: the Control Panel's IP ranges page, which could show no list of ranges at all (work item #79, ThiagoES84); mail to a DNSSEC-signed domain whose MX answer came compressed, live.com among them, which DANE enforcement deferred (work item #80, ThiagoES84); and classic Outlook's POP3 downloads, which stopped at the UTF8 it sends after the login (work item #85, ciprianbalus). Thank you.

    Also new

    • The IMAP and POP3 listeners take the client's address from a PROXY protocol header, as the SMTP listener does, each from the peers on a list of its own; both are off by default.
    • The first units of the active-active work, which is still not built (ActiveActive.md).
    • The first step of the Control Deck's and the webmail's rebuild, with no product code: ControlDeckFramework.md, WebThreatModel.md and WebAuthorisationMatrix.md, the matrix written from the code by build/generate-auth-matrix.py and held to it in CI.

    What the release carries

    62 files, each with its Sigstore bundle, <file>.cosign.bundle, beside it:

    • Windows: hMailServer-6.3.7-x64.exe, and hMailServer-6.3.7-arm64.exe for Windows on ARM, both Authenticode-signed. The ARM64 installer is a preview: it is cross-compiled on the project's x64 Windows runner and has never run on ARM64 hardware. SQL Server Compact has no ARM64 build, so a new ARM64 installation is set up against SQL Server or PostgreSQL (WindowsOnArm.md).
    • Linux, x86-64 and AArch64: the generic hmailserver_6.3.7_amd64.deb, hmailserver_6.3.7_arm64.deb, hmailserver-6.3.7-1.x86_64.rpm and hmailserver-6.3.7-1.aarch64.rpm, the names an installed server's update check asks for; and each Debian 12 and 13, Ubuntu 24.04, Fedora 44 and 43, Enterprise Linux 10 and 9, openSUSE Leap 16.0 and Tumbleweed release's own package for both architectures. The AArch64 files are cross-compiled and tested under emulation: no AArch64 machine has run them.
    • The AppImages, hMailServer-6.3.7-x86_64.AppImage and hMailServer-6.3.7-aarch64.AppImage, and beside them the source of the libraries they carry and of those their runtime links.
    • The source tarball, hmailserver-6.3.7.tar.gz; the Helm chart, hmailserver-chart-6.3.7.tgz; and the PowerShell module, HmailServer.psd1 and HmailServer.psm1, Authenticode-signed.
    • An SBOM for each compiled file and the tarball, <file>.cdx.json, and the source tree's two; hmailserver-linux-6.3.7-SHA256SUMS.txt, the SHA-256 of every Linux file; and, beside the 62, hmailserver-6.3.7.intoto.sigstore.json, SLSA v1 build provenance that names each of them by its SHA-256.

    https://updates.progressiverobot.com/download/ leads to the newest stable release's page, and /download/hMailServer-x64.exe, /download/hmailserver_amd64.deb, /download/hmailserver.x86_64.rpm and the rest of the download links to that file of it.

    How to check a download

    With cosign and OpenSSL, with the file and its bundle beside you:

    cosign verify-blob --bundle hMailServer-6.3.7-x64.exe.cosign.bundle \
      --certificate-identity 'https://gitlab.com/hmailserver/hmailserver//.gitlab-ci.yml@refs/tags/v6.3.7' \
      --certificate-oidc-issuer https://gitlab.com hMailServer-6.3.7-x64.exe
    jq -r .verificationMaterial.certificate.rawBytes hMailServer-6.3.7-x64.exe.cosign.bundle \
      | base64 -d | openssl x509 -inform DER -noout -text | grep -A1 1.3.6.1.4.1.57264.1.15
    

    The first must say Verified OK, and the second print ..86730559, the project's own id, which cosign does not check: the identity is a path, and a path could pass to another project were the group or the project renamed. Each file but a <file>.cdx.json SBOM also has its bundle a second time as <file>.sigstore.json; either name verifies the same way.

    To check that a file is one this release's pipeline built, against its build provenance:

    cosign verify-blob-attestation --new-bundle-format \
      --bundle hmailserver-6.3.7.intoto.sigstore.json --type slsaprovenance1 \
      --certificate-identity 'https://gitlab.com/hmailserver/hmailserver//.gitlab-ci.yml@refs/tags/v6.3.7' \
      --certificate-oidc-issuer https://gitlab.com hmailserver_6.3.7_amd64.deb
    

    It says Verified OK only when the file's SHA-256 is one the provenance names. Then:

    • sha256sum -c --ignore-missing hmailserver-linux-6.3.7-SHA256SUMS.txt must say OK for each Linux file you downloaded.
    • On Windows, Get-AuthenticodeSignature on either installer must answer Valid, with a signer certificate for CN=Progressive Robot Ltd. The x64 installer's published SHA-256 is dcae96bd75d6cae8e5a910d15940567067539ed99db5aeed40a815added4d85f.
    • In a clone, git -c gpg.ssh.allowedSignersFile=.gitlab/allowed_signers verify-tag v6.3.7 must report a good signature by the one key that file lists.
    • For the image, ContainerImage.md, "Checking an image", gives the cosign verify command and the check of the project's id.

    The release's own notes, under Verification, give each file's SHA-256 and the certificate the pipeline was given. SECURITY.md, "Verifying a release", has the rest.

    How it was checked

    The tag's pipeline (https://gitlab.com/hmailserver/hmailserver/-/pipelines/2958958332) ran every gate before anything was published: the Windows suite, in two halves on the project's two Windows benches, 4,446 tests, 4,366 passed, 0 failed, 80 skipped; the Linux suite on one of the project's Linux runners, 2,652 tests, 2,284 passed, 0 failed, 368 skipped; the rebuild of the x86-64 server, .deb and .rpm byte for byte; the install of every Linux package in a clean container of its release, by that release's own package manager, the AArch64 ones under emulation, but for the generic x86-64 .rpm, which is built on Ubuntu and was installed on Fedora 44 with rpm --nodeps, its dependencies not resolved; the generic x86-64 .deb configured and started against a database; the static analysis, Semgrep and the dependency scan. It then checked every signature with the server's own verifier, hmailserver --verify-update, built from the same commit. The signed installer went through the installer smoke test: an upgrade from 6.3.6 passed 98 checks and a new installation 64, none failed.

    Known issues

    • Four narrower cases of work item #78 are not fixed in 6.3.7, by the owner's decision, and stay open: setup hardens a program folder before it copies anything into it only when setup makes the folder, and then just after making it; a folder that is already there is hardened in place, before the copy, only for an installation of the Control Panel alone, while for a server installation, and at every upgrade, the program folder, Bin and ControlPanel are hardened by /ProtectFolders at the end of setup; a link or a junction in the program folder's path is named in setup's log as not hardened, and not refused; and the files in Bin and ControlPanel are not listed by their owners. None of them reaches an installation in a folder only the administrators may change - the default under Program Files is one - unless a link that another account controls is on its path. Before upgrading an installation at the root of a drive, follow ServiceAccount.md's steps (Before you upgrade, above).
    • The ARM64 installer has never run on ARM64 hardware, and no AArch64 machine has run the AArch64 Linux files. If you install either, please say how it went, working or not, in an issue.
    • No channel publishes it yet. The apt and dnf repositories, Docker Hub, Quay.io, the AUR, the Ubuntu PPA, Copr, the openSUSE Build Service, Chocolatey, PyPI and the PowerShell Gallery publish from master once their keys and accounts exist; none is live as this release is made (Channels.md). The Snap Store's name is registered, and the job that would have put 6.3.7 on its edge and candidate channels once the release was published failed on 18 October 2026, on a tool missing from its image, with the two snaps built and checked: 6.3.7 is not on the Snap Store (Snap.md).
    • An AppImage on Fedora, Enterprise Linux or openSUSE runs on the host's glibc and cannot require its extra character-set converters: install glibc-gconv-extra (Fedora, EL) or glibc-gconv-modules-extra (openSUSE) by hand; the server says when they are missing.
    • An upgraded server keeps the .NET 10 Desktop Runtime it had (Before you upgrade, above).

    While releases pause

    6.3.6 was the last release planned by date, by the owner's decision of 28 September 2026; the releases since are security releases, each cut from master with whatever finished work master holds then, until the maintainers say otherwise in SECURITY.md, "While releases pause". A confirmed vulnerability still ships in a release: a critical or high one as soon as its fix has passed the gates, and none held past 90 days from its acknowledgement. Other defects are fixed on master and ship with the next security release, or when releases resume. The 6.3 line receives security fixes until 30 September 2027; before that date the maintainers write in SECURITY.md whether support continues, and if nothing has been written, the 6.3 line is not supported from 1 October 2027. Nothing is back-ported: an installation of 6.3.6, 6.2 or anything older is upgraded in place to the newest release. To hear of a security release, switch the server's update check on (UpdateCheckEnabled), or follow the releases' feed.

    Reporting a vulnerability

    Not in a thread here, and not in a public issue. Report it privately, as SECURITY.md says: a confidential issue on GitLab - check that it is still marked confidential before you submit it, and choose the Security template - or an email to contact-project+hmailserver-hmailserver-86730559-issue-@incoming.gitlab.com, which GitLab files as a confidential issue, so no GitLab account is needed.

    Release notes, checksums and downloads · Mirror on GitHub · Newest stable release


  • hMailServer 6.3.6: security fixes for every earlier version, read before upgrading, and the last release for the time being
    chrisC chris
    Announcements & releases

    This release is superseded by hMailServer 6.3.7, published on 17 October 2026, which fixes security flaws in every earlier version, 6.3.6 included. Read its announcement before upgrading.

    hMailServer 6.3.6 was published on 6 October 2026. It fixes the security flaws the project's own reviews of the code found, those listed under Security below with their CVE identifiers among them, and takes OpenSSL 4.0.3 into the Windows installers. It also fixes what 6.3.5's release and the first live updates from 6.3.4 found, replaces with the project's own code the last code in the server whose licence a distribution would have had to settle, and carries every file its pipeline makes, the ARM64 Windows installer (a preview) and the AArch64 Linux packages among them. The schema moves from 6105 to 6108 in three one-way steps. 6.3.6 is the last release for the time being: after it the project makes security releases only (below).

    Who is affected, and what to do

    • Every server running 6.3.5 or earlier: upgrade. The security section below says why.
    • Before upgrading, read "Before you upgrade". Some changes alter what an upgraded server does without anything being switched on - above all for a server whose DNS resolver strips DNSSEC, for external accounts, for scripts that use COM, for programs that read a Windows server's logs or mail as an ordinary account, and for administrators who run the store commands or install by script.
    • On 6.3.4 or 6.3.5: the live update installs 6.3.6, with the exceptions under "Upgrading".
    • On 6.2.28 to 6.3.3, or on a Linux server from an AArch64 package or an AppImage: upgrade by hand, once. Those versions trust only the GitHub workflow that signed the releases up to 6.3.3.
    • Older than 6.2.28: run the installer, as always; the upgrade chain runs from every earlier hMailServer version.

    Before you upgrade

    • Back up the database and the data directory. The three schema steps are one-way: 6106 gives external accounts' days to keep messages one meaning (below); 6107 finishes the greylisting key - a sender whose old row it deletes is greylisted once more, and on a large hm_greylisting_triplets it keys the old rows before its transaction, committing as it goes; 6108 adds the never-ban list by reverse name and each SMTP listener's choice of what it does with AUTH. From 6.3.3 or older the upgrade runs 6.3.4's steps first, and 6.3.4's notes apply.
    • Mail can stop flowing if your DNS resolver strips DNSSEC. With DANE on, as it is by default, an MX or TLSA lookup that does not come back whole - no answer, SERVFAIL, a signed zone's answer without its signatures or without its proof that no records exist - no longer counts as "unsigned": the host is not used, and a delivery with no host left is deferred with 4.7.0. A server whose resolver cannot answer DNSSEC queries, or behind a firewall that drops DNS answers longer than 512 octets, now defers its mail to most domains, and says so in each deferral and in the application log ("DNSSEC: the root zone's keys did not validate"). Make the resolver answer DNSSEC queries (any current public or ISP resolver does), or set DaneEnforcementEnabled to 0. A private name under a signed public domain, answered by an internal DNS server, needs a route.
    • Outbound TLS defers more. A host that the destination's TLSA records or MTA-STS policy require TLS of, and that offers no STARTTLS, is deferred with 450 4.7.0 where the message bounced; a host with only DANE-TA records whose certificate does not meet them is deferred where it was delivered to as if no record were published.
    • External accounts: days to keep messages means one thing now. -1 deletes each message on the remote server once collected, 0 leaves every message there, N deletes it N days after collection - for POP3 and IMAP alike. From 6.2.25 to 6.3.5 the IMAP fetcher read 0 and -1 the other way round, and the Control Panel, the Deck, the webmail and the REST API described that reversed meaning. The upgrade keeps every account doing what it did or stops it deleting. Afterwards, look at your IMAP external accounts (one that was emptying its remote INBOX now shows -1 and goes on until you set 0) and your POP3 accounts at -1 (they go on deleting until you set 0). A script that writes the value, or an OnExternalAccountDownload script that answers 1 for an IMAP account, follows the one meaning from now on. A webmail or Deck page left open across the upgrade has a change with a negative number refused (409, reload the page) until it is reloaded.
    • A script outside the service that uses COM, on a server with an administrator password. Utilities.BlowfishEncrypt, BlowfishDecrypt, ResolveMXRecords, GetMailServer, IsLocalHost, CheckSieveSyntax, EvaluateSieveScript and CriteriaMatch answer only a caller that has signed in: create hMailServer.Application, call Authenticate, and use that object's Utilities. A message or fetch account the script creates itself works only while the same program holds an Application it signed in on; or make the message with the new Application.CreateMessage() after Authenticate. Attachments.Add and Attachment.SaveAs are the server administrator's alone, and mail a script signed in as an account sends must be from an address that account may send as. Event scripts in the service, the Control Panel and the shipped DecryptBlowfish.vbs need no change.
    • Windows: the data, log, temp, database and event folders and hMailServer.INI become private to SYSTEM, the Administrators and the service, at every installation and upgrade, whatever account the service runs as; on a large message store the first run takes minutes. A script, a backup program or a monitoring agent that read the logs or the message store as an ordinary account, or an administrator's own program not run as administrator, needs an entry of its own (icacls "<folder>" /grant "<account>:(OI)(CI)RX"), which later runs keep. The Control Panel not run as administrator says Could not read the file on its live log page and its message-store check. An editor that saves hMailServer.INI by replacing the file gives it Bin's permissions again: run hMailServer.exe /ProtectFolders as an administrator after it (ServiceAccount.md, "What the other users of the computer may read").
    • The administrator's commands. hMailServer.exe's command lines (all but the service's own) no longer write to the error log or the Application log: what they did and why they failed is on their own output, so a script that read the error log after one reads the output instead. The store commands (--compress-store, --encrypt-store, --recount-store, --measure-store and the rest) and the object-store copies stop, naming it, when the data folder holds a junction, mount point or symbolic link that the administrators do not alone control: a junction made in the data folder, or at a drive's root, is refused until it is given permissions only the administrators may change (ServiceAccount.md, "What an administrator's command writes"). The grant Setup makes again at each upgrade of a service running as NT SERVICE\hMailServer goes through a junction on the way to Data, Logs or Database on the same terms, where it refused every one, and still refuses one the administrators do not alone control, naming who may change it, which fails the upgrade: give such a junction to the administrators first. On Linux such a command run as root first becomes the service's account, and refuses (exit 2), naming why, when the way to the data directory is not root's and its owner's alone; over a data directory root owns it runs on as root only where no other account could have put a link where it goes.
    • Installing by script. The installer now exits 10 when a step after its files did not complete and the database is as the earlier version left it, and 11 once its database step has changed the database; it exited 0. /GrantServiceAccess that cannot read the database ends in 7 unless an administrator confirmed.
    • The live update's trust is read from hMailServer.ini alone. UpdateSigningIdentity, UpdateSigningIssuer, UpdateSourceRepository, UpdateTrustRootsFile and UpdateLogPublicKeyFile are read from the file's [Settings] section, and COM and the REST API (409) refuse a change to them. Most servers set none of the five. One that set a signer of its own over REST, the Deck or the Control Panel puts it in the file and restarts the service; where several servers share a database, put it in every server's file before the first is upgraded.
    • Three settings left from 6.3.5's by-hand route. A server whose UpdateSigningIdentity, UpdateSigningIssuer and UpdateSourceRepository still name the project's first path refuses 6.3.6. Clear the three first, in the Control Panel, with DELETE /api/v1/settings/ini/<name> or on Linux with hmailserver --set-setting <name>=, not in the file, which 6.3.4 and 6.3.5 put back.
    • Behind a reverse proxy. The REST listener's loopback port now answers only localhost, an IP address, the server's host name and the host of each configured outside address of the webmail, and refuses any other Host with 421. If your proxy forwards the browser's own Host, set that name as the webmail's outside address (for example confidential_base_url) or as the server's host name before upgrading. The proxy must pass the Control Deck's page through unchanged.
    • Port 25. An upgraded server's SMTP listeners stay On and still take AUTH on port 25, so nobody is banned on the morning of the upgrade. The setup checklist's new item No password on port 25 says so: move clients that sign in on 25 to 587, then set port 25 to Honeypot or Off, on which the first AUTH bans the address. A new installation's port 25 is a Honeypot.
    • URI block lists. The SURBL test now asks each list about every domain a message links to, up to 200 - up to 256 DNS queries per list for a message with many links, where it was 16 - and a message whose links name more than 200 domains scores the new setting SurblTooManyDomainsScore, 5 by default, which is the stock mark threshold. A list's error answers are never a listing: a list of your own that answers 127.0.0.1 for a listing no longer tags anything - have it answer another address, such as 127.0.0.2. A sender list's URL entry written as a reversed address (1.2.0.192 for 192.0.2.1) no longer matches: write the address itself.
    • ManageSieve (off by default) is held to deadlines: a command line within 30 seconds, sign-in within 60, a literal 300. Before signing in an address has one connection served at a time, and a connection that runs out of time before signing in counts as a failed logon for the auto-ban (never from the loopback address). A signed-in session ends after ten idle lines in a row or two minutes of waiting in all, and an account has at most four sessions.
    • IP addresses written in text are read the same way on Windows as on Linux: four decimal parts, or IPv6 as RFC 4291 writes it. A value kept in an older form (192.168.1, 010.0.0.1, an address with a port) is read the new way from the first start: an API key's source restriction so written refuses the key from every address, a REST, web-services or SNMP bind address so written leaves that listener stopped, and an AutoBanNeverBan entry so written protects nothing (HM6524).
    • Webmail S/MIME. A correspondent's certificate is kept for encrypting replies only when its chain is trusted, under the message's From address, and a different one only when the reader chooses Keep this certificate. Certificates kept before the upgrade stay: review them on the webmail's Security page.
    • Windows, account retention. From 6.2.25 to 6.3.5 an account saved through a webmail's password or out-of-office plugin could have its retention overwritten: after upgrading, check the retention of the accounts whose holders use such a plugin.
    • The packaging Compose file runs PostgreSQL 18. If you take the new docker-compose.yml, move the PostgreSQL 16 data once, with a dump and a load (ContainerImage.md, "PostgreSQL 16 to 18, in the Compose file"); a deployment that keeps its own copy of the file keeps PostgreSQL 16.
    • A monitor that matches "The response carried no HTTP headers." needs the new sentence, which says who ended the connection, after how many bytes and seconds.

    Security

    Each of these was found by the project's own review, and each is fixed in 6.3.6 unless it says otherwise. Each links its work item, which gives the details, and the Security section of CHANGELOG.md says what changed; that file, as tagged for 6.3.6, names only the two Blowfish identifiers, and says "CVE requested" for the others; for the string replacement, the Sieve filter, the JSON reader and the Linux commands' error reports it gives other affected versions, and for the header unfolding, the SPF expansion and the Linux network waits it leaves out a way in, and there the entries here follow the corrections filed on their CVE requests after the tag was made.

    • CVE-2026-103011 (work item #49) - a heap buffer overflow in the encryption routine of the legacy Blowfish code of stored secrets, inherited from the original hMailServer, in every version up to 6.3.5. 6.3.6 replaces that code with the project's own.
    • CVE-2026-103010 (work item #49) - a heap buffer overflow in the decryption routine of the same code, in every version up to 6.3.3, fixed in 6.3.4, whose notes did not say so.
    • CVE-2026-104660 (work item #59) - on Windows, COM objects that carry no credential - a message, its attachments or a fetch account that a program creates itself, and the objects an Application handed out once a later Authenticate on it failed - were not refused what only a signed-in caller may do, so with an administrator password set a local Windows user with no hMailServer credential could queue mail, read and write files as the service's account, and attach a fetch account to any account; every version up to 6.3.5.
    • CVE-2026-104658 (work item #58) - on Linux, the live update's apply step, which runs as root, took the unit to stop and, for an AppImage, the verifying program from the request the service account writes, and once it had started the server again it wrote its log and its outcome by names through which a symbolic link that account planted could lead them elsewhere; 6.3.4 and 6.3.5.
    • CVE-2026-107578 (work item #71) - the commands an administrator runs elevated on Windows wrote by path into folders the service's account can change, and on Linux the store commands run as root followed links that account planted and every command run as root wrote its error reports into that account's log directory by name, so a program already running as the service's account could lead an administrator's process to a file of its choosing; on Windows 6.3.4 and 6.3.5, on Linux every version from 6.3.0 to 6.3.5.
    • CVE-2026-107573 (work item #77) - on Windows, the installer left the Data, Logs, Temp, Database and Events folders and hMailServer.INI with the permissions Program Files hands down, so every account that could sign in to the computer could read the mail, the logs, the event scripts and the database's password, which any account on the machine can unseal; every version from 6.0.0 to 6.3.5. The installer now makes them private to SYSTEM, the Administrators and the service, and on Linux the AppImage makes its folders 0700.
    • CVE-2026-104659 (work item #57) - the REST administration listener's loopback port answered a request whatever its Host, so a web page could reach the console through a browser on the same machine, and a wrong administrator password over REST from the loopback address was not slowed down; earlier versions. Such a request is now refused with 421, and a wrong password costs a growing delay of up to ten seconds.
    • CVE-2026-103647 (work item #52) - the webmail handed the browser an attachment it had decrypted itself (S/MIME or OpenPGP) under the type the message named; 6.3.2 to 6.3.5. It is now always a file the browser only saves.
    • CVE-2026-104704 (work item #61) - outbound DANE used DANE-EE records alone, so a host whose validated TLSA records were of another kind was delivered to as if it published none; every version up to 6.3.5. DANE-TA is now verified too.
    • CVE-2026-107584 (work item #64) - outbound DANE read a DNS lookup that did not come back whole as "unsigned", so whoever could disturb a recipient domain's DNS could take it out of DANE; every version up to 6.3.5.
    • CVE-2026-107586 (work item #62) - the REST listener's table of browser sessions dropped its least recently used session whoever held it, so one account holder signing in over and over signed out every webmail tab and other browser on the server that sat idle for a minute; 6.2.28 to 6.3.5, and the Control Deck with them from 6.3.0.
    • CVE-2026-107585 (work item #63) - the pending halves of single sign-on and passkey sign-ins, which anybody may start, were held the same way, so a client asking for sign-in starts a few times a second made other people's OpenID Connect, SAML and passkey sign-ins fail; 6.3.4 and 6.3.5. The browser now carries a pending sign-in, sealed.
    • CVE-2026-107587 (work item #66) - the webmail kept a stranger's S/MIME certificate for encrypting replies without a trust check and under an address the certificate chose; 6.3.2 to 6.3.5.
    • CVE-2026-107583 (work item #65) - the webmail's view of a message's HTML put its embedded images back in time growing with the square of the references, so one message could hold a REST worker for minutes; 6.3.2 to 6.3.5.
    • CVE-2026-107582 (work item #67) - the server's string replacement took time growing with the square of what it replaced. A message with an HTML part and no text part, full of entities, held the REST worker that listed its folder, or an IMAP thread, for minutes (the message list from 6.3.3, the page of a message that expires from 6.3.4, IMAP PREVIEW from 6.2.22); and the DMARC test, on by default, verifying a received message's DKIM signature whose tags held a great many spaces, held the thread that accepts the message for seconds to tens of seconds before the server answered, with nobody opening anything, so a stream of such messages stopped the server accepting mail; every version from 6.0.0 up to 6.3.5.
    • CVE-2026-107581 (work item #68) - parsing one IMAP FETCH from a signed-in account could hold an IMAP worker thread, shared with SMTP and POP3, for minutes and longer, and the sections a FETCH named of one message were all read and held before any was sent; every version from 6.0.0 up to 6.3.5.
    • CVE-2026-107579 (work item #70) - with bounce or complaint processing on, or a list the list manager runs, a returned report begun by very many blank lines held a delivery thread for a minute and more; 6.3.4 and 6.3.5.
    • CVE-2026-107580 (work item #69) - a header field with very many line breaks, read as text, held the REST worker or IMAP thread that read it for minutes, and the DMARC test, on by default, reads each received message's From that way, so such a From held the thread that accepts the message for seconds with nobody opening anything; reading a message's header from its file took seconds for a large header at each read; every version from 6.0.0 up to 6.3.5.
    • CVE-2026-107577 (work item #72) - removing a MIME header parameter whose value is empty and directly followed by a ; never ended, holding a worker thread at full load until the service was restarted - reached from one received message when the attachment blocker (not on by default) renames a blocked attachment, or when a filename is set over the REST API - and decoding many encoded words of an encoding other than base64 or quoted-printable, removing a parameter of many continuations, or deleting many header fields of one name took time growing with the square of their number; every version from 6.0.0 up to 6.3.5.
    • CVE-2026-107576 (work item #73) - verifying a received message's DKIM or ARC signatures took time growing with the square of its header, so a message with very many fields, or a field folded over very many lines, held a thread that serves delivery and SMTP for tens of seconds; every version from 6.0.0 up to 6.3.5.
    • CVE-2026-107575 (work item #74) - expanding a macro in a sender's own SPF record into a name too long to look up took time growing with the square of its length, so the SPF check - the SPF test's, or the DMARC test's, which is on by default - took several seconds; 6.3.4 and 6.3.5.
    • CVE-2026-107574 (work item #76) - the JSON reader took time growing with the square of an object's members. It reads the REST API's bodies and, where domain reports are on, a TLS report of up to 16 MB that anyone may mail in, on the delivery queue: a 4 MB report took about 300 seconds, and a few such reports stopped all delivery for over an hour each; 6.3.2 to 6.3.5 (the REST API's bodies from 6.3.2, the reports from 6.3.4).
    • CVE-2026-107572 (work item #75) - an account holder's own Sieve filter could hold the delivery threads every account shares: a :matches test backtracked over every length of every *, and deleteheader erased its fields one at a time; 6.2.22 to 6.3.5.
    • CVE-2026-103649 (work item #53) - on Linux, some network waits had no timeout - the MTA-STS policy fetch, the DANE TLSA query, the OAuth2 token request, the ACME client and its http-01 responder, and the ManageSieve and metrics listeners, and in 6.3.0 to 6.3.2 the server's own DNS resolver; 6.3.0 to 6.3.5.

    The same release fixes or hardens more, without a CVE request: more code that took time out of proportion to its input, in the calendar and IMAP LIST among others; calendar messages delivered by mail now change a stored event only from a sender the server verified (6.3.4 and 6.3.5 did not check); the Control Deck and the webmail are served under stricter page policies; attachments, files sent as links and contact photos keep their declared type only when no browser runs or renders it; ManageSieve serves its connections side by side and holds each to deadlines; a mailbox key and the stored-secrets key no longer stay whole in memory freed without being written over, as they could in 6.3.4 and 6.3.5; and more, listed in the release notes. The Windows installers carry OpenSSL 4.0.3 (CVE-2026-84783 and others) and libpq from PostgreSQL 18.6, and event scripts on Linux run in QuickJS 2026-06-04 (CVE-2025-62494, CVE-2025-62493, CVE-2025-62492). Upgrade every server running 6.3.5 or earlier.

    Upgrading

    • By the live update, from 6.3.4 or 6.3.5. Every file of 6.3.6 is signed as this release's pipeline at the project's group path, https://gitlab.com/hmailserver/hmailserver//.gitlab-ci.yml@refs/tags/v6.3.6, with the project's id, 86730559, in the certificate. Every server from 6.3.4 on has that signer compiled in, so one installed from the x64 installer or the release's x86-64 .deb or .rpm is built to install 6.3.6 by its live update: from 6.3.5 with 6.3.5's own file as its rollback image, and from 6.3.4, which carries no Sigstore bundle, without one. No live update had installed a release signed at the group's path when this was written. On the Control Panel's Status page: Check for updates, Download update, Install update.
    • The update is applied by the version already installed, so what 6.3.4 and 6.3.5 do still holds for it. On Windows, a service running as NT SERVICE\hMailServer downloads and verifies the installer, then leaves the install to an administrator (HM7463) - download hMailServer-6.3.6-x64.exe from the release, check that Get-AuthenticodeSignature says Valid for CN=Progressive Robot Ltd, and run it as an administrator, keeping the service account on the installer's Service account page. From 6.3.6 on, Install update in the Control Panel on the server installs the next release with one Windows prompt.
    • On Linux, install 6.3.6 with your package manager rather than by the live update. The live update to 6.3.6 is applied by the apply step of the version it replaces, the one fixed above. Use apt, dnf or zypper, or turn the apply off until then with systemctl disable --now hmailserver-update.path (the check and the download go on). From 6.3.6 its own helper applies the next release. A backup destination inside /var/lib/hmailserver fails the backup an unattended apply takes on 6.3.4 and 6.3.5 (HM5014).
    • On Fedora and Enterprise Linux, every .rpm requires glibc's extra character-set converters, glibc-gconv-extra, which dnf installs with it; a server without them whose dnf has no repository enabled (an unregistered RHEL, say) has the update refused until glibc-gconv-extra is installed. On openSUSE they are recommended (glibc-gconv-modules-extra), and zypper installs them unless solver.onlyRequires is on. Without them the server converts no text in BIG5, ISO-2022-JP, Windows-1251 or ISO-8859-2, and from 6.3.6 it says so at its start.
    • By hand, from 6.2.28 to 6.3.3, and from 6.3.3's AArch64 packages or AppImages. On Windows run hMailServer-6.3.6-x64.exe over the existing installation; on Linux install the package with apt or dnf, or replace the AppImage with 6.3.6's. Until then keep UpdateAutoDownload off on such a server, or it downloads the installer at every check and refuses it.
    • A server from one of 6.3.6's per-distribution packages is offered the next release's generic package by its live update, which apt refuses on Debian 12 and dnf on Enterprise Linux 9. There, upgrade with the package manager and your release's own package of the next version.

    What else changes on upgrade

    The 6.3.6 section of CHANGELOG.md lists everything under "What changes on upgrade without a switch". The rest, in short:

    • Spam checks: the MX-record test and the SURBL test cut host names by the Public Suffix List compiled into the server, so a sender at a public suffix itself with no MX (github.io, co.uk) now fails the MX test; the SURBL test reads a link's host as a browser does; tlds.txt is removed.
    • Backups leave out the live update's Updates folder, and a destination inside the data directory works; up to 6.3.5 it failed every backup. A message deleted while a backup copies the data directory no longer fails the backup.
    • A full restore of messages, which failed on every installation made new with 6.3.4 or 6.3.5 and left the mail in the temp folder alone, copies the archive's store in first and removes what the archive does not hold only after. It keeps this installation's own self-signed certificate and key when the archive's key is not this installation's, so a mail client that accepted the other server's certificate asks again. If a restore failed this way, the archive is as it was: upgrade, restore again from it, then delete the staged copy its HM5014 line names. On Linux a full restore from 6.3.0 on also deleted the key the stored secrets are sealed under, which no archive carries (from 6.3.4 the server then says HM7495 at each start) - import the stored-secrets key from its export (Backup.md, "How a restore replaces the data directory").
    • More web requests go through HttpProxy when it is set: the OAuth2 token, the MTA-STS policy, ACME, brand logos, Web Key Directory, Web Push, one-click unsubscribe and an inbound webhook route held to public addresses. On Windows a listener whose port another program holds now fails to bind and says so.
    • Calendars: a cancellation of some occurrences of a series takes those out of a guest's calendar and leaves the rest.
    • The live update keeps its outcome after the start, tries a failed scheduled check again once ten minutes later, and keeps a verified installer across a restart instead of fetching it again.
    • What the auto-ban put below the server (the Linux firewall hook, AutoBanCommand) is lifted after a stop too, and Windows' uninstaller removes the auto-ban's firewall rules.
    • On Linux the backup and event logs are UTF-8, converted in place the first time; Windows keeps UTF-16LE. The .deb and .rpm require ca-certificates.
    • Sign-in limits: an account, or the administrator, holds at most fifty REST browser sessions, and a pending single sign-on or passkey sign-in is carried by the browser, sealed, so no number of starts can push anybody's out.
    • Text in the Control Panel can be selected and copied on every page and dialogue (work item 48); where the keyboard is shows in one violet in the Control Panel, the Deck and the webmail.
    • An error reported where the settings hold no scripting switch (UseScriptServer - a database without that row) is logged and fires no event; in every version up to 6.3.5 it reported the missing setting again and again until the reporting thread's stack ran out, taking the service with it.
    • Scripting off runs no script engine. The project's address is gitlab.com/hmailserver/hmailserver in the Control Panel's links, security.txt, the systemd units and the packages.

    Also new

    • A never-ban list by reverse name (work item #56) - spare a provider whose outbound hosts share a reverse name from every auto-ban, checked forward and back.
    • Port 25 takes no password: each SMTP listener's AUTH is On, Off or Honeypot (work item #54).
    • An auto-ban can be widened to its reverse-name neighbours in the same /24, off by default (work item #55).
    • A HELO name or a sender's domain that is not a name can be refused, two settings, off by default (work item #51).
    • One-click install of an update from the Control Panel on a Windows server whose service is not an administrator.

    What the release carries

    62 files, each with its Sigstore bundle, <file>.cosign.bundle, beside it:

    • Windows: hMailServer-6.3.6-x64.exe, and hMailServer-6.3.6-arm64.exe for Windows on ARM, both Authenticode-signed. The ARM64 installer is a preview: it is cross-compiled on the project's x64 Windows runner and has never run on ARM64 hardware. SQL Server Compact has no ARM64 build, so a new ARM64 installation is set up against SQL Server or PostgreSQL, and a silent one is given its database on the command line (WindowsOnArm.md). If you install it on an ARM64 machine, please say how it went, working or not, in an issue - the project has no ARM64 machine of its own.
    • Linux, x86-64 and AArch64: the generic hmailserver_6.3.6_amd64.deb, hmailserver_6.3.6_arm64.deb, hmailserver-6.3.6-1.x86_64.rpm and hmailserver-6.3.6-1.aarch64.rpm, the names an installed server's update check asks for; and each Debian 12 and 13, Ubuntu 24.04, Fedora 44 and 43, Enterprise Linux 10 and 9, openSUSE Leap 16.0 and Tumbleweed release's own package for both architectures. The AArch64 files are cross-compiled and tested under emulation: no AArch64 machine has run them.
    • The AppImages, hMailServer-6.3.6-x86_64.AppImage and hMailServer-6.3.6-aarch64.AppImage, with the project's own AppImage runtime, and beside them the source of the libraries they carry and of those their runtime links, as their licences ask.
    • The source tarball, hmailserver-6.3.6.tar.gz, reproducible and with nothing non-free in it; the Helm chart, hmailserver-chart-6.3.6.tgz; and the PowerShell module, HmailServer.psd1 and HmailServer.psm1, Authenticode-signed.
    • An SBOM for each compiled file and the tarball, <file>.cdx.json, and the source tree's two; hmailserver-linux-6.3.6-SHA256SUMS.txt, the SHA-256 of every Linux file; and hmailserver-6.3.6.intoto.sigstore.json, SLSA v1 build provenance that names every file by its SHA-256.

    The container image, the first at GitLab's registry: registry.gitlab.com/hmailserver/hmailserver:6.3.6, also tagged 6.3 and latest, one index over linux/amd64 and linux/arm64, each built from this release's .deb of its architecture and signed with cosign as this release's pipeline, with its SBOM attested to it. In the container the update check names the image to pull and installs nothing (ContainerImage.md).

    Also in the tree, not yet published anywhere: a Nix flake of the project's own with a NixOS module, an APKBUILD and an OpenRC service for Alpine Linux, on whose musl the server now builds and runs, and a snap. They are built without the live update and name the command that updates them; none is in a distribution's archive or store yet.

    https://updates.progressiverobot.com/download/ leads to the newest stable release's page, and /download/hMailServer-x64.exe, /download/hMailServer-arm64.exe, /download/hmailserver_amd64.deb, /download/hmailserver_arm64.deb, /download/hmailserver.x86_64.rpm, /download/hmailserver.aarch64.rpm, /download/hMailServer-x86_64.AppImage and /download/hMailServer-aarch64.AppImage to that file of it; add .cosign.bundle for its bundle.

    How to check a download

    With cosign and OpenSSL, with the file and its bundle beside you:

    cosign verify-blob --bundle hMailServer-6.3.6-x64.exe.cosign.bundle \
      --certificate-identity 'https://gitlab.com/hmailserver/hmailserver//.gitlab-ci.yml@refs/tags/v6.3.6' \
      --certificate-oidc-issuer https://gitlab.com hMailServer-6.3.6-x64.exe
    jq -r .verificationMaterial.certificate.rawBytes hMailServer-6.3.6-x64.exe.cosign.bundle \
      | base64 -d | openssl x509 -inform DER -noout -text | grep -A1 1.3.6.1.4.1.57264.1.15
    

    The first must say Verified OK, and the second print ..86730559, the project's own id, which cosign does not check: the identity is a path, and a path could pass to another project were the group or the project renamed. 6.3.5, signed before the move, names https://gitlab.com/Progressiverobot/hmailserver//.gitlab-ci.yml@refs/tags/v6.3.5 instead. If your cosign has the --new-bundle-format option and does not use it by default, add it. Each file but a compiled file's SBOM also has its bundle a second time as <file>.sigstore.json; either name verifies the same way.

    To check that a file is one this release's pipeline built, against its build provenance:

    cosign verify-blob-attestation --new-bundle-format \
      --bundle hmailserver-6.3.6.intoto.sigstore.json --type slsaprovenance1 \
      --certificate-identity 'https://gitlab.com/hmailserver/hmailserver//.gitlab-ci.yml@refs/tags/v6.3.6' \
      --certificate-oidc-issuer https://gitlab.com hmailserver_6.3.6_amd64.deb
    

    It says Verified OK only when the file's SHA-256 is one the provenance names. Then:

    • sha256sum -c --ignore-missing hmailserver-linux-6.3.6-SHA256SUMS.txt must say OK for each Linux file you downloaded.
    • On Windows, Get-AuthenticodeSignature on either installer must answer Valid, with a signer certificate for CN=Progressive Robot Ltd. The x64 installer's published SHA-256 is 2f673913e5f127d688090e98f6001ca567cd45560d452aebc74421b5533cfe53.
    • In a clone, git -c gpg.ssh.allowedSignersFile=.gitlab/allowed_signers verify-tag v6.3.6 must report a good signature by the one key that file lists.
    • For the image, ContainerImage.md, "Checking an image", gives the cosign verify command and the check of the project's id.

    The release's own notes, under Verification, give each file's SHA-256 and the certificate the pipeline was given. SECURITY.md, "Verifying a release", "Build provenance" and "Software bills of materials", has the rest.

    How it was checked

    The tag's pipeline (https://gitlab.com/hmailserver/hmailserver/-/pipelines/2914690858) ran every gate before anything was published: the Windows suite on the project's Windows runner, 4,110 tests, 4,031 passed, 0 failed, 78 skipped and 1 inconclusive; the Linux suite on the project's Linux runner, 2,409 tests, 2,066 passed, 0 failed, 343 skipped; the rebuild of the x86-64 .deb and .rpm byte for byte; the install and start of every Linux package in a clean container of its release, the AArch64 ones under emulation; the static analysis, Semgrep and the dependency scan. It then checked every signature with the server's own verifier. The signed installer went through the installer smoke test: an upgrade from 6.3.5 passed 93 checks and a new installation 59, none failed.

    Known issues

    • The ARM64 installer has never run on ARM64 hardware (above), and no ARM64 Windows server has a live update to 6.3.6, since no release before it carried the ARM64 installer; from 6.3.6 one finds its own installer by name, and an x64 server is never offered it.
    • No channel publishes it yet. The apt and dnf repositories, Docker Hub, Quay.io, the AUR, the Ubuntu PPA, Copr, the openSUSE Build Service, Chocolatey, the Snap Store, PyPI and the PowerShell Gallery publish from master once their keys and accounts exist; none is live as this release is made (Channels.md).
    • An AppImage on Fedora, Enterprise Linux or openSUSE runs on the host's glibc and cannot require its extra character-set converters: install glibc-gconv-extra (Fedora, EL) or glibc-gconv-modules-extra (openSUSE) by hand; the server says when they are missing.

    Releases pause after this one

    6.3.6 is the last release for the time being, by the owner's decision of 28 September 2026, and no feature release follows it until the maintainers say otherwise in SECURITY.md, "While releases pause". A confirmed vulnerability still ships, in a release of its own that is 6.3.6 with fixes - 6.3.7, 6.3.8 and so on: a critical or high one as soon as its fix has passed the gates, and none held past 90 days. Other defects are fixed on master and ship with the next security release, or when releases resume. The 6.3 line receives security fixes until 30 September 2027; before that date the maintainers write in SECURITY.md whether support continues, and if nothing is written, it ends then. There are still no maintenance branches: an installation of 6.3.5, 6.2 or anything older is upgraded in place to the newest release. To hear of a security release, switch the server's update check on (UpdateCheckEnabled), or follow the releases' feed.

    Reporting a vulnerability

    Not in a thread here, and not in a public issue. Report it privately, as SECURITY.md says: a confidential issue on GitLab - check that it is still marked confidential before you submit it, and choose the Security template - or an email to contact-project+hmailserver-hmailserver-86730559-issue-@incoming.gitlab.com, which GitLab files as a confidential issue, so no GitLab account is needed.

    Release notes, checksums and downloads · Newest stable release


  • hMailServer 6.3.5: the first release built and signed by its GitLab pipeline, and the quarantine grouped by domain and HELO
    chrisC chris
    Announcements & releases release schema upgrade

    This release is superseded by hMailServer 6.3.6, published on 6 October 2026, which fixes security flaws in every earlier version, 6.3.5 included. Read its announcement before upgrading.

    hMailServer 6.3.5 was published on 29 September 2026. It is the first release the project's GitLab CI made from its signed tag. The tag's pipeline built the Windows installer after the whole Windows suite had passed, signed it with Authenticode, signed every file of the release with Sigstore, and checked every signature with the server's own verifier before anything was published. A 6.3.4 server trusts that signer, and a 6.3.4 server has installed 6.3.5 by its own live update. The release also fixes two defects 6.3.4 has, and lets an administrator review the quarantine by the sender's domain and the HELO name. The schema moves from 6104 to 6105 in one step.

    Who is affected

    • Every server on 6.3.4. Two of its defects are fixed:
      • A mail flow rule with a Readable text or Sensitive content found condition, which 6.3.4 added, read a message's HTML part in time that could rise with the square of its size. 400,000 &amp; - two million characters - held the delivery for about a minute, and on a server with such a rule anybody could send one. Each entity is now unwrapped in one pass, with the same result. A server with no such rule was not affected.
      • An invitation whose calendar part carries parameters in its Content-Type and has no .ics name - the shape Outlook sends - was never marked as an invitation, so the webmail showed no card for it. It now shows the card with Accept, Maybe and Decline.
    • A server older than 6.3.4 gets everything 6.3.4 brought as well, including the fix for CVE-2026-100741. Read the 6.3.4 announcement first: all of its "Before you upgrade" applies.

    Before you upgrade

    • Back up the database and the data directory first. The schema goes from 6104 to 6105 in one one-way step, which adds a column to the quarantine's table, hm_quarantine.quarantinehelo. From 6.3.3 or older the upgrade runs 6.3.4's steps first, and 6.3.4's notes apply: on MySQL and MariaDB, step 6102 rebuilds every table as utf8mb4, and at the first start the [Settings] section of hMailServer.ini moves into the database.
    • A server from 6.2.28 to 6.3.3 cannot install 6.3.5 by its live update. It trusts only the GitHub workflow that signed the releases up to 6.3.3, and it refuses a file the GitLab pipeline signed: "The certificate names https://gitlab.com/Progressiverobot/hmailserver//.gitlab-ci.yml@refs/tags/v..., not this repository's release workflow." Nothing is installed and the server runs on. What to do:
      • Install 6.3.4 or 6.3.5 by hand, once. On Windows run hMailServer-6.3.5-x64.exe over the existing installation; on Linux install the .deb or the .rpm with apt or dnf. After that the server reads the new feed without being told and trusts both signers.
      • Until then, keep UpdateAutoDownload off. With it on, such a server downloads the whole installer, 84 MB, at every check and refuses it every time, since the verification comes after the download.
      • Its update check works only once it is pointed at the new feed: under [Settings] in hMailServer.ini, UpdateFeedUrl=https://updates.progressiverobot.com/releases.json, then restart the service.
      • On Windows only, there is a second way: three settings that make the old server trust the GitLab signer. They cost the rollback image, must be cleared afterwards in the Control Panel or over REST (not in the file), and must never name the group path hmailserver/hmailserver. UpdateFeed.md, "Having the live update make that upgrade anyway", gives the values and the costs. Installing by hand is simpler.

    The live update from 6.3.4

    A 6.3.4 server reads https://updates.progressiverobot.com without being told, and trusts the identity the GitLab pipeline signs with; that verifier is unchanged in 6.3.5. On the Control Panel's Status page: Check for updates, Download update, then Install update; or POST /api/v1/update/install over REST, or Status.InstallUpdate over COM. With UpdateAutoDownload on and an update window open, the server does it by itself.

    It was tried on 29 September 2026 on a clean Windows Server 2025, against the published release and the live feed:

    • A service running as LocalSystem found 6.3.5, downloaded and verified it, took its backup and installed it. The schema went from 6104 to 6105, mail was unavailable for about 24 seconds, and the domain, the account, its messages and the settings were intact. A server upgraded to 6.3.4 that kept LocalSystem runs this way.
    • A service running as NT SERVICE\hMailServer does not install it itself. That is how a new 6.3.4 installation runs the service. Such a server found, downloaded and verified 6.3.5, then logged HM7463 and left the install to an administrator. Download the installer from the release, check that Get-AuthenticodeSignature says Valid, and run it as an administrator - not the copy the server downloaded, which is in a folder the service can write.
    • There is no rollback image for 6.3.4. Before it installs, the server fetches and verifies the installer of the version it runs, to put it back if the new one does not start. 6.3.4 carries no Sigstore bundle, so that copy cannot be verified, and the application log says "Update: no rollback image for hMailServer 6.3.4 could be had (release 6.3.4 carries no x64 installer with a Sigstore bundle.); if 6.3.5 does not start, it will need a manual reinstall." Take the backup first.
    • On Linux the live update was not part of that test. A server installed from the release's own amd64 .deb or x86-64 .rpm is offered the same file of 6.3.5. A server installed from a .deb or .rpm the CI builds for another distribution release is offered the release's file too, whose dependencies its distribution may not meet; apt or dnf then refuses it and the server stays as it was. One installed from an AArch64 package, an AppImage or the ARM64 installer is told that the release carries nothing for it to download.

    The test found three defects in code 6.3.4 and 6.3.5 share, to be fixed in 6.3.6: the outcome of an update is dropped by the check that runs one second after start-up, so Status.UpdateApplyOutcome is empty though the log has it; a first check on a new machine can fail with "The response carried no HTTP headers", which hides the real cause (on the test machine, probably a slow first certificate revocation check); and a service that cannot install downloads the installer again after every restart.

    What changes on upgrade without a switch

    The 6.3.5 section of CHANGELOG.md lists five.

    • The Control Panel's sidebar is in a new order. Welcome and Dashboard come first, then a new group, Set up this server: the Setup checklist (it was External setup, under Monitoring & troubleshooting), Setting profiles and DNS records. TLS & certificates is now Certificates & encryption, and Access & abuse protection is Sign-in & access. Connections & protocols has a new Webmail page. Ctrl+K still finds the checklist as External setup. A page's nav-<key> UI Automation id is unchanged; the navgroup- and navrail- ids of the new and renamed groups follow their new headings, so a UI test that finds a group by its old id must be changed.
    • The quarantine shows the HELO name, and groups. The Control Panel's Quarantine page and the Control Deck's Quarantine view have a HELO column and group held messages by the sender's domain unless told otherwise. Messages held before the upgrade have no HELO name recorded. The Deck now asks before a delete with a Yes or No of its own whose default is No; it used the browser's confirm(), whose default is OK. It offers whitelist and blacklist only to a credential holding manage_settings, and a held message's headers and preview only to one holding view_mailbox, as the server requires.
    • The webmail's keyboard. The message list is one Tab stop, and its keys reach what a row holds. Enter on a button in the mail view presses the button; it used to open the message under the list's cursor. A letter typed into the formatted signature is text, where c opened a new message. Escape closes every modal dialogue as its Cancel does. The compose window's Plain is Remove formatting.
    • Invitations. GET /api/v1/me/messages/{id} answers "invitation": true for the Outlook-shaped invitation above, where it answered false.
    • What a script sees. GET /api/v1/quarantine gives each message three more fields - helo, sender_domain and helo_domain - and four routes are new. Over COM, Quarantine gains Bulk and QuarantinedMessage gains HeloName, SenderDomain, HeloDomain, ReadHeaders and ReadPreview, added to the existing interfaces; no existing member or dispid changes. A program built against 6.3.5's type library that calls one of them needs a 6.3.5 server.

    Also in this release

    • Reviewing the quarantine: grouping by the sender's domain, by the HELO name's domain or not at all; release, delete, whitelist then release, and blacklist then delete, on one message, a group or the checked ones, with a dry run first; and a held message's headers and a plain-text preview read without releasing it. The Control Deck does the same as the Control Panel (SenderListsAndDigests.md).
    • Every database setting that should have an editor has one in the Control Panel: 137 that needed one and had none, on new tabs and on the new Webmail page. 103 of them are reached over the REST API alone, which is off as shipped (RestApiPort 0); with it off, each such tab says so.
    • The Control Panel and the webmail, audited in both themes, by keyboard and, for the webmail, with NVDA in English and German: contrast raised where it fell short, focus rings restored, and 82 texts that were English on a translated webmail page are now in all 23 languages.
    • The packages for Debian, Ubuntu, Fedora, RHEL and openSUSE, for x86-64 and AArch64, the AppImages and both Windows installers are built on GitLab CI, on the project's own runners. Only the files listed below are in the release; the others are CI job artifacts, kept for 7 to 30 days, not signed and not offered by the update feed.
    • Reproducible Linux packages: the server, the .deb and the .rpm are built a second time from a copy of the tree at another path, and the release waits until all three are byte for byte the same.

    How it was checked

    Every gate of the tag's pipeline passed: the Windows suite on the project's Windows runner, 3,828 tests, 3,753 passed, 0 failed, 74 skipped and 1 inconclusive; the Linux suite on the project's Linux runner, 2,213 tests, 1,892 passed, 0 failed, 321 skipped; linux-repro, which rebuilt the .deb and the .rpm byte for byte; the static analysis, Semgrep and the dependency scan. The signed installer then went through the installer smoke test on a clean Windows Server 2025: an upgrade from 6.3.4 passed 93 checks and a new installation 59, none failed.

    No ARM64 Windows installer in this release

    The pipeline has a job that builds the ARM64 installer, and it may fail without failing the pipeline. In 6.3.5 it fails: its toolchain check looks for Visual Studio's ARM64 C++ runtime by a path that finds it in no installation, so it stops on the Windows runner, which has the ARM64 tools, ATL and SDK libraries, and prints a command that changes nothing. The check is corrected for the next release. Even then, the ARM64 installer is a CI job artifact only, not signed and not in the release, and the ARM64 build has never been run on ARM64 hardware (WindowsOnArm.md).

    What 6.3.5 does not carry

    • No ARM64 Windows installer (above).
    • No AArch64 .deb or .rpm, no AppImage and no SLSA provenance. The pipeline builds the AArch64 packages and the AppImages as CI job artifacts only, and the provenance generator the releases up to 6.3.3 used is GitHub's. 6.3.3's AArch64 packages and AppImages are still the newest published. 6.3.6 is to carry all three.
    • No container image. registry.gitlab.com/progressiverobot/hmailserver is empty: the pipeline pushes and signs the image only once the project has moved to the group hmailserver and the owner has switched it on.
    • No apt or dnf repository yet: the job that makes them publishes nothing until the repository's signing key exists (PackageManagers.md).
    • Not in winget or Chocolatey yet: the first submission to each is made by hand, and has not been made.

    Downloads, and how to check them

    The release carries nine files, each with its Sigstore bundle, <file>.cosign.bundle, beside it:

    • hMailServer-6.3.5-x64.exe, the Windows x64 installer; hmailserver_6.3.5_amd64.deb for Ubuntu 26.04 and 24.04, and hmailserver-6.3.5-1.x86_64.rpm for Fedora 43 and 44 and Enterprise Linux 10. Their dependencies are 6.3.4's: the .deb asks for glibc 2.38 or later, so it does not install on Debian 12, and the .rpm does not install on Enterprise Linux 9.
    • An SBOM for each of those three, <file>.cdx.json (CycloneDX 1.6), whose subject is that file by its SHA-256 and SHA-512; and the source tree's SBOMs, hmailserver.spdx.json and hmailserver.cyclonedx.json.
    • hmailserver-linux-6.3.5-SHA256SUMS.txt, the SHA-256 of the two Linux packages.

    There is no SSH-signed sums file this time: the pipeline cannot hold the key that signs the release tags, so every file is signed with Sigstore instead.

    https://updates.progressiverobot.com/download/hMailServer-x64.exe, /download/hmailserver_amd64.deb and /download/hmailserver.x86_64.rpm always lead to that file of the newest stable release, never a pre-release's; add .cosign.bundle for its bundle. https://updates.progressiverobot.com/download/ leads to that release's page.

    To check a download with cosign, with the file and its bundle beside you:

    cosign verify-blob --bundle hMailServer-6.3.5-x64.exe.cosign.bundle \
      --certificate-identity 'https://gitlab.com/Progressiverobot/hmailserver//.gitlab-ci.yml@refs/tags/v6.3.5' \
      --certificate-oidc-issuer https://gitlab.com hMailServer-6.3.5-x64.exe
    

    It must succeed (exit status 0). The identity names the tag, so a file signed for another release does not pass. If your cosign has the --new-bundle-format option and does not use it by default, add it: the release's own signing job passes it wherever cosign offers it.

    On Linux, a server from 6.3.4 on makes the same check its live update makes:

    hmailserver --verify-update hmailserver_6.3.5_amd64.deb
    

    with hmailserver_6.3.5_amd64.deb.cosign.bundle beside the file. It takes any file of the release; the release's pipeline ran it on every one before publishing. It answers hmailserver_6.3.5_amd64.deb verifies: signed by https://gitlab.com/Progressiverobot/hmailserver//.gitlab-ci.yml@refs/tags/v6.3.5, recorded by the transparency log at ... and exits 0, and exits 1 for a file that does not verify. It does not check which release the file belongs to, so read the identity it prints: it must end in @refs/tags/v6.3.5.

    Then:

    • sha256sum -c hmailserver-linux-6.3.5-SHA256SUMS.txt must say OK for each package (add --ignore-missing when you downloaded only one).
    • On Windows, Get-AuthenticodeSignature .\hMailServer-6.3.5-x64.exe must answer Valid, with a signer certificate for CN=Progressive Robot Ltd.
    • In a clone, git -c gpg.ssh.allowedSignersFile=.gitlab/allowed_signers verify-tag v6.3.5 must say Good "git" signature for [email protected].

    The release's own notes, under Verification, give each file's SHA-256 and the certificate the pipeline was given. SECURITY.md, "Verifying a release" and "Software bills of materials", has the rest, including how to check that an SBOM describes your file.

    Reporting a vulnerability

    Not in a thread here, and not in a public issue. Report it privately, as SECURITY.md says: a confidential issue on GitLab - check that it is still marked confidential before you submit it, and choose the Security template - or an email to contact-project+hmailserver-hmailserver-86730559-issue-@incoming.gitlab.com, which GitLab files as a confidential issue, so no GitLab account is needed.

    Release notes, checksums and downloads · Newest stable release


  • hMailServer 6.3.4: a password could run code on Windows servers with JScript scripting
    chrisC chris
    Announcements & releases release security-advisory security schema upgrade

    A password could run code inside the server (CVE-2026-100741, assigned through GitLab's CNA; the CVE record was not yet published when this was posted). On Windows, with event scripting switched on, the script language set to JScript and an OnClientValidatePassword handler in EventHandlers.js, any client that could reach a sign-in - SMTP AUTH, POP3, IMAP or anything else that checks an account's password - and name an existing, active account could have JScript of its own run inside hMailServer.exe, with the rights of the service's account, before it had authenticated. Before 6.2.25 that script could create any COM object, and from 6.2.25 it could with ScriptAllowedObjects at its shipped *, WScript.Shell among them, and so run any command the service's account may run. 6.3.4 fixes it. The flaw is in every release from 6.0.0 to 6.3.3: the escaping was checked at every one of those tags (GitLab issue 27). Treat any server older than 6.3.4 with event scripting on and JScript as its language as affected.

    Who is affected

    Only a Windows server whose administrator switched event scripting on. Scripting is off as shipped, the shipped language is VBScript, and no EventHandlers.js is installed.

    • Through a password, a server whose script language is JScript and whose EventHandlers.js has an OnClientValidatePassword handler.
    • The same flaw was open to a remote POP3 server through the UID it answers, on a JScript server with an OnExternalAccountDownload handler, and to a remote mail server through the error text it refuses a delivery with and the failed recipient's address, on a JScript server with an OnDeliveryFailed handler.
    • A rule's Run function action wrote its function name into the call unescaped, in either language, so VBScript servers too. On a server with scripting on, whoever may edit a rule, a domain's own administrator included, could run code in the server's process.
    • VBScript servers were not open through a password, a UID or an error text. The Linux builds before 6.3.4 had no script engine.

    The server built each handler call as source text and escaped the apostrophe but not the backslash before it. Every JScript value is now escaped in one helper, and a rule's function name must be a plain identifier: ASCII letters, digits, _ and $, not starting with a digit. On Windows any other name is refused as HM5018 each time the rule fires; on Linux, whose JavaScript engine looks a handler up by name instead of building a call, such a name finds no function and nothing is run (EventScripts.md).

    Until you can upgrade, switch event scripting off. A server that cannot do without its scripts should take the OnClientValidatePassword, OnExternalAccountDownload and OnDeliveryFailed handlers out of a JScript EventHandlers.js and reload the scripts, and, in either language, let nobody but the server administrator make or edit a rule with a Run function action.

    Before you upgrade

    • Install 6.3.4 by hand, on every server. The Windows installer is Authenticode-signed by Progressive Robot Ltd through Azure Artifact Signing, but the release carries no Sigstore bundle, so a server's live update, of any version, that is offered 6.3.4 says it cannot be verified and downloads nothing. On Windows run hMailServer-6.3.4-x64.exe over the existing installation; on Linux install the .deb with apt on Ubuntu 26.04 or 24.04, or the .rpm with dnf on Fedora 43 or 44 or Enterprise Linux 10. The .deb needs glibc 2.38 or later, so it does not install on Debian 12, and the .rpm does not install on Enterprise Linux 9.

    • A silent upgrade of a server with an administrator password needs it, as before: /adminpassword=<password>, or, new in 6.3.4, the environment variable HM_ADMIN_PASSWORD, set in an elevated prompt, because it does not cross the UAC prompt. A password with a double quote goes in the variable: Inno Setup drops every double quote from its command line. The installer now hands the password to the database tools in that variable too. It used to put it on their command lines unquoted, so a password with a space, a double quote or backslashes before one failed the database step with exit code 3.

    • Back up the database and the data directory first. The schema goes from 6040 to 6104 in 64 one-way steps. On MySQL and MariaDB, step 6102 converts every table to utf8mb4 and rebuilds each one, which takes time on a large database. It needs MySQL 5.7.9 or MariaDB 10.2.2 or later - on an older server the upgrade stops at step 6041 with error 1071 and changes nothing - and the ALTER privilege on the database. Two rows the new collation no longer tells apart stop it with error 1062 until one of them is removed; a step stopped part of the way is finished by running it again. Step 6101 adds two columns to hm_messages, which has a row for every stored message, and on a large store is not instant on every backend.

    • The database becomes the settings store. At the first start the [Settings] section of hMailServer.ini is taken into the database. A line edited after the old server last started, including one edited to prepare the upgrade, is put back, so make such a change after upgrading. From then on a line edited in the file is ignored and put back (HM5804😞 change settings in the Control Panel, over COM or REST, or on Linux with hmailserver --set-setting NAME=VALUE.

    • A server from 6.2.28 to 6.3.3 still looks for updates at GitHub, which has answered 404 since 18 September 2026. For as long as it stays on that version, add this under [Settings] in its hMailServer.ini and restart the service, and its update check works again:

      UpdateFeedUrl=https://updates.progressiverobot.com/releases.json
      

      Keep UpdateAutoDownload off on such a server until it has been upgraded by hand. Once 6.3.4 is installed the server reads https://updates.progressiverobot.com without being told (the stable channel at /releases/latest), and the line can then be cleared in the Control Panel or over REST, not in the file.

    • Linux packages for 6.3.4 are x86-64 only: a .deb and an .rpm. The AArch64 packages and the AppImages were last published with 6.3.3. Windows on ARM compiles but has never run, and there is no ARM64 installer.

    What changes on upgrade without a switch

    The 6.3.4 section of CHANGELOG.md lists 24 such changes. These are the ones most servers meet.

    • SPF follows RFC 7208: mail from 127.0.0.0/8 and ::1 no longer passes unconditionally.
    • The audit trail and the alerts are on, though nothing is mailed until AlertRecipient and AlertSenderAddress are set. Compromised-account detection runs in watch mode and holds nothing. A destination that answers 421 or a rate-limit code is paused, for 2 minutes at first and up to an hour (OutboundBackoffMinutes, OutboundBackoffMaxMinutes).
    • MySQL and MariaDB connections use TLS whenever the database server offers it, without checking the certificate, and connect without it when it offers none. SQL Server sessions through MSOLEDBSQL 18 or SQL Native Client are encrypted whole, and tried once more without encryption when the failure reads as TLS unless TlsMode is require or verify-full; through SQLOLEDB, which the server uses where MSOLEDBSQL 18 or later is not installed and no failover partner is set, only the login is encrypted unless [Database] TlsMode is require or verify-full. verify-full checks the certificate. PostgreSQL is unchanged. The application log says at every start what the connection got (DatabaseTls.md).
    • The administrator password is hashed again as PBKDF2 at the first administrator sign-in, and a browser session made under the old hash ends once. Where the service cannot write hMailServer.ini (the Linux packages, or a Windows service moved to NT SERVICE\hMailServer), the old value stays, HM7494 is logged once, and you set the password again with --set-admin-password. The Windows installer now writes it as PBKDF2 itself.
    • A password hash stored before 6.3.4 of a password with a character above U+00FF is refused, and the application log names the account: that hash was made of NUL bytes on Windows or question marks on Linux, and any other password of that form opened it. Set such a password again, and soon: until then a SCRAM-SHA-256 client that derives its key from those NUL bytes or question marks still opens the PBKDF2 hash, and on Linux the password with ? in place of each such character still opens the account. ASCII and Latin-1 passwords sign in as before.
    • A one-time code is taken once. A script that sent the administrator's password and a code with every REST request should sign in once (POST /api/v1/session) or use an API key; otherwise only its first request in each half minute is accepted.
    • The outbound relay sends its OAuth2 token over TLS only. A route or the SMTP relay whose host is on OutboundOAuth2Hosts and whose connection security is none, or STARTTLS optional against a server that does not offer it, now sends nothing: the delivery fails with a temporary 450 4.7.0 and waits for its retries, and HM5912 says to set the security to TLS or STARTTLS required.
    • A domain can no longer be named as a directory the server keeps its own files in, such as protected, quarantine or files. One that already is can still be saved, and is named as HM7597 at every start and on the setup checklist: rename it before you rely on a backup of it.
    • A COM change to a route, relay, DNS black list, SURBL server, remote-domain policy, server message, blocked attachment, SSL certificate or group takes effect only at Save(). Scripts that relied on the old way must save.
    • IMAP answers as the RFCs say where Dovecot's imaptest found it did not: some answers change from BAD to NO, and an APPEND stores the literal byte for byte.
    • A restore refuses an archive with an absolute path, a .. or a link in it, and the installer's 7-Zip is 26.03. Mail labelled ISO-8859-1 is decoded as windows-1252.
    • Only a new installation is made secure before anyone configures it: a self-signed certificate, STARTTLS on 25, 587, 110 and 143, and TLS required for sign-in from the Internet IP range. The Windows installer does it; on Linux the service's first start under systemd within a day of --create-database does it, and with an AppImage or a container image, neither of which 6.3.4 ships, an administrator runs --apply-new-install-defaults by hand. A new Windows installation also runs the service as NT SERVICE\hMailServer, and a new installation gets a stored-secrets key, made by the Windows installer, and on Linux by the container's --create-database only; a new .deb or .rpm installation gets its key when an administrator runs sudo hmailserver --create-stored-secrets-key, which the setup checklist offers. An upgrade keeps its listeners, its service account and its secrets as they were: nothing is sealed until an administrator runs --create-stored-secrets-key, which the setup checklist offers.

    Fixed before release

    6.3.4 was audited area by area before it was cut, and its code was scanned by GitLab's SAST. The defects they found are fixed in this release. Several of these were in 6.3.3 as well.

    • Passwords outside Latin-1. Every password hash was made over a conversion that turned the first character above U+00FF and everything after it into NUL bytes on Windows, and each such character into ? on Linux, so a password of Cyrillic, Greek or CJK letters could be opened by any other password of its length and shape. Hashes are now made over UTF-8 (see the upgrade note above).
    • Sign-in. SCRAM-SHA-256 accepted the account's own password for an account with a second factor, and a password past its maximum age (6.3.3 had both). A sign-in under a domain alias, or with a token, a certificate or a Kerberos ticket, escaped the country policy. One-time codes could be used again within their window, and at several places a wrong one was not counted.
    • Single sign-on and passkeys. A single sign-on ticket could be redeemed in another person's browser. With a parent-domain relying party, a page on any sibling host could sign somebody in with their passkey (passkey_allowed_origins now names the origins). A switched-off domain still let its people in by passkey or single sign-on.
    • Delegated administration. Where the server administrator's own mailbox is in a domain somebody else administers, that domain's administrator could become the server administrator through an app password on it, delete or rename it, or repoint its fetch account, over REST and COM. A credential confined to one domain could set another domain's webmail branding and declare spam traps in any domain.
    • Keys. An app password or an administrator's support session could read the account's wrapped S/MIME, OpenPGP and zero-access keys. An app password could also replace the account's own S/MIME key and publish an OpenPGP key for the address, and a support session could change any of the account's keys or switch zero access off.
    • Collecting mail. On a server that collects Microsoft 365 mail with its own OAuth2 token, any person could collect any mailbox the token reaches (a domain administrator over COM since 6.2.23 Alpha 1). A CR or LF in a fetch account's user name or password added commands, and a fetch account's host could be pointed inside the network through DNS after it was saved. Schema 6104 marks the fetch accounts made or changed from now on: one a person makes connects only to public addresses, unless the administrator allows private ones, and one made without the server's authority is never given the server's token. Accounts from before 6104, and an administrator's, are not marked, so review existing fetch accounts for hosts on FetchOAuth2Hosts after upgrading.
    • IMAP. A heap-corruption abort when two sessions met on one message's keywords, flag changes lost when two arrived at once, an abandoned APPEND that left its file for good, an unbounded LIST pattern, and ENVELOPE and BODYSTRUCTURE values that broke the response. 6.3.3 had all of them.
    • The REST listener and the webmail. Request headers were read from the body, which allowed a forged sign-in. One person could stall the webmail and the Control Deck for everybody. A Web Push endpoint could point inside the network. Large downloads were cut off and held whole in memory, and a request head that never ended could hold 16 MB.
    • GitLab's SAST (Semgrep). Seven of its High findings were real, and are fixed: the crash-dump helper would load a dbghelp.dll put in Bin; the Control Panel's elevated service restart would run a cmd.exe left in its working directory; the installer handed the administrator password to DBSetupQuick.exe, and it to DBUpdater.exe, unquoted on their command lines; a malformed backup index was read past its end (two); and a test of the MIME parser compared pointers into two different arrays. 169 others were read and judged not exploitable, each with its reason in .gitlab/security-exceptions.yml (188 entries there, 19 of them re-reads of lines the fixes moved). Found beside them and fixed too: the MySQL client's DLLs were looked for in the current directory and along PATH, and a custom virus scanner whose command line holds a bare %FILE% was handed the path cut at its first space, scanned no file, and the message was delivered as clean.
    • The first security scans. The installer's 7-Zip is 26.03 in place of 19.00, which predates the fixes for CVE-2023-31102 and CVE-2025-55188; a restore refuses an unsafe archive; MIME boundaries come from a generator seeded by the operating system; zlib is 1.3.2. The two static-analysis findings that were defects are fixed: on Linux the service account's name is read with getpwuid_r, and an inbound webhook's URL must be printable ASCII on both platforms.

    Also in this release

    Most of what is new is off until an administrator turns it on.

    • Mail flow: remote-domain policies, per-destination throttling and IP warm-up, a send API for applications, DKIM key rotation, journaling, restricted delivery, message recall, and mail in to a webhook.
    • Anti-spam: hardened greylisting, SMTP policy rules, allow and block lists with quarantine digests, mail flow rules with an outbound content policy, impersonation protection, attachment sandboxing, spam traps and country blocking.
    • Webmail and clients: CalDAV and calendars with invitations, free-busy and delegation, rooms and equipment that answer bookings, contact groups and a directory, recover deleted items, expiring messages, offline mail, Web Push and OpenPGP in the browser.
    • Identity: administrator roles, passkeys, OpenID Connect and SAML sign-in, SCIM provisioning, self-service password reset, sessions and devices, and breached-password checks.
    • Encryption: zero-access mailboxes, mailbox encryption at rest, gateway encryption to partner domains, an organisation CA for S/MIME, Web Key Directory, and sealed stored secrets.
    • Compliance and administration: eDiscovery with legal holds and verifiable exports, settings at server, domain and account level, profiles, hmctl and a PowerShell module, and a setup checklist.
    • Migration: resumable migrations from IMAP, Google Workspace and Microsoft 365, and PST import with a reader of the project's own. No PST job runs until an administrator names PstImportDirectory, copies the file there and starts the job.
    • Operations: storage compression and attachment de-duplication; object storage on an S3-compatible store or Azure Blob Storage, off until an administrator names a store (MessageStoreBackend is file as shipped); encrypted backups; event scripts on Linux in JavaScript (QuickJS); a read-only SNMPv3 agent, off, and answering nobody until a manager's address is in SnmpAllowedAddresses; and syslog.

    The full list, with the operator document for each item, is the 6.3.4 section of CHANGELOG.md.

    What 6.3.4 does not carry

    • No Sigstore bundle, so no server's live update installs it. From 6.3.5 the GitLab pipeline is to sign every file with Sigstore; none of its release jobs has run yet.
    • No AArch64 .deb or .rpm, no AppImage, and no ARM64 Windows installer.
    • No container image. The Dockerfile, the Compose file and the Helm chart are in the tree, nothing is published at registry.gitlab.com/progressiverobot/hmailserver yet, and the images published on ghcr.io before the suspension answer 404.
    • No apt or dnf repository, and no winget or Chocolatey package of this project's in the public repositories (the hmailserver package on the Chocolatey feed is the upstream 5.6.8, unlisted).

    Downloads, and how to check them

    The release carries ten files:

    • hMailServer-6.3.4-x64.exe, the Windows x64 installer; hmailserver_6.3.4_amd64.deb and hmailserver-6.3.4-1.x86_64.rpm for x86-64 Linux.
    • An SBOM for each of those three, <file>.cdx.json (CycloneDX 1.6), whose subject is that file by its SHA-256 and SHA-512; and the source tree's SBOMs, hmailserver.spdx.json and hmailserver.cyclonedx.json.
    • hmailserver-6.3.4-SHA256SUMS.txt, which names the other eight with their SHA-256, and hmailserver-6.3.4-SHA256SUMS.txt.sig, its signature, made with the SSH key that signs the release tags.

    https://updates.progressiverobot.com/download/hMailServer-x64.exe, /download/hmailserver_amd64.deb and /download/hmailserver.x86_64.rpm always lead to that file of the newest stable release, never a pre-release's, and https://updates.progressiverobot.com/download/ to that release's page.

    To check a download, with OpenSSH 8.1 or later, in a clone of the repository (for .gitlab/allowed_signers) and with the downloads beside you:

    ssh-keygen -Y verify -f .gitlab/allowed_signers -I [email protected] -n file -s hmailserver-6.3.4-SHA256SUMS.txt.sig < hmailserver-6.3.4-SHA256SUMS.txt
    sha256sum -c hmailserver-6.3.4-SHA256SUMS.txt
    

    The first must say Good "file" signature for [email protected], and the second OK for every file (add --ignore-missing when you downloaded only some). On Windows, Get-AuthenticodeSignature .\hMailServer-6.3.4-x64.exe should also answer Valid, with a signer certificate for CN=Progressive Robot Ltd. The tag is signed with the same key: git -c gpg.ssh.allowedSignersFile=.gitlab/allowed_signers verify-tag v6.3.4. SECURITY.md, "Verifying a release" and "Software bills of materials", has the rest, including how to check that an SBOM describes your file.

    Reporting a vulnerability

    Not in a thread here, and not in a public issue. Report it privately, as SECURITY.md says: a confidential issue on GitLab - check that it is still marked confidential before you submit it, and choose the Security template - or an email to contact-project+hmailserver-hmailserver-86730559-issue-@incoming.gitlab.com, which GitLab files as a confidential issue, so no GitLab account is needed.

    Release notes, checksums and downloads · Newest stable release

Member List

chrisC chris Group Owner
6 Posts 0 Reputation
  • Login

  • Don't have an account? Register

  • Login or register to search.
  • First post
    Last post
0
  • Categories
  • Recent
  • Popular
  • Tags
  • Users
  • Groups
  • Documentation
  • Downloads
  • Report a bug
  • GitHub mirror
  • Paid support