CVE-2018-14359
Description
An issue was discovered in Mutt before 1.10.1 and NeoMutt before 2018-07-16. They have a buffer overflow via base64 data.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
Buffer overflow in Mutt and NeoMutt base64 decoding allows remote code execution via crafted emails.
Vulnerability
A buffer overflow exists in the base64 decoding functions (mutt_b64_decode in NeoMutt, mutt_from_base64 in Mutt) used during IMAP authentication (CRAM-MD5, GSSAPI) [2][3]. Affected are Mutt before 1.10.1 and NeoMutt before 2018-07-16 [1][4]. The overflow occurs when decoding base64 data from a malicious server response without checking output buffer length.
Exploitation
An attacker with control over an IMAP server (or performing a man-in-the-middle attack) can send a crafted base64-encoded response to trigger the overflow [2][3]. No user interaction is required beyond connecting to the malicious server.
Impact
Successful exploitation can lead to arbitrary code execution with the privileges of the user running Mutt/NeoMutt [4]. The vulnerability is classified as having high severity (CVSS not given) and may also allow denial of service.
Mitigation
Fixed in Mutt 1.10.1 and NeoMutt 2018-07-16 [1][4]. Upgrade to these versions or later. The Gentoo advisory GLSA 201810-07 provides patched packages [4]. No other workarounds are known.
AI Insight generated on May 26, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected products
13- osv-coords11 versionspkg:rpm/opensuse/mutt&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/neomutt&distro=openSUSE%20Tumbleweedpkg:rpm/suse/mutt&distro=SUSE%20Linux%20Enterprise%20Desktop%2012%20SP3pkg:rpm/suse/mutt&distro=SUSE%20Linux%20Enterprise%20Module%20for%20Basesystem%2015pkg:rpm/suse/mutt&distro=SUSE%20Linux%20Enterprise%20Point%20of%20Sale%2011%20SP3pkg:rpm/suse/mutt&distro=SUSE%20Linux%20Enterprise%20Server%2011%20SP3-LTSSpkg:rpm/suse/mutt&distro=SUSE%20Linux%20Enterprise%20Server%2011%20SP3-TERADATApkg:rpm/suse/mutt&distro=SUSE%20Linux%20Enterprise%20Server%2011%20SP4pkg:rpm/suse/mutt&distro=SUSE%20Linux%20Enterprise%20Server%2012%20SP3pkg:rpm/suse/mutt&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2011%20SP4pkg:rpm/suse/mutt&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2012%20SP3
< 2.0.7-2.2+ 10 more
- (no CPE)range: < 2.0.7-2.2
- (no CPE)range: < 20210205-3.3
- (no CPE)range: < 1.10.1-55.3.1
- (no CPE)range: < 1.10.1-3.3.4
- (no CPE)range: < 1.5.17-42.43.1
- (no CPE)range: < 1.5.17-42.43.1
- (no CPE)range: < 1.5.17-42.43.1
- (no CPE)range: < 1.5.17-42.43.1
- (no CPE)range: < 1.10.1-55.3.1
- (no CPE)range: < 1.5.17-42.43.1
- (no CPE)range: < 1.10.1-55.3.1
Patches
4ed9d7727dc70automatic post-release commit for mutt-1.10.1
3 files changed · +238 −1
ChangeLog+230 −0 modified@@ -1,3 +1,233 @@ +2018-07-13 14:25:28 -0700 Kevin McCarthy <kevin@8t8.us> (3d9028fe) + + * Check outbuf length in mutt_from_base64() + + The obuf can be overflowed in auth_cram.c, and possibly auth_gss.c. + + Thanks to Jeriko One for the bug report. + +M base64.c +M imap/auth_cram.c +M imap/auth_gss.c +M protos.h + +2018-07-13 13:05:22 -0700 Kevin McCarthy <kevin@8t8.us> (6962328c) + + * Check destlen and truncate in url_pct_encode(). + + Thanks to Jeriko One for the patch, which this commit is based upon. + +M url.c + +2018-07-13 12:35:50 -0700 Kevin McCarthy <kevin@8t8.us> (e57a8602) + + * Verify IMAP status mailbox literal count size. + + Ensure the length isn't bigger than the idata->buf. + + Thanks to Jeriko One fo the bug report and patch, which this commit is + based upon. + +M imap/command.c + +2018-07-13 12:24:58 -0700 JerikoOne <jeriko.one@gmx.us> (9347b5c0) + + * Handle NO response without message properly + +M imap/command.c + +2018-07-13 12:15:00 -0700 Kevin McCarthy <kevin@8t8.us> (3287534d) + + * Don't overflow tmp in msg_parse_fetch. + + Ensure INTERNALDATE and RFC822.SIZE field sizes fit temp buffer. + + Thanks to Jeriko One for the bug report and patch, which this patch is + based upon. + +M imap/message.c + +2018-07-13 11:33:16 -0700 Richard Russon <rich@flatcap.org> (31eef6c7) + + * Selectively cache headers. + + Thanks to NeoMutt and Jeriko One for the patch, which was slightly + modified to apply to the Mutt code. + +M imap/util.c + +2018-07-13 11:16:33 -0700 Kevin McCarthy <kevin@8t8.us> (6aed28b4) + + * Sanitize POP bcache paths. + + Protect against bcache directory path traversal for UID values. + + Thanks for Jeriko One for the bug report and patch, which this commit + is based upon. + +M pop.c + +2018-07-13 10:47:11 -0700 JerikoOne <jeriko.one@gmx.us> (e154cba1) + + * Ensure UID in fetch_uidl. + +M pop.c + +2018-07-12 21:41:17 -0700 Kevin McCarthy <kevin@8t8.us> (4d0cd265) + + * Fix buffer size check in cmd_parse_lsub. + + The size parameter to url_ciss_tostring() was off by one. + +M imap/command.c + +2018-07-12 20:46:37 -0700 Kevin McCarthy <kevin@8t8.us> (e0131852) + + * Fix imap_quote_string() length check errors. + + The function wasn't properly checking for dlen<2 before quoting, and + wasn't properly pre-adjusting dlen to include the initial quote. + + Thanks to Jeriko One for reporting these issues. + +M imap/util.c + +2018-07-07 19:32:57 -0700 Kevin McCarthy <kevin@8t8.us> (4ff007ca) + + * Mention $pgp_decode_command for $pgp_check_gpg_decrypt_status_fd + + It scans $pgp_decode_command for inline and application/pgp mime + types. + +M init.h + +2018-07-07 19:03:44 -0700 Kevin McCarthy <kevin@8t8.us> (18515281) + + * Properly quote IMAP mailbox names when (un)subscribing. + + When handling automatic subscription (via $imap_check_subscribed), or + manual subscribe/unsubscribe commands, mutt generating a "mailboxes" + command but failed to properly escape backquotes. + + Thanks to Jeriko One for the detailed bug report and patch, which this + commit is based upon. + +M imap/command.c +M imap/imap.c +M imap/imap_private.h +M imap/util.c + +2018-06-18 11:21:38 +0200 Philipp Gesang <philipp.gesang@intra2net.com> (df4affd1) + + * crypt-gpgme: prevent crash on bad S/MIME signature + + Inform the user about the fingerprint being unavailable instead + of crashing if the S/MIME signature is bad. + +M crypt-gpgme.c + +2018-06-04 21:31:33 -0700 Kevin McCarthy <kevin@8t8.us> (edb4ec84) + + * Add GnuPG status fd checks for inline pgp. + + The difficulty is that "BEGIN PGP MESSAGE" could be a signed and + armored part, so we can't fail hard if it isn't encrypted. + + Change pgp_check_decryption_okay() to return more status codes, with + >=0 indicating an actual decryption; -2 and -1 indicating plaintext + found; and -3 indicating an actual DECRYPTION_FAILED status code seen. + + Fail hard on -3, but change the message for -2 and -1 to indicate the + message was not encrypted. + +M pgp.c + +2018-06-04 15:40:57 -0700 Kevin McCarthy <kevin@8t8.us> (8ec6d766) + + * Add $pgp_check_gpg_decrypt_status_fd. + + If set (the default) mutt performs more thorough checking of the + $pgp_decrypt_command status output for GnuPG result codes. + + Ticket #39 revealed that GnuPG (currently) does not protect against + messages that have been manipulated to contain an empty encryption + packet followed by a plaintext packet. + + A huge thanks to Marcus Brinkmann for researching this issue, taking + the time to report it to us (and the GnuPG team), and taking even more + time to clarify exactly what needed to be checked for. + +M contrib/gpg.rc +M contrib/pgp2.rc +M contrib/pgp5.rc +M contrib/pgp6.rc +M init.h +M mutt.h +M pgp.c + +2018-06-03 14:52:37 -0700 Kevin McCarthy <kevin@8t8.us> (cb2329ae) + + * Revert showing real size for small files in mutt_pretty_size(). + + I thought the change made in 0fa64ba9 was small enough not to matter, + but at least one long-time user took the time to track down the change + and request it be reverted. + +M muttlib.c + +2018-06-03 14:40:31 -0700 Kevin McCarthy <kevin@8t8.us> (33290d12) + + * Switch build scripts to use `` instead of $() + + This is for older systems running Bourne shell as /bin/sh. + +M mkchangelog.sh +M mkreldate.sh +M version.sh + +2013-01-06 19:24:18 +0100 Oswald Buddenhagen <ossi@kde.org> (ec96f5f5) + + * fix inappropriate use of FREE() in ssl init error path + + OpenSSL structures need to be freed with dedicated functions. + +M mutt_ssl.c + +2018-05-19 10:57:10 -0700 Kevin McCarthy <kevin@8t8.us> (d55950a8) + + * automatic post-release commit for mutt-1.10.0 + +M ChangeLog +M VERSION +M po/bg.po +M po/ca.po +M po/cs.po +M po/da.po +M po/de.po +M po/el.po +M po/eo.po +M po/es.po +M po/et.po +M po/eu.po +M po/fr.po +M po/ga.po +M po/gl.po +M po/hu.po +M po/id.po +M po/it.po +M po/ja.po +M po/ko.po +M po/lt.po +M po/nl.po +M po/pl.po +M po/pt_BR.po +M po/ru.po +M po/sk.po +M po/sv.po +M po/tr.po +M po/uk.po +M po/zh_CN.po +M po/zh_TW.po 2018-05-17 12:24:31 -0700 Ivan Vilata i Balaguer <ivan@selidor.net> (70c9c89b) * Updated Catalan translation.
UPDATING+7 −0 modified@@ -8,6 +8,13 @@ http://www.mutt.org/doc/manual/ The keys used are: !: modified feature, -: deleted feature, +: new feature +1.10.1 (2018-07-16): + + ! Bug fix release. + + $pgp_check_gpg_decrypt_status_fd, when set (the default), checks + GnuPG status fd output more thoroughly for spooofed encrypted + messages. Please see contrib/gpg.rc for suggested values. + 1.10.0 (2018-05-19): ! $reply_self is now respected for group-reply, even with $metoo unset.
VERSION+1 −1 modified@@ -1 +1 @@ -1.10.0 +1.10.1
6a147a62cf39merge: NeoMutt 2018-07-16
41 files changed · +20281 −20118
auto.def+1 −1 modified@@ -14,7 +14,7 @@ use system cc cc-lib mutt-gettext mutt-iconv ############################################################################### # Names and versions define PACKAGE "neomutt" -define PACKAGE_VERSION "20180622" +define PACKAGE_VERSION "20180716" define BUGS_ADDRESS "neomutt-devel@neomutt.org" # Subdirectories that contain additional Makefile.autosetup files
ChangeLog.md+6 −0 modified@@ -1,3 +1,9 @@ +2018-07-16 Richard Russon <rich@flatcap.org> +* Features + - <check-stats> function +* Bug Fixes + - Lots + 2018-06-22 Richard Russon <rich@flatcap.org> * Features - Expand variables inside backticks
doxygen/doxygen.conf+1 −1 modified@@ -25,7 +25,7 @@ PROJECT_NAME = "NeoMutt" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 2018-06-22 +PROJECT_NUMBER = 2018-07-16 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a
imap/auth_plain.c+2 −1 modified@@ -77,7 +77,8 @@ enum ImapAuthRes imap_auth_plain(struct ImapData *idata, const char *method) } if (rc == IMAP_CMD_RESPOND) { - mutt_str_strcat(buf + sizeof(auth_plain_cmd), sizeof(buf) - sizeof(auth_plain_cmd), "\r\n"); + mutt_str_strcat(buf + sizeof(auth_plain_cmd), + sizeof(buf) - sizeof(auth_plain_cmd), "\r\n"); mutt_socket_send(idata->conn, buf + sizeof(auth_plain_cmd)); } }
imap/imap.c+2 −2 modified@@ -1730,8 +1730,8 @@ int imap_subscribe(char *path, bool subscribe) mutt_buffer_init(&err); err.data = errstr; err.dsize = sizeof(errstr); - len = snprintf(mbox, sizeof(mbox), "%smailboxes ", subscribe ? "" : "un"); - imap_quote_string(mbox + len, sizeof(mbox) - len, path, true); + len = snprintf(mbox, sizeof(mbox), "%smailboxes ", subscribe ? "" : "un"); + imap_quote_string(mbox + len, sizeof(mbox) - len, path, true); if (mutt_parse_rc_line(mbox, &token, &err)) mutt_debug(1, "Error adding subscribed mailbox: %s\n", errstr); FREE(&token.data);
.mailmap+4 −1 modified@@ -61,6 +61,7 @@ Jakub Jindra <jakub.jindra@socialbakers.com> Jakub Jindra <j Jakub Wilk <jwilk@jwilk.net> Jakub Wilk <jwilk@jwilk.net> # @jwilk Jelle van der Waa <jelle@vdwaa.nl> Jelle van der Waa <jelle@vdwaa.nl> # @jelly Jenya Sovetkin <e.sovetkin@gmail.com> Jenya Sovetkin <e.sovetkin@gmail.com> # @esovetkin +JerikoOne <jeriko.one@gmx.us> JerikoOne <jeriko.one@gmx.us> # @jeriko-one Joey Pabalinas <joeypabalinas@gmail.com> Joey Pabalinas <joeypabalinas@gmail.com> # @alyptik Johannes Weißl <jargon@molb.org> Johannes Weißl <jargon@molb.org> # @weisslj Jonathan Perkin <jperkin@netbsd.org> Jonathan Perkin <jperkin@netbsd.org> # @jperkin @@ -80,6 +81,7 @@ Marcin Rajner <mrajner@gik.pw.edu.pl> Marcin Rajner <m Marcin Rajner <mrajner@gik.pw.edu.pl> Marcin Rajner <mrajner@lenovo> # @mrajner Marcin Rajner <mrajner@gik.pw.edu.pl> Marcin Rajner lenovo <mrajner@gik.pw.edu.pl> # @mrajner Marco Hinz <mh.codebro@gmail.com> Marco Hinz <mh.codebro@gmail.com> # @mhinz +Marco Sirabella <marco@sirabella.org> Marco Sirabella <marco@sirabella.org> # @mjsir911 Marius Gedminas <marius@gedmin.as> Marius Gedminas <marius@gedmin.as> # @mgedmin Mehdi Abaakouk <sileht@sileht.net> Mehdi ABAAKOUK <sileht@sileht.net> # @sileht Mehdi Abaakouk <sileht@sileht.net> Mehdi Abaakouk <sileht@sileht.net> # @sileht @@ -156,7 +158,8 @@ Andreas Jobs <unknown> Andreas Jobs <un Andrew Gaul <andrew@gaul.org> Andrew Gaul <andrew@gaul.org> Andrew Nosenko <awn@bcs.zp.ua> Andrew W. Nosenko <awn@bcs.zp.ua> Antoine Reilles <tonio@netbsd.org> Antoine Reilles <tonio@netbsd.org> -Anton Lindqvist <anton.lindqvist@gmail.com> Anton Lindqvist <anton.lindqvist@gmail.com> +Anton Lindqvist <anton@basename.se> Anton Lindqvist <anton.lindqvist@gmail.com> +Anton Lindqvist <anton@basename.se> Anton Lindqvist <anton@basename.se> Armin Wolfermann <aw@osn.de> Armin Wolfermann <aw@osn.de> Aron Griffis <agriffis@n01se.net> Aron Griffis <agriffis@n01se.net> Athanasios Douitsis <aduitsis@gmail.com> Athanasios Douitsis <aduitsis@gmail.com>
newsrc.c+2 −1 modified@@ -601,7 +601,8 @@ int nntp_add_group(char *line, void *data) return 0; /* These sscanf limits must match the sizes of the group and desc arrays */ - if (sscanf(line, "%1023s " ANUM " " ANUM " %c %8191[^\n]", group, &last, &first, &mod, desc) < 4) + if (sscanf(line, "%1023s " ANUM " " ANUM " %c %8191[^\n]", group, &last, + &first, &mod, desc) < 4) { mutt_debug(4, "Cannot parse server line: %s\n", line); return 0;
nntp.c+1 −1 modified@@ -1289,7 +1289,7 @@ static int nntp_fetch_headers(struct Context *ctx, void *hc, anum_t first, fc.restore = restore; fc.messages = mutt_mem_calloc(last - first + 1, sizeof(unsigned char)); if (fc.messages == NULL) - return -1; + return -1; #ifdef USE_HCACHE fc.hc = hc; #endif
pattern.c+8 −8 modified@@ -1885,13 +1885,13 @@ int mutt_pattern_exec(struct Pattern *pat, enum PatternExecFlag flags, case MUTT_SENDER: if (!h->env) return 0; - return (pat->not ^ match_addrlist(pat, (flags & MUTT_MATCH_FULL_ADDRESS), 1, - h->env->sender)); + return (pat->not ^ match_addrlist(pat, (flags & MUTT_MATCH_FULL_ADDRESS), + 1, h->env->sender)); case MUTT_FROM: if (!h->env) return 0; - return (pat->not ^ - match_addrlist(pat, (flags & MUTT_MATCH_FULL_ADDRESS), 1, h->env->from)); + return (pat->not ^ match_addrlist(pat, (flags & MUTT_MATCH_FULL_ADDRESS), + 1, h->env->from)); case MUTT_TO: if (!h->env) return 0; @@ -1924,14 +1924,14 @@ int mutt_pattern_exec(struct Pattern *pat, enum PatternExecFlag flags, case MUTT_ADDRESS: if (!h->env) return 0; - return (pat->not ^ match_addrlist(pat, (flags & MUTT_MATCH_FULL_ADDRESS), 4, - h->env->from, h->env->sender, + return (pat->not ^ match_addrlist(pat, (flags & MUTT_MATCH_FULL_ADDRESS), + 4, h->env->from, h->env->sender, h->env->to, h->env->cc)); case MUTT_RECIPIENT: if (!h->env) return 0; - return (pat->not ^ match_addrlist(pat, (flags & MUTT_MATCH_FULL_ADDRESS), 2, - h->env->to, h->env->cc)); + return (pat->not ^ match_addrlist(pat, (flags & MUTT_MATCH_FULL_ADDRESS), + 2, h->env->to, h->env->cc)); case MUTT_LIST: /* known list, subscribed or not */ if (!h->env) return 0;
po/bg.po+675 −670 modifiedpo/ca.po+675 −670 modifiedpo/cs.po+675 −670 modifiedpo/da.po+675 −670 modifiedpo/de.po+675 −670 modifiedpo/el.po+675 −670 modifiedpo/en_GB.po+674 −670 modifiedpo/eo.po+675 −670 modifiedpo/es.po+675 −670 modifiedpo/et.po+675 −670 modifiedpo/eu.po+675 −670 modifiedpo/fr.po+675 −670 modifiedpo/ga.po+675 −670 modifiedpo/gl.po+675 −670 modifiedpo/hu.po+675 −670 modifiedpo/id.po+675 −670 modifiedpo/it.po+675 −670 modifiedpo/ja.po+675 −670 modifiedpo/ko.po+675 −670 modifiedpo/lt.po+675 −670 modifiedpo/nl.po+675 −670 modifiedpo/pl.po+675 −670 modifiedpo/pt_BR.po+675 −670 modifiedpo/ru.po+675 −670 modifiedpo/sk.po+675 −670 modifiedpo/sv.po+675 −670 modifiedpo/tr.po+675 −670 modifiedpo/uk.po+675 −670 modifiedpo/zh_CN.po+675 −670 modifiedpo/zh_TW.po+675 −670 modifiedREADME.md+3 −1 modified@@ -2,7 +2,7 @@ [](https://github.com/neomutt/neomutt "Give us a Star") [](https://twitter.com/NeoMutt_Org "Follow us on Twitter") -[](#contributors "All of NeoMutt's Contributors") +[](#contributors "All of NeoMutt's Contributors") [](https://github.com/neomutt/neomutt/releases/latest "Latest Release Notes") [](https://github.com/neomutt/neomutt/blob/master/COPYRIGHT.md "Copyright Statement") [](https://travis-ci.org/neomutt/neomutt "Latest Automatic Code Build") @@ -137,6 +137,7 @@ Here's a list of everyone who's helped NeoMutt: [Jasper Adriaanse](https://github.com/jasperla "jasperla"), [Jelle van der Waa](https://github.com/jelly "jelly"), [Jenya Sovetkin](https://github.com/esovetkin "esovetkin"), +[JerikoOne](https://github.com/jeriko-one "jeriko-one"), [Joey Pabalinas](https://github.com/alyptik "alyptik"), [Johannes Frankenau](https://github.com/tsuflux "tsuflux"), [Johannes Weißl](https://github.com/weisslj "weisslj"), @@ -156,6 +157,7 @@ Here's a list of everyone who's helped NeoMutt: [Manos Pitsidianakis](https://github.com/epilys "epilys"), [Marcin Rajner](https://github.com/mrajner "mrajner"), [Marco Hinz](https://github.com/mhinz "mhinz"), +[Marco Sirabella](https://github.com/mjsir911 "mjsir911"), [Marius Gedminas](https://github.com/mgedmin "mgedmin"), [Mateusz Piotrowski](https://github.com/0mp "0mp"), [Matteo Vescovi](https://github.com/mfvescovi "mfvescovi"),
send.c+2 −1 modified@@ -1076,7 +1076,8 @@ struct Address *mutt_default_from(void) if (From) addr = mutt_addr_copy(From); - else { + else + { addr = mutt_addr_new(); if (UseDomain) {
6f163e07ae68Check outbuf length in mutt_to_base64()
6 files changed · +20 −12
imap/auth_cram.c+1 −1 modified@@ -134,7 +134,7 @@ enum ImapAuthRes imap_auth_cram_md5(struct ImapData *idata, const char *method) goto bail; } - len = mutt_b64_decode(obuf, idata->buf + 2); + len = mutt_b64_decode(obuf, idata->buf + 2, sizeof(obuf)); if (len == -1) { mutt_debug(1, "Error decoding base64 response.\n");
imap/auth_gss.c+2 −2 modified@@ -203,7 +203,7 @@ enum ImapAuthRes imap_auth_gss(struct ImapData *idata, const char *method) goto bail; } - request_buf.length = mutt_b64_decode(buf2, idata->buf + 2); + request_buf.length = mutt_b64_decode(buf2, idata->buf + 2, sizeof(buf2)); request_buf.value = buf2; sec_token = &request_buf; @@ -238,7 +238,7 @@ enum ImapAuthRes imap_auth_gss(struct ImapData *idata, const char *method) mutt_debug(1, "#2 Error receiving server response.\n"); goto bail; } - request_buf.length = mutt_b64_decode(buf2, idata->buf + 2); + request_buf.length = mutt_b64_decode(buf2, idata->buf + 2, sizeof(buf2)); request_buf.value = buf2; maj_stat = gss_unwrap(&min_stat, context, &request_buf, &send_token, &cflags, &quality);
mutt/base64.c+10 −3 modified@@ -117,16 +117,17 @@ size_t mutt_b64_encode(char *out, const char *cin, size_t len, size_t olen) /** * mutt_b64_decode - Convert null-terminated base64 string to raw bytes - * @param out Output buffer for the raw bytes - * @param in Input buffer for the null-terminated base64-encoded string + * @param out Output buffer for the raw bytes + * @param in Input buffer for the null-terminated base64-encoded string + * @param olen Length of the output buffer * @retval num Success, bytes written * @retval -1 Error * * This function performs base64 decoding. The resulting buffer is NOT * null-terminated. If the input buffer contains invalid base64 characters, * this function returns -1. */ -int mutt_b64_decode(char *out, const char *in) +int mutt_b64_decode(char *out, const char *in, size_t olen) { int len = 0; unsigned char digit4; @@ -148,14 +149,20 @@ int mutt_b64_decode(char *out, const char *in) in += 4; /* digits are already sanity-checked */ + if (len == olen) + return len; *out++ = (base64val(digit1) << 2) | (base64val(digit2) >> 4); len++; if (digit3 != '=') { + if (len == olen) + return len; *out++ = ((base64val(digit2) << 4) & 0xf0) | (base64val(digit3) >> 2); len++; if (digit4 != '=') { + if (len == olen) + return len; *out++ = ((base64val(digit3) << 6) & 0xc0) | base64val(digit4); len++; }
mutt/base64.h+1 −1 modified@@ -28,6 +28,6 @@ extern const int Index64[]; #define base64val(c) Index64[(unsigned int) (c)] size_t mutt_b64_encode(char *out, const char *cin, size_t len, size_t olen); -int mutt_b64_decode(char *out, const char *in); +int mutt_b64_decode(char *out, const char *in, size_t olen); #endif /* _MUTT_BASE64_H */
mutt/rfc2047.c+3 −2 modified@@ -399,8 +399,9 @@ static char *rfc2047_decode_word(const char *s, size_t len, enum ContentEncoding } else if (enc == ENCBASE64) { - char *out = mutt_mem_malloc(3 * len / 4 + 1); - int dlen = mutt_b64_decode(out, it); + const int olen = 3 * len / 4 + 1; + char *out = mutt_mem_malloc(olen); + int dlen = mutt_b64_decode(out, it, olen); if (dlen == -1) { FREE(&out);
test/base64.c+3 −3 modified@@ -27,7 +27,7 @@ void test_base64_encode(void) void test_base64_decode(void) { char buffer[16]; - int len = mutt_b64_decode(buffer, encoded); + int len = mutt_b64_decode(buffer, encoded, sizeof(buffer)); if (!TEST_CHECK(len == sizeof(clear) - 1)) { TEST_MSG("Expected: %zu", sizeof(clear) - 1); @@ -59,7 +59,7 @@ void test_base64_lengths(void) /* Decoding a zero-length string should fail, too */ out1[0] = '\0'; - declen = mutt_b64_decode(out2, out1); + declen = mutt_b64_decode(out2, out1, sizeof(out2)); if (!TEST_CHECK(declen == -1)) { TEST_MSG("Expected: %zu", -1); @@ -76,7 +76,7 @@ void test_base64_lengths(void) TEST_MSG("Expected: %zu", exp); TEST_MSG("Actual : %zu", enclen); } - declen = mutt_b64_decode(out2, out1); + declen = mutt_b64_decode(out2, out1, sizeof(out2)); if (!TEST_CHECK(declen == i)) { TEST_MSG("Expected: %zu", i);
3d9028fec8f4Vulnerability mechanics
Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
10- security.gentoo.org/glsa/201810-07mitrevendor-advisoryx_refsource_GENTOO
- usn.ubuntu.com/3719-1/mitrevendor-advisoryx_refsource_UBUNTU
- usn.ubuntu.com/3719-2/mitrevendor-advisoryx_refsource_UBUNTU
- usn.ubuntu.com/3719-3/mitrevendor-advisoryx_refsource_UBUNTU
- www.debian.org/security/2018/dsa-4277mitrevendor-advisoryx_refsource_DEBIAN
- www.mutt.org/news.htmlmitrex_refsource_MISC
- github.com/neomutt/neomutt/commit/6f163e07ae68654d7ac5268cbb7565f6df79ad85mitrex_refsource_MISC
- gitlab.com/muttmua/mutt/commit/3d9028fec8f4d08db2251096307c0bbbebce669amitrex_refsource_MISC
- lists.debian.org/debian-lts-announce/2018/08/msg00001.htmlmitremailing-listx_refsource_MLIST
- neomutt.org/2018/07/16/releasemitrex_refsource_MISC
News mentions
0No linked articles in our index yet.