@mavogel/awscdk-rootmail 0.1.19 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +8 -8
- package/lib/rootmail.js +1 -1
- package/lib/ses-receive.js +1 -1
- package/node_modules/@aws-sdk/client-cloudwatch-logs/dist-cjs/index.js +1 -1
- package/node_modules/@aws-sdk/client-cloudwatch-logs/package.json +1 -1
- package/node_modules/@aws-sdk/client-route-53/dist-cjs/index.js +1 -1
- package/node_modules/@aws-sdk/client-route-53/package.json +1 -1
- package/node_modules/@aws-sdk/client-s3/dist-cjs/index.js +1 -1
- package/node_modules/@aws-sdk/client-s3/package.json +2 -2
- package/node_modules/@aws-sdk/client-ses/dist-cjs/index.js +1 -1
- package/node_modules/@aws-sdk/client-ses/package.json +1 -1
- package/node_modules/@aws-sdk/client-ssm/dist-cjs/index.js +1 -1
- package/node_modules/@aws-sdk/client-ssm/package.json +1 -1
- package/node_modules/@zone-eu/mailsplit/package.json +4 -4
- package/node_modules/libbase64/.github/VULNERABILITY_REPORT.yml +75 -0
- package/node_modules/libbase64/CHANGELOG.md +7 -0
- package/node_modules/libbase64/SECURITY.md +147 -0
- package/node_modules/libbase64/lib/libbase64.js +19 -7
- package/node_modules/libbase64/package.json +1 -1
- package/node_modules/libmime/CHANGELOG.md +7 -0
- package/node_modules/libmime/package.json +2 -2
- package/node_modules/mailparser/.release-please-manifest.json +1 -1
- package/node_modules/mailparser/CHANGELOG.md +7 -0
- package/node_modules/mailparser/SECURITY.md +120 -44
- package/node_modules/mailparser/package.json +5 -5
- package/node_modules/nodemailer/CHANGELOG.md +7 -0
- package/node_modules/nodemailer/SECURITY.md +105 -29
- package/node_modules/nodemailer/dist/cjs/fetch/index.js +16 -10
- package/node_modules/nodemailer/dist/cjs/package-info.d.ts +1 -1
- package/node_modules/nodemailer/dist/cjs/package-info.js +1 -1
- package/node_modules/nodemailer/dist/esm/fetch/index.js +16 -10
- package/node_modules/nodemailer/dist/esm/package-info.d.ts +1 -1
- package/node_modules/nodemailer/dist/esm/package-info.js +1 -1
- package/node_modules/nodemailer/package.json +6 -6
- package/package.json +7 -7
package/.jsii
CHANGED
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
]
|
|
9
9
|
},
|
|
10
10
|
"bundled": {
|
|
11
|
-
"@aws-sdk/client-cloudwatch-logs": "^3.
|
|
12
|
-
"@aws-sdk/client-route-53": "^3.
|
|
13
|
-
"@aws-sdk/client-s3": "^3.
|
|
14
|
-
"@aws-sdk/client-ses": "^3.
|
|
15
|
-
"@aws-sdk/client-ssm": "^3.
|
|
11
|
+
"@aws-sdk/client-cloudwatch-logs": "^3.1152.0",
|
|
12
|
+
"@aws-sdk/client-route-53": "^3.1152.0",
|
|
13
|
+
"@aws-sdk/client-s3": "^3.1152.0",
|
|
14
|
+
"@aws-sdk/client-ses": "^3.1152.0",
|
|
15
|
+
"@aws-sdk/client-ssm": "^3.1152.0",
|
|
16
16
|
"cdk-nag": "^3.0.1",
|
|
17
|
-
"mailparser": "^3.9.
|
|
17
|
+
"mailparser": "^3.9.39",
|
|
18
18
|
"uuid": "^14.0.3"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
@@ -9620,6 +9620,6 @@
|
|
|
9620
9620
|
"symbolId": "src/ses-receive:SESReceiveProps"
|
|
9621
9621
|
}
|
|
9622
9622
|
},
|
|
9623
|
-
"version": "0.1.
|
|
9624
|
-
"fingerprint": "
|
|
9623
|
+
"version": "0.1.21",
|
|
9624
|
+
"fingerprint": "B8+T8BHS/1ZL9hQ+6HZrufVgi5O/f3zYXERuO93gpcs="
|
|
9625
9625
|
}
|
package/lib/rootmail.js
CHANGED
|
@@ -11,7 +11,7 @@ const ses_receive_1 = require("./ses-receive");
|
|
|
11
11
|
* Rootmail construct
|
|
12
12
|
*/
|
|
13
13
|
class Rootmail extends constructs_1.Construct {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@mavogel/awscdk-rootmail.Rootmail", version: "0.1.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@mavogel/awscdk-rootmail.Rootmail", version: "0.1.21" };
|
|
15
15
|
/**
|
|
16
16
|
* The name parameter in SSM to store the domain name server.
|
|
17
17
|
*/
|
package/lib/ses-receive.js
CHANGED
|
@@ -11,7 +11,7 @@ const ses_receipt_ruleset_activation_1 = require("./ses-receipt-ruleset-activati
|
|
|
11
11
|
* SES Receive construct
|
|
12
12
|
*/
|
|
13
13
|
class SESReceive extends constructs_1.Construct {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@mavogel/awscdk-rootmail.SESReceive", version: "0.1.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@mavogel/awscdk-rootmail.SESReceive", version: "0.1.21" };
|
|
15
15
|
constructor(scope, id, props) {
|
|
16
16
|
super(scope, id);
|
|
17
17
|
const filteredEmailSubjects = props.filteredEmailSubjects || [];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aws-sdk/client-cloudwatch-logs",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1152.0",
|
|
4
4
|
"description": "AWS SDK for JavaScript Cloudwatch Logs Client for Node.js, Browser and React Native",
|
|
5
5
|
"homepage": "https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-cloudwatch-logs",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aws-sdk/client-route-53",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1152.0",
|
|
4
4
|
"description": "AWS SDK for JavaScript Route 53 Client for Node.js, Browser and React Native",
|
|
5
5
|
"homepage": "https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-route-53",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -4779,7 +4779,7 @@ var WriteGetObjectResponse$ = [9, n0, _WGOR,
|
|
|
4779
4779
|
class CreateSessionCommand extends command(_ep4, _mw0, "CreateSession", CreateSession$) {
|
|
4780
4780
|
}
|
|
4781
4781
|
|
|
4782
|
-
var version = "3.
|
|
4782
|
+
var version = "3.1151.0";
|
|
4783
4783
|
var packageInfo = {
|
|
4784
4784
|
version: version};
|
|
4785
4785
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aws-sdk/client-s3",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1152.0",
|
|
4
4
|
"description": "AWS SDK for JavaScript S3 Client for Node.js, Browser and React Native",
|
|
5
5
|
"homepage": "https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-s3",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"tslib": "^2.6.2"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
|
-
"@aws-sdk/signature-v4-crt": "3.
|
|
70
|
+
"@aws-sdk/signature-v4-crt": "3.1152.0",
|
|
71
71
|
"@smithy/snapshot-testing": "^2.3.2",
|
|
72
72
|
"@tsconfig/node20": "20.1.8",
|
|
73
73
|
"@types/node": "^20.14.8",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aws-sdk/client-ses",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1152.0",
|
|
4
4
|
"description": "AWS SDK for JavaScript Ses Client for Node.js, Browser and React Native",
|
|
5
5
|
"homepage": "https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-ses",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aws-sdk/client-ssm",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1152.0",
|
|
4
4
|
"description": "AWS SDK for JavaScript Ssm Client for Node.js, Browser and React Native",
|
|
5
5
|
"homepage": "https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-ssm",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zone-eu/mailsplit",
|
|
3
|
-
"version": "5.4.
|
|
3
|
+
"version": "5.4.21",
|
|
4
4
|
"description": "Split email messages into an object stream",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"author": "Andris Reinman",
|
|
16
16
|
"license": "(MIT OR EUPL-1.1+)",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"libbase64": "1.3.
|
|
19
|
-
"libmime": "5.4.
|
|
18
|
+
"libbase64": "1.3.3",
|
|
19
|
+
"libmime": "5.4.8",
|
|
20
20
|
"libqp": "2.1.2"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"@types/grunt": "0.4.32",
|
|
26
26
|
"@types/libmime": "5.3.0",
|
|
27
27
|
"@types/libqp": "1.1.3",
|
|
28
|
-
"@types/node": "26.6.
|
|
28
|
+
"@types/node": "26.6.5",
|
|
29
29
|
"eslint": "8.29.0",
|
|
30
30
|
"eslint-config-nodemailer": "1.2.0",
|
|
31
31
|
"eslint-config-prettier": "9.1.0",
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
name: "libbase64 security vulnerability report"
|
|
2
|
+
description: "Report an exploitable security vulnerability in libbase64"
|
|
3
|
+
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Before reporting, read our
|
|
9
|
+
[Security Policy](https://github.com/nodemailer/libbase64/security/policy).
|
|
10
|
+
|
|
11
|
+
Reports must demonstrate a credible security impact.
|
|
12
|
+
Technically valid bugs without a realistic attack
|
|
13
|
+
scenario belong in the regular issue tracker.
|
|
14
|
+
|
|
15
|
+
- type: textarea
|
|
16
|
+
id: summary
|
|
17
|
+
attributes:
|
|
18
|
+
label: Vulnerability summary
|
|
19
|
+
description: Describe the vulnerability and affected versions.
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
22
|
+
|
|
23
|
+
- type: textarea
|
|
24
|
+
id: attacker
|
|
25
|
+
attributes:
|
|
26
|
+
label: Attacker capabilities
|
|
27
|
+
description: |
|
|
28
|
+
What can an attacker control without already having
|
|
29
|
+
privileged access to the application or its configuration?
|
|
30
|
+
validations:
|
|
31
|
+
required: true
|
|
32
|
+
min_length: 100
|
|
33
|
+
|
|
34
|
+
- type: textarea
|
|
35
|
+
id: exploit
|
|
36
|
+
attributes:
|
|
37
|
+
label: Realistic exploitation scenario
|
|
38
|
+
description: |
|
|
39
|
+
Describe how this can be exploited in a real application.
|
|
40
|
+
Explain the prerequisites and security boundary crossed.
|
|
41
|
+
validations:
|
|
42
|
+
required: true
|
|
43
|
+
min_length: 150
|
|
44
|
+
|
|
45
|
+
- type: textarea
|
|
46
|
+
id: poc
|
|
47
|
+
attributes:
|
|
48
|
+
label: Proof of concept
|
|
49
|
+
description: Provide reproducible steps or working code.
|
|
50
|
+
validations:
|
|
51
|
+
required: true
|
|
52
|
+
|
|
53
|
+
- type: textarea
|
|
54
|
+
id: impact
|
|
55
|
+
attributes:
|
|
56
|
+
label: Security impact
|
|
57
|
+
description: |
|
|
58
|
+
What can the attacker achieve? Who is affected?
|
|
59
|
+
Explain why this is a security vulnerability rather
|
|
60
|
+
than an ordinary bug.
|
|
61
|
+
validations:
|
|
62
|
+
required: true
|
|
63
|
+
min_length: 100
|
|
64
|
+
|
|
65
|
+
- type: checkboxes
|
|
66
|
+
id: confirmation
|
|
67
|
+
attributes:
|
|
68
|
+
label: Reporting requirements
|
|
69
|
+
options:
|
|
70
|
+
- label: I have read the Security Policy.
|
|
71
|
+
required: true
|
|
72
|
+
- label: I have verified the finding against a supported version.
|
|
73
|
+
required: true
|
|
74
|
+
- label: I have described a credible attacker-controlled scenario.
|
|
75
|
+
required: true
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.3.3](https://github.com/nodemailer/libbase64/compare/v1.3.2...v1.3.3) (2026-10-14)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **decoder:** decode padded segments into one buffer instead of a Buffer per segment ([0c01914](https://github.com/nodemailer/libbase64/commit/0c0191457e343769e8b68adb4052d71fa267abd1))
|
|
9
|
+
|
|
3
10
|
## [1.3.2](https://github.com/nodemailer/libbase64/compare/v1.3.1...v1.3.2) (2026-10-04)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
libbase64 encodes and decodes base64 strings and streams, with line wrapping for
|
|
4
|
+
MIME. It is used to decode untrusted email content. We welcome responsible
|
|
5
|
+
reports of vulnerabilities that present a credible security risk to users.
|
|
6
|
+
Please distinguish security vulnerabilities from ordinary bugs, unusual edge
|
|
7
|
+
cases, and hardening suggestions.
|
|
8
|
+
|
|
9
|
+
## Supported Versions
|
|
10
|
+
|
|
11
|
+
Security fixes are released only against the latest major version. We do not
|
|
12
|
+
backport patches to older majors, so upgrading to the current release line is
|
|
13
|
+
the supported way to receive security updates.
|
|
14
|
+
|
|
15
|
+
| Version | Supported |
|
|
16
|
+
| ------- | ------------------ |
|
|
17
|
+
| 1.x | :white_check_mark: |
|
|
18
|
+
| < 1.0 | :x: |
|
|
19
|
+
|
|
20
|
+
If you are on an older major, please upgrade. See [CHANGELOG.md](CHANGELOG.md)
|
|
21
|
+
before updating.
|
|
22
|
+
|
|
23
|
+
## What Qualifies as a Security Vulnerability
|
|
24
|
+
|
|
25
|
+
A security report should identify a realistic way for an attacker to cross a
|
|
26
|
+
security boundary in a supported version of libbase64. Unexpected behavior, a
|
|
27
|
+
failing test, or a technically correct proof of concept is not sufficient on its
|
|
28
|
+
own to establish security impact.
|
|
29
|
+
|
|
30
|
+
In particular, explain:
|
|
31
|
+
|
|
32
|
+
- **Attacker capabilities:** Who is the attacker, and what inputs, systems, or
|
|
33
|
+
responses can they control _without_ already having the privileges or secrets
|
|
34
|
+
they are trying to gain?
|
|
35
|
+
- **Attack path:** How does attacker-controlled input reach the affected code
|
|
36
|
+
through a supported public API or a realistic application integration?
|
|
37
|
+
- **Prerequisites:** What configuration and user actions are required? If the
|
|
38
|
+
attack depends on unusual options or deliberately malformed input, explain why
|
|
39
|
+
those conditions could arise in a real application.
|
|
40
|
+
- **Impact:** What confidentiality, integrity, or availability boundary is
|
|
41
|
+
crossed, and what can the attacker achieve as a result?
|
|
42
|
+
|
|
43
|
+
A vulnerability involving an optional or less common feature can still qualify
|
|
44
|
+
if these conditions are met. Conversely, the existence of a defensive check in
|
|
45
|
+
the code does not, by itself, establish that every bypass of that check has a
|
|
46
|
+
realistic security impact.
|
|
47
|
+
|
|
48
|
+
## Reporting a Vulnerability
|
|
49
|
+
|
|
50
|
+
**Do not disclose suspected exploitable vulnerabilities through public GitHub
|
|
51
|
+
issues, pull requests, or discussions before coordinating with the
|
|
52
|
+
maintainers.**
|
|
53
|
+
|
|
54
|
+
Report privately through one of the following channels:
|
|
55
|
+
|
|
56
|
+
1. **GitHub Security Advisories (preferred):**
|
|
57
|
+
<https://github.com/nodemailer/libbase64/security/advisories/new>.
|
|
58
|
+
2. **Email:** **andris@reinman.eu**. Encrypt sensitive details if possible (PGP
|
|
59
|
+
key fingerprint `5D952A46E1D8C931F6364E01DC6C83F4D584D364`).
|
|
60
|
+
|
|
61
|
+
### Required Information
|
|
62
|
+
|
|
63
|
+
Please provide enough information to evaluate both the defect and its security
|
|
64
|
+
impact. Reports should include:
|
|
65
|
+
|
|
66
|
+
1. The affected libbase64 version or commit, Node.js version, and relevant
|
|
67
|
+
configuration.
|
|
68
|
+
2. A concise description of the issue and the affected public API or code path.
|
|
69
|
+
3. A minimal, tested reproduction, including steps to run it, expected behavior,
|
|
70
|
+
and observed behavior.
|
|
71
|
+
4. A concrete threat model: attacker control, prerequisites, trust boundary, and
|
|
72
|
+
resulting impact. Clearly distinguish what your reproduction proves from what
|
|
73
|
+
you believe might be possible.
|
|
74
|
+
5. An explanation of why the issue affects real deployments beyond a
|
|
75
|
+
deliberately constructed test setup, where this is not obvious.
|
|
76
|
+
|
|
77
|
+
A suggested fix is welcome but does not replace an explanation of
|
|
78
|
+
exploitability. A complete real-world exploit is not always necessary, but the
|
|
79
|
+
report must make a credible security impact clear.
|
|
80
|
+
|
|
81
|
+
### Reports That May Be Treated as Ordinary Bugs
|
|
82
|
+
|
|
83
|
+
The following generally do **not** qualify for private security handling unless
|
|
84
|
+
you can demonstrate an additional, meaningful security boundary crossing:
|
|
85
|
+
|
|
86
|
+
- Issues that require the attacker to control trusted application code,
|
|
87
|
+
administrator-only configuration, or the secret they supposedly extract.
|
|
88
|
+
- Problems caused solely by application-level misuse, exposed credentials, or
|
|
89
|
+
insecure deployment choices outside libbase64's control.
|
|
90
|
+
- Contrived proof-of-concept setups where the tester controls both sides of a
|
|
91
|
+
request, without explaining how a separate attacker could trigger the issue.
|
|
92
|
+
- Parser quirks, unexpected behavior, and bypasses of internal checks with no
|
|
93
|
+
demonstrated security impact.
|
|
94
|
+
- Speculative findings based only on static analysis or an automated tool's
|
|
95
|
+
assessment, without a verified reproduction and credible attack scenario.
|
|
96
|
+
|
|
97
|
+
These may still be valid bugs and may be considered through the normal issue
|
|
98
|
+
tracker. Please coordinate before making any potentially exploitable details
|
|
99
|
+
public. Classification as a bug does not guarantee a fix or a particular
|
|
100
|
+
priority.
|
|
101
|
+
|
|
102
|
+
### Automated and AI-Assisted Reports
|
|
103
|
+
|
|
104
|
+
Automated analysis and AI tools are welcome as research aids, but the person
|
|
105
|
+
submitting a report is responsible for verifying its claims. **Do not submit
|
|
106
|
+
bulk, unverified, or speculative AI-generated findings.** Test each finding
|
|
107
|
+
against a supported release and establish the actual security impact. Reports
|
|
108
|
+
that do not meet the requirements above may be closed without further
|
|
109
|
+
investigation or individual feedback; they can be resubmitted with stronger
|
|
110
|
+
evidence.
|
|
111
|
+
|
|
112
|
+
## Triage and Disclosure
|
|
113
|
+
|
|
114
|
+
libbase64 is maintained by a single person, and there is **no guaranteed
|
|
115
|
+
response or resolution time**. Reports are prioritized based on demonstrated
|
|
116
|
+
impact, exploitability, affected usage, and available maintenance resources.
|
|
117
|
+
|
|
118
|
+
A private report does not automatically become a security advisory. Confirmed
|
|
119
|
+
vulnerabilities may be fixed and disclosed through GitHub Security Advisories;
|
|
120
|
+
other findings may be closed, deferred, or handled as ordinary bugs. Please do
|
|
121
|
+
not disclose details of an unresolved, potentially exploitable issue publicly
|
|
122
|
+
without coordinating with the maintainers.
|
|
123
|
+
|
|
124
|
+
## CVEs and Credit
|
|
125
|
+
|
|
126
|
+
We do not request or manage CVE identifiers. A report being acknowledged, a bug
|
|
127
|
+
being fixed, or a pull request being merged does **not** mean that libbase64 has
|
|
128
|
+
confirmed a security vulnerability or endorsed a CVE assignment. We do not
|
|
129
|
+
guarantee advisories, CVE identifiers, or public credit for reports. For
|
|
130
|
+
confirmed vulnerabilities disclosed through an advisory, substantive reporters
|
|
131
|
+
may be credited if they wish.
|
|
132
|
+
|
|
133
|
+
## Scope
|
|
134
|
+
|
|
135
|
+
In scope: the libbase64 source in this repository: the encoder and decoder
|
|
136
|
+
functions and their stream variants. Of particular interest are inputs that
|
|
137
|
+
crash the process, corrupt output beyond the malformed input, or consume
|
|
138
|
+
resources out of proportion to their size.
|
|
139
|
+
|
|
140
|
+
Out of scope:
|
|
141
|
+
|
|
142
|
+
- Resource consumption that is proportional to a legitimately large input.
|
|
143
|
+
- Vulnerabilities in your own application code, including how it handles decoded
|
|
144
|
+
data.
|
|
145
|
+
- Social-engineering reports.
|
|
146
|
+
|
|
147
|
+
Thank you for helping keep libbase64 and its users safe.
|
|
@@ -28,17 +28,29 @@ function decode(str) {
|
|
|
28
28
|
str = str || '';
|
|
29
29
|
|
|
30
30
|
// Buffer.from() stops decoding at the first padding char, so input made of several
|
|
31
|
-
// padded segments (eg. every line padded on its own) is decoded segment by segment
|
|
31
|
+
// padded segments (eg. every line padded on its own) is decoded segment by segment.
|
|
32
|
+
// Segments are found with indexOf and written into one buffer: splitting the input and
|
|
33
|
+
// keeping a Buffer per segment cost memory per segment, tens of times the input size
|
|
34
|
+
// for a body that pads every line.
|
|
32
35
|
if (typeof str === 'string') {
|
|
33
36
|
let padPos = str.indexOf('=');
|
|
34
|
-
if (padPos >= 0 && /[a-zA-Z0-9+/\-_]/.test(str.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
if (padPos >= 0 && /[a-zA-Z0-9+/\-_]/.test(str.slice(padPos))) {
|
|
38
|
+
// a segment of n characters decodes to at most n * 3 / 4 bytes
|
|
39
|
+
let output = Buffer.alloc(Math.floor((str.length * 3) / 4));
|
|
40
|
+
let length = 0;
|
|
41
|
+
let start = 0;
|
|
42
|
+
while (start <= str.length) {
|
|
43
|
+
let end = str.indexOf('=', start);
|
|
44
|
+
if (end < 0) {
|
|
45
|
+
end = str.length;
|
|
39
46
|
}
|
|
47
|
+
if (end > start) {
|
|
48
|
+
length += output.write(str.substring(start, end), length, 'base64');
|
|
49
|
+
}
|
|
50
|
+
start = end + 1;
|
|
40
51
|
}
|
|
41
|
-
|
|
52
|
+
// copied out so the result does not keep the oversized buffer alive
|
|
53
|
+
return Buffer.from(output.subarray(0, length));
|
|
42
54
|
}
|
|
43
55
|
}
|
|
44
56
|
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [5.4.8](https://github.com/nodemailer/libmime/compare/v5.4.7...v5.4.8) (2026-10-14)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **deps:** update libbase64 to 1.3.3 ([4fa88fb](https://github.com/nodemailer/libmime/commit/4fa88fb0c6ff1f4a06bd67b53bf4bad2b1a6f5c2))
|
|
9
|
+
|
|
3
10
|
## [5.4.7](https://github.com/nodemailer/libmime/compare/v5.4.6...v5.4.7) (2026-10-04)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "libmime",
|
|
3
3
|
"description": "Encode and decode quoted printable and base64 strings",
|
|
4
|
-
"version": "5.4.
|
|
4
|
+
"version": "5.4.8",
|
|
5
5
|
"main": "lib/libmime.js",
|
|
6
6
|
"files": [
|
|
7
7
|
"lib",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"encoding-japanese": "2.4.0",
|
|
28
28
|
"iconv-lite": "0.7.3",
|
|
29
|
-
"libbase64": "1.3.
|
|
29
|
+
"libbase64": "1.3.3",
|
|
30
30
|
"libqp": "2.1.2"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.9.39](https://github.com/nodemailer/mailparser/compare/v3.9.38...v3.9.39) (2026-10-14)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **deps:** update nodemailer to 10.1.1, libmime to 5.4.8 and mailsplit to 5.4.21 ([43ddf3e](https://github.com/nodemailer/mailparser/commit/43ddf3e9214b2a14b20319d1679ffe001a3a6889))
|
|
9
|
+
|
|
3
10
|
## [3.9.38](https://github.com/nodemailer/mailparser/compare/v3.9.37...v3.9.38) (2026-10-10)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -3,21 +3,24 @@
|
|
|
3
3
|
mailparser is an email parsing library for Node.js. It is routinely pointed at
|
|
4
4
|
untrusted, adversarial, and malformed messages, so parser robustness is a
|
|
5
5
|
security concern: a crafted message should never be able to crash the host
|
|
6
|
-
process, exhaust memory or CPU, pollute prototypes, or
|
|
7
|
-
|
|
6
|
+
process, exhaust memory or CPU through amplification, pollute prototypes, or
|
|
7
|
+
leak data across parses. We welcome responsible reports of vulnerabilities that
|
|
8
|
+
present a credible security risk to users. Please distinguish security
|
|
9
|
+
vulnerabilities from ordinary bugs, unusual edge cases, and hardening
|
|
10
|
+
suggestions.
|
|
8
11
|
|
|
9
12
|
## Supported Versions
|
|
10
13
|
|
|
11
|
-
Security fixes are released only against the latest version. We do not
|
|
12
|
-
patches to older
|
|
13
|
-
supported way to receive security updates.
|
|
14
|
+
Security fixes are released only against the latest major version. We do not
|
|
15
|
+
backport patches to older majors, so upgrading to the current release line is
|
|
16
|
+
the supported way to receive security updates.
|
|
14
17
|
|
|
15
18
|
| Version | Supported |
|
|
16
19
|
| ------- | ------------------ |
|
|
17
20
|
| 3.x | :white_check_mark: |
|
|
18
21
|
| < 3.0 | :x: |
|
|
19
22
|
|
|
20
|
-
If you are on an older
|
|
23
|
+
If you are on an older major, please upgrade. See the release notes at
|
|
21
24
|
<https://github.com/nodemailer/mailparser/releases> before updating.
|
|
22
25
|
|
|
23
26
|
> [!NOTE]
|
|
@@ -26,51 +29,126 @@ If you are on an older version, please upgrade. See the release notes at
|
|
|
26
29
|
> [PostalMime](https://github.com/postalsys/postal-mime), which works in both
|
|
27
30
|
> Node.js and browser environments.
|
|
28
31
|
|
|
29
|
-
##
|
|
32
|
+
## What Qualifies as a Security Vulnerability
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
A security report should identify a realistic way for an attacker to cross a
|
|
35
|
+
security boundary in a supported version of mailparser. Unexpected behavior, a
|
|
36
|
+
failing test, or a technically correct proof of concept is not sufficient on its
|
|
37
|
+
own to establish security impact.
|
|
33
38
|
|
|
34
|
-
|
|
39
|
+
In particular, explain:
|
|
35
40
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
- **Attacker capabilities:** Who is the attacker, and what inputs, systems, or
|
|
42
|
+
responses can they control _without_ already having the privileges or secrets
|
|
43
|
+
they are trying to gain?
|
|
44
|
+
- **Attack path:** How does attacker-controlled input reach the affected code
|
|
45
|
+
through a supported public API or a realistic application integration?
|
|
46
|
+
- **Prerequisites:** What configuration and user actions are required? If the
|
|
47
|
+
attack depends on unusual options or deliberately malformed input, explain why
|
|
48
|
+
those conditions could arise in a real application.
|
|
49
|
+
- **Impact:** What confidentiality, integrity, or availability boundary is
|
|
50
|
+
crossed, and what can the attacker achieve as a result?
|
|
42
51
|
|
|
43
|
-
|
|
52
|
+
A vulnerability involving an optional or less common feature can still qualify
|
|
53
|
+
if these conditions are met. Conversely, the existence of a defensive check in
|
|
54
|
+
the code does not, by itself, establish that every bypass of that check has a
|
|
55
|
+
realistic security impact.
|
|
44
56
|
|
|
45
|
-
|
|
46
|
-
OS).
|
|
47
|
-
- A clear description of the issue and its impact (e.g. denial of service via
|
|
48
|
-
CPU or memory exhaustion, ReDoS, prototype pollution, unhandled exception that
|
|
49
|
-
crashes the process, information disclosure between parses).
|
|
50
|
-
- A minimal proof of concept - ideally the raw `.eml` sample or a short script
|
|
51
|
-
that reproduces the issue.
|
|
52
|
-
- Any suggested remediation, if you have one.
|
|
57
|
+
## Reporting a Vulnerability
|
|
53
58
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
reporters who wish to be named are credited.
|
|
59
|
+
**Do not disclose suspected exploitable vulnerabilities through public GitHub
|
|
60
|
+
issues, pull requests, or discussions before coordinating with the
|
|
61
|
+
maintainers.**
|
|
58
62
|
|
|
59
|
-
|
|
63
|
+
Report privately through one of the following channels:
|
|
60
64
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
+
1. **GitHub Security Advisories (preferred):**
|
|
66
|
+
<https://github.com/nodemailer/mailparser/security/advisories/new>.
|
|
67
|
+
2. **Email:** **andris@postalsys.com**, as listed in
|
|
68
|
+
[`SECURITY.txt`](SECURITY.txt). Encrypt sensitive details if possible.
|
|
69
|
+
|
|
70
|
+
### Required Information
|
|
71
|
+
|
|
72
|
+
Please provide enough information to evaluate both the defect and its security
|
|
73
|
+
impact. Reports should include:
|
|
74
|
+
|
|
75
|
+
1. The affected mailparser version or commit, Node.js version, and relevant
|
|
76
|
+
configuration.
|
|
77
|
+
2. A concise description of the issue and the affected public API or code path
|
|
78
|
+
(`MailParser` or `simpleParser`. The raw `.eml` sample that triggers the
|
|
79
|
+
issue is the most useful reproduction).
|
|
80
|
+
3. A minimal, tested reproduction, including steps to run it, expected behavior,
|
|
81
|
+
and observed behavior.
|
|
82
|
+
4. A concrete threat model: attacker control, prerequisites, trust boundary, and
|
|
83
|
+
resulting impact. Clearly distinguish what your reproduction proves from what
|
|
84
|
+
you believe might be possible.
|
|
85
|
+
5. An explanation of why the issue affects real deployments beyond a
|
|
86
|
+
deliberately constructed test setup, where this is not obvious.
|
|
87
|
+
|
|
88
|
+
A suggested fix is welcome but does not replace an explanation of
|
|
89
|
+
exploitability. A complete real-world exploit is not always necessary, but the
|
|
90
|
+
report must make a credible security impact clear.
|
|
91
|
+
|
|
92
|
+
### Reports That May Be Treated as Ordinary Bugs
|
|
93
|
+
|
|
94
|
+
The following generally do **not** qualify for private security handling unless
|
|
95
|
+
you can demonstrate an additional, meaningful security boundary crossing:
|
|
96
|
+
|
|
97
|
+
- Issues that require the attacker to control trusted application code,
|
|
98
|
+
administrator-only configuration, or the secret they supposedly extract.
|
|
99
|
+
- Problems caused solely by application-level misuse, exposed credentials, or
|
|
100
|
+
insecure deployment choices outside mailparser's control.
|
|
101
|
+
- Contrived proof-of-concept setups where the tester controls both sides of a
|
|
102
|
+
request, without explaining how a separate attacker could trigger the issue.
|
|
103
|
+
- Parser quirks, unexpected behavior, and bypasses of internal checks with no
|
|
104
|
+
demonstrated security impact.
|
|
105
|
+
- Speculative findings based only on static analysis or an automated tool's
|
|
106
|
+
assessment, without a verified reproduction and credible attack scenario.
|
|
107
|
+
|
|
108
|
+
These may still be valid bugs and may be considered through the normal issue
|
|
109
|
+
tracker. Please coordinate before making any potentially exploitable details
|
|
110
|
+
public. Classification as a bug does not guarantee a fix or a particular
|
|
111
|
+
priority.
|
|
112
|
+
|
|
113
|
+
### Automated and AI-Assisted Reports
|
|
114
|
+
|
|
115
|
+
Automated analysis and AI tools are welcome as research aids, but the person
|
|
116
|
+
submitting a report is responsible for verifying its claims. **Do not submit
|
|
117
|
+
bulk, unverified, or speculative AI-generated findings.** Test each finding
|
|
118
|
+
against a supported release and establish the actual security impact. Reports
|
|
119
|
+
that do not meet the requirements above may be closed without further
|
|
120
|
+
investigation or individual feedback; they can be resubmitted with stronger
|
|
121
|
+
evidence.
|
|
122
|
+
|
|
123
|
+
## Triage and Disclosure
|
|
124
|
+
|
|
125
|
+
mailparser is maintained by a small team, and there is **no guaranteed response
|
|
126
|
+
or resolution time**. Reports are prioritized based on demonstrated impact,
|
|
127
|
+
exploitability, affected usage, and available maintenance resources.
|
|
128
|
+
|
|
129
|
+
A private report does not automatically become a security advisory. Confirmed
|
|
130
|
+
vulnerabilities may be fixed and disclosed through GitHub Security Advisories;
|
|
131
|
+
other findings may be closed, deferred, or handled as ordinary bugs. Please do
|
|
132
|
+
not disclose details of an unresolved, potentially exploitable issue publicly
|
|
133
|
+
without coordinating with the maintainers.
|
|
134
|
+
|
|
135
|
+
## CVEs and Credit
|
|
136
|
+
|
|
137
|
+
We do not request or manage CVE identifiers. A report being acknowledged, a bug
|
|
138
|
+
being fixed, or a pull request being merged does **not** mean that mailparser
|
|
139
|
+
has confirmed a security vulnerability or endorsed a CVE assignment. We do not
|
|
140
|
+
guarantee advisories, CVE identifiers, or public credit for reports. For
|
|
141
|
+
confirmed vulnerabilities disclosed through an advisory, substantive reporters
|
|
142
|
+
may be credited if they wish.
|
|
65
143
|
|
|
66
144
|
## Scope
|
|
67
145
|
|
|
68
|
-
In scope: the mailparser library source in this repository
|
|
146
|
+
In scope: the mailparser library source in this repository: the streaming MIME
|
|
69
147
|
parser (`MailParser`), the convenience parser (`simpleParser`), header and
|
|
70
|
-
address decoding, charset
|
|
71
|
-
text extraction. Of particular interest are inputs that cause
|
|
72
|
-
consumption, catastrophic regular-expression backtracking,
|
|
73
|
-
or process crashes.
|
|
148
|
+
address decoding, charset and transfer-encoding handling, and attachment and
|
|
149
|
+
HTML/text extraction. Of particular interest are small crafted inputs that cause
|
|
150
|
+
amplified resource consumption, catastrophic regular-expression backtracking,
|
|
151
|
+
prototype pollution, or process crashes.
|
|
74
152
|
|
|
75
153
|
Out of scope:
|
|
76
154
|
|
|
@@ -78,13 +156,11 @@ Out of scope:
|
|
|
78
156
|
Parsed email content is attacker-controlled data; you must sanitize and escape
|
|
79
157
|
it before rendering, storing, or executing it. In particular, the `html` field
|
|
80
158
|
is not sanitized for safe display in a browser.
|
|
81
|
-
- Vulnerabilities in third-party dependencies that are already tracked and fixed
|
|
82
|
-
upstream - report those to the respective project (we will still bump the
|
|
83
|
-
dependency once a fix is available).
|
|
84
|
-
- Issues that require an already-compromised host or a malicious local
|
|
85
|
-
environment.
|
|
86
159
|
- Resource consumption that is proportional to a legitimately large input (for
|
|
87
160
|
example, parsing a genuine 100MB message uses memory) rather than amplified by
|
|
88
161
|
a crafted small input.
|
|
162
|
+
- Vulnerabilities in third-party dependencies that are already tracked upstream
|
|
163
|
+
(we will still bump the dependency once a fix is available).
|
|
164
|
+
- Social-engineering reports.
|
|
89
165
|
|
|
90
166
|
Thank you for helping keep mailparser and its users safe.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mailparser",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.39",
|
|
4
4
|
"description": "Parse e-mails",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
"he": "1.2.0",
|
|
23
23
|
"html-to-text": "10.0.1",
|
|
24
24
|
"iconv-lite": "0.7.3",
|
|
25
|
-
"libmime": "5.4.
|
|
25
|
+
"libmime": "5.4.8",
|
|
26
26
|
"linkify-it": "5.0.2",
|
|
27
|
-
"@zone-eu/mailsplit": "5.4.
|
|
28
|
-
"nodemailer": "10.1.
|
|
27
|
+
"@zone-eu/mailsplit": "5.4.21",
|
|
28
|
+
"nodemailer": "10.1.1",
|
|
29
29
|
"punycode.js": "2.3.1",
|
|
30
30
|
"tlds": "1.261.0"
|
|
31
31
|
},
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"grunt-contrib-nodeunit": "5.0.0",
|
|
42
42
|
"grunt-eslint": "27.0.0",
|
|
43
43
|
"iconv": "3.0.1",
|
|
44
|
-
"prettier": "3.9.
|
|
44
|
+
"prettier": "3.9.10",
|
|
45
45
|
"random-message": "1.1.0"
|
|
46
46
|
},
|
|
47
47
|
"repository": {
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## [10.1.1](https://github.com/nodemailer/nodemailer/compare/v10.1.0...v10.1.1) (2026-10-14)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **fetch:** strip credentials on any cross-origin redirect ([a15360c](https://github.com/nodemailer/nodemailer/commit/a15360cd2cd12e4670e96ab0b7290e8c862391cf))
|
|
9
|
+
|
|
3
10
|
## [10.1.0](https://github.com/nodemailer/nodemailer/compare/v10.0.16...v10.1.0) (2026-10-10)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# Security Policy
|
|
2
2
|
|
|
3
|
-
Nodemailer is a widely deployed, zero-dependency
|
|
4
|
-
reports
|
|
3
|
+
Nodemailer is a widely deployed, zero-dependency email library. We welcome
|
|
4
|
+
responsible reports of vulnerabilities that present a credible security risk to
|
|
5
|
+
users. Please distinguish security vulnerabilities from ordinary bugs, unusual
|
|
6
|
+
edge cases, and hardening suggestions.
|
|
5
7
|
|
|
6
8
|
## Supported Versions
|
|
7
9
|
|
|
@@ -17,45 +19,119 @@ the supported way to receive security updates.
|
|
|
17
19
|
If you are on an older major, please upgrade. See the migration notes at
|
|
18
20
|
<https://nodemailer.com/> before updating.
|
|
19
21
|
|
|
20
|
-
##
|
|
22
|
+
## What Qualifies as a Security Vulnerability
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
A security report should identify a realistic way for an attacker to cross a
|
|
25
|
+
security boundary in a supported version of Nodemailer. Unexpected behavior,
|
|
26
|
+
a failing test, or a technically correct proof of concept is not sufficient on
|
|
27
|
+
its own to establish security impact.
|
|
24
28
|
|
|
25
|
-
|
|
29
|
+
In particular, explain:
|
|
26
30
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
- **Attacker capabilities:** Who is the attacker, and what inputs, systems, or
|
|
32
|
+
responses can they control _without_ already having the privileges or secrets
|
|
33
|
+
they are trying to gain?
|
|
34
|
+
- **Attack path:** How does attacker-controlled input reach the affected code
|
|
35
|
+
through a supported Nodemailer API or a realistic application integration?
|
|
36
|
+
- **Prerequisites:** What configuration and user actions are required? If the
|
|
37
|
+
attack depends on unusual options or deliberately malformed input, explain
|
|
38
|
+
why those conditions could arise in a real application.
|
|
39
|
+
- **Impact:** What confidentiality, integrity, or availability boundary is
|
|
40
|
+
crossed, and what can the attacker achieve as a result?
|
|
32
41
|
|
|
33
|
-
|
|
42
|
+
A vulnerability involving an optional or less common feature can still qualify
|
|
43
|
+
if these conditions are met. Conversely, the existence of a defensive check in
|
|
44
|
+
the code does not, by itself, establish that every bypass of that check has a
|
|
45
|
+
realistic security impact.
|
|
34
46
|
|
|
35
|
-
|
|
36
|
-
- The component involved (e.g. SMTP connection, address parsing, MIME/header
|
|
37
|
-
generation, DKIM).
|
|
38
|
-
- A clear description of the issue and its impact (e.g. header/SMTP command
|
|
39
|
-
injection, information disclosure, DoS).
|
|
40
|
-
- A minimal proof of concept or reproduction steps.
|
|
41
|
-
- Any suggested remediation, if you have one.
|
|
47
|
+
## Reporting a Vulnerability
|
|
42
48
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
Accepted issues are fixed in a new release and coordinated through a GitHub
|
|
46
|
-
Security Advisory, and reporters who wish to be named are credited.
|
|
49
|
+
**Do not disclose suspected exploitable vulnerabilities through public GitHub
|
|
50
|
+
issues, pull requests, or discussions before coordinating with the maintainer.**
|
|
47
51
|
|
|
48
|
-
|
|
52
|
+
Report privately through one of the following channels:
|
|
49
53
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
1. **GitHub Security Advisories (preferred):**
|
|
55
|
+
<https://github.com/nodemailer/nodemailer/security/advisories/new>.
|
|
56
|
+
2. **Email:** **andris@reinman.eu**, as listed in
|
|
57
|
+
[`SECURITY.txt`](SECURITY.txt). Encrypt sensitive details if possible.
|
|
58
|
+
|
|
59
|
+
### Required Information
|
|
60
|
+
|
|
61
|
+
Please provide enough information to evaluate both the defect and its security
|
|
62
|
+
impact. Reports should include:
|
|
63
|
+
|
|
64
|
+
1. The affected Nodemailer version or commit, Node.js version, and relevant
|
|
65
|
+
configuration.
|
|
66
|
+
2. A concise description of the issue and the affected public API or code path.
|
|
67
|
+
3. A minimal, tested reproduction, including steps to run it, expected behavior,
|
|
68
|
+
and observed behavior.
|
|
69
|
+
4. A concrete threat model: attacker control, prerequisites, trust boundary, and
|
|
70
|
+
resulting impact. Clearly distinguish what your reproduction proves from what
|
|
71
|
+
you believe might be possible.
|
|
72
|
+
5. An explanation of why the issue affects applications beyond a deliberately
|
|
73
|
+
constructed test setup, where this is not obvious.
|
|
74
|
+
|
|
75
|
+
A suggested fix is welcome but does not replace an explanation of exploitability.
|
|
76
|
+
A complete real-world exploit is not always necessary, but the report must make
|
|
77
|
+
a credible security impact clear.
|
|
78
|
+
|
|
79
|
+
### Reports That May Be Treated as Ordinary Bugs
|
|
80
|
+
|
|
81
|
+
The following generally do **not** qualify for private security handling unless
|
|
82
|
+
you can demonstrate an additional, meaningful security boundary crossing:
|
|
83
|
+
|
|
84
|
+
- Issues that require the attacker to control trusted application code,
|
|
85
|
+
administrator-only configuration, or the secret they supposedly extract.
|
|
86
|
+
- Problems caused solely by application-level misuse, exposed credentials, or
|
|
87
|
+
insecure deployment choices outside Nodemailer's control.
|
|
88
|
+
- Contrived proof-of-concept setups where the tester controls both sides of a
|
|
89
|
+
request, without explaining how a separate attacker could trigger the issue.
|
|
90
|
+
- Parser quirks, unexpected behavior, and bypasses of internal checks with no
|
|
91
|
+
demonstrated security impact.
|
|
92
|
+
- Speculative findings based only on static analysis or an automated tool's
|
|
93
|
+
assessment, without a verified reproduction and credible attack scenario.
|
|
94
|
+
|
|
95
|
+
These may still be valid bugs and may be considered through the normal issue
|
|
96
|
+
tracker. Please coordinate before making any potentially exploitable details
|
|
97
|
+
public. Classification as a bug does not guarantee a fix or a particular
|
|
98
|
+
priority.
|
|
99
|
+
|
|
100
|
+
### Automated and AI-Assisted Reports
|
|
101
|
+
|
|
102
|
+
Automated analysis and AI tools are welcome as research aids, but the person
|
|
103
|
+
submitting a report is responsible for verifying its claims. **Do not submit
|
|
104
|
+
bulk, unverified, or speculative AI-generated findings.** Test each finding
|
|
105
|
+
against a supported release and establish the actual security impact. Reports
|
|
106
|
+
that do not meet the requirements above may be closed without further
|
|
107
|
+
investigation or individual feedback; they can be resubmitted with stronger
|
|
108
|
+
evidence.
|
|
109
|
+
|
|
110
|
+
## Triage and Disclosure
|
|
111
|
+
|
|
112
|
+
Nodemailer is maintained by a single person, and there is **no guaranteed
|
|
113
|
+
response or resolution time**. Reports are prioritized based on demonstrated
|
|
114
|
+
impact, exploitability, affected usage, and available maintenance resources.
|
|
115
|
+
|
|
116
|
+
A private report does not automatically become a security advisory. Confirmed
|
|
117
|
+
vulnerabilities may be fixed and disclosed through GitHub Security Advisories;
|
|
118
|
+
other findings may be closed, deferred, or handled as ordinary bugs. Please do
|
|
119
|
+
not disclose details of an unresolved, potentially exploitable issue publicly
|
|
120
|
+
without coordinating with the maintainer.
|
|
121
|
+
|
|
122
|
+
## CVEs and Credit
|
|
123
|
+
|
|
124
|
+
We do not request or manage CVE identifiers. A report being acknowledged, a bug
|
|
125
|
+
being fixed, or a pull request being merged does **not** mean that Nodemailer
|
|
126
|
+
has confirmed a security vulnerability or endorsed a CVE assignment. We do not
|
|
127
|
+
guarantee advisories, CVE identifiers, or public credit for reports. For
|
|
128
|
+
confirmed vulnerabilities disclosed through an advisory, substantive reporters
|
|
129
|
+
may be credited if they wish.
|
|
54
130
|
|
|
55
131
|
## Scope
|
|
56
132
|
|
|
57
133
|
In scope: the `nodemailer` package source in this repository: message and MIME
|
|
58
|
-
generation, SMTP/LMTP client
|
|
134
|
+
generation, SMTP/LMTP client behavior, address parsing, header handling, DKIM
|
|
59
135
|
signing, and the bundled transports.
|
|
60
136
|
|
|
61
137
|
Out of scope: vulnerabilities in your own application code, misconfiguration of
|
|
@@ -116,6 +116,10 @@ function parseFetchUrl(url) {
|
|
|
116
116
|
}
|
|
117
117
|
return parsed;
|
|
118
118
|
}
|
|
119
|
+
// the port a request to the URL goes to, explicit or the default of its scheme
|
|
120
|
+
function fetchPort(parsed) {
|
|
121
|
+
return parsed.port ? Number(parsed.port) : parsed.protocol === 'https:' ? 443 : 80;
|
|
122
|
+
}
|
|
119
123
|
function nmfetch(url, options) {
|
|
120
124
|
options = options || {};
|
|
121
125
|
options.fetchRes = options.fetchRes || new node_stream_1.PassThrough();
|
|
@@ -232,7 +236,7 @@ function nmfetch(url, options) {
|
|
|
232
236
|
method,
|
|
233
237
|
host: parsed.hostname,
|
|
234
238
|
path: parsed.path,
|
|
235
|
-
port: parsed
|
|
239
|
+
port: fetchPort(parsed),
|
|
236
240
|
headers,
|
|
237
241
|
// Validate TLS certificates by default. Callers that genuinely need to
|
|
238
242
|
// reach a self-signed/internal host opt out explicitly with
|
|
@@ -334,17 +338,19 @@ function nmfetch(url, options) {
|
|
|
334
338
|
// the shared fetchRes once it times out. Callers listen with req.once().
|
|
335
339
|
return fail(new Error('Unsupported protocol for URL ' + redirectUrl), redirectUrl);
|
|
336
340
|
}
|
|
337
|
-
// Do not forward credentials when the redirect leaves the
|
|
338
|
-
//
|
|
339
|
-
//
|
|
340
|
-
//
|
|
341
|
-
//
|
|
342
|
-
const
|
|
343
|
-
|
|
344
|
-
|
|
341
|
+
// Do not forward credentials when the redirect leaves the origin: a different
|
|
342
|
+
// scheme, host or port is a different security context (an https to http
|
|
343
|
+
// downgrade would also put them on the wire in cleartext). Strip sensitive
|
|
344
|
+
// request headers so an attacker who controls the redirect target cannot
|
|
345
|
+
// harvest them.
|
|
346
|
+
const crossOrigin = redirectParsed.protocol !== parsed.protocol ||
|
|
347
|
+
redirectParsed.hostname !== parsed.hostname ||
|
|
348
|
+
fetchPort(redirectParsed) !== fetchPort(parsed);
|
|
349
|
+
if (options.headers && crossOrigin) {
|
|
345
350
|
const sensitive = ['authorization', 'cookie', 'proxy-authorization'];
|
|
346
351
|
Object.keys(options.headers).forEach(key => {
|
|
347
|
-
|
|
352
|
+
// normalized the way the request headers are built above, a padded name is sent too
|
|
353
|
+
if (sensitive.includes(key.toLowerCase().trim())) {
|
|
348
354
|
delete options.headers[key];
|
|
349
355
|
}
|
|
350
356
|
});
|
|
@@ -78,6 +78,10 @@ function parseFetchUrl(url) {
|
|
|
78
78
|
}
|
|
79
79
|
return parsed;
|
|
80
80
|
}
|
|
81
|
+
// the port a request to the URL goes to, explicit or the default of its scheme
|
|
82
|
+
function fetchPort(parsed) {
|
|
83
|
+
return parsed.port ? Number(parsed.port) : parsed.protocol === 'https:' ? 443 : 80;
|
|
84
|
+
}
|
|
81
85
|
function nmfetch(url, options) {
|
|
82
86
|
options = options || {};
|
|
83
87
|
options.fetchRes = options.fetchRes || new PassThrough();
|
|
@@ -194,7 +198,7 @@ function nmfetch(url, options) {
|
|
|
194
198
|
method,
|
|
195
199
|
host: parsed.hostname,
|
|
196
200
|
path: parsed.path,
|
|
197
|
-
port: parsed
|
|
201
|
+
port: fetchPort(parsed),
|
|
198
202
|
headers,
|
|
199
203
|
// Validate TLS certificates by default. Callers that genuinely need to
|
|
200
204
|
// reach a self-signed/internal host opt out explicitly with
|
|
@@ -296,17 +300,19 @@ function nmfetch(url, options) {
|
|
|
296
300
|
// the shared fetchRes once it times out. Callers listen with req.once().
|
|
297
301
|
return fail(new Error('Unsupported protocol for URL ' + redirectUrl), redirectUrl);
|
|
298
302
|
}
|
|
299
|
-
// Do not forward credentials when the redirect leaves the
|
|
300
|
-
//
|
|
301
|
-
//
|
|
302
|
-
//
|
|
303
|
-
//
|
|
304
|
-
const
|
|
305
|
-
|
|
306
|
-
|
|
303
|
+
// Do not forward credentials when the redirect leaves the origin: a different
|
|
304
|
+
// scheme, host or port is a different security context (an https to http
|
|
305
|
+
// downgrade would also put them on the wire in cleartext). Strip sensitive
|
|
306
|
+
// request headers so an attacker who controls the redirect target cannot
|
|
307
|
+
// harvest them.
|
|
308
|
+
const crossOrigin = redirectParsed.protocol !== parsed.protocol ||
|
|
309
|
+
redirectParsed.hostname !== parsed.hostname ||
|
|
310
|
+
fetchPort(redirectParsed) !== fetchPort(parsed);
|
|
311
|
+
if (options.headers && crossOrigin) {
|
|
307
312
|
const sensitive = ['authorization', 'cookie', 'proxy-authorization'];
|
|
308
313
|
Object.keys(options.headers).forEach(key => {
|
|
309
|
-
|
|
314
|
+
// normalized the way the request headers are built above, a padded name is sent too
|
|
315
|
+
if (sensitive.includes(key.toLowerCase().trim())) {
|
|
310
316
|
delete options.headers[key];
|
|
311
317
|
}
|
|
312
318
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nodemailer",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.1",
|
|
4
4
|
"description": "Easy as cake e-mail sending from your Node.js applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/nodemailer.js",
|
|
@@ -151,7 +151,7 @@
|
|
|
151
151
|
},
|
|
152
152
|
"homepage": "https://nodemailer.com/",
|
|
153
153
|
"devDependencies": {
|
|
154
|
-
"@aws-sdk/client-sesv2": "3.
|
|
154
|
+
"@aws-sdk/client-sesv2": "3.1151.0",
|
|
155
155
|
"@types/node": "20.19.43",
|
|
156
156
|
"bunyan": "1.8.15",
|
|
157
157
|
"c8": "12.0.0",
|
|
@@ -161,14 +161,14 @@
|
|
|
161
161
|
"libbase64": "1.3.2",
|
|
162
162
|
"libmime": "5.4.7",
|
|
163
163
|
"libqp": "2.1.2",
|
|
164
|
-
"mailauth": "7.
|
|
165
|
-
"prettier": "3.9.
|
|
164
|
+
"mailauth": "7.3.0",
|
|
165
|
+
"prettier": "3.9.10",
|
|
166
166
|
"proxy": "1.0.2",
|
|
167
167
|
"proxy-test-server": "1.0.0",
|
|
168
|
-
"smtp-server": "3.19.
|
|
168
|
+
"smtp-server": "3.19.21",
|
|
169
169
|
"tsx": "4.23.15",
|
|
170
170
|
"typescript": "6.0.3",
|
|
171
|
-
"typescript-eslint": "8.71.
|
|
171
|
+
"typescript-eslint": "8.71.2"
|
|
172
172
|
},
|
|
173
173
|
"engines": {
|
|
174
174
|
"node": ">=20.0.0"
|
package/package.json
CHANGED
|
@@ -79,15 +79,15 @@
|
|
|
79
79
|
"constructs": "^10.5.1"
|
|
80
80
|
},
|
|
81
81
|
"dependencies": {
|
|
82
|
-
"@aws-sdk/client-cloudwatch-logs": "^3.
|
|
83
|
-
"@aws-sdk/client-route-53": "^3.
|
|
84
|
-
"@aws-sdk/client-s3": "^3.
|
|
85
|
-
"@aws-sdk/client-ses": "^3.
|
|
86
|
-
"@aws-sdk/client-ssm": "^3.
|
|
82
|
+
"@aws-sdk/client-cloudwatch-logs": "^3.1152.0",
|
|
83
|
+
"@aws-sdk/client-route-53": "^3.1152.0",
|
|
84
|
+
"@aws-sdk/client-s3": "^3.1152.0",
|
|
85
|
+
"@aws-sdk/client-ses": "^3.1152.0",
|
|
86
|
+
"@aws-sdk/client-ssm": "^3.1152.0",
|
|
87
87
|
"@mavogel/mvc-projen": "^0.0.60",
|
|
88
88
|
"cdk-nag": "^3.0.1",
|
|
89
89
|
"constructs": "^10.5.1",
|
|
90
|
-
"mailparser": "^3.9.
|
|
90
|
+
"mailparser": "^3.9.39",
|
|
91
91
|
"uuid": "^14.0.3"
|
|
92
92
|
},
|
|
93
93
|
"bundledDependencies": [
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
"publishConfig": {
|
|
123
123
|
"access": "public"
|
|
124
124
|
},
|
|
125
|
-
"version": "0.1.
|
|
125
|
+
"version": "0.1.21",
|
|
126
126
|
"jest": {
|
|
127
127
|
"coverageProvider": "v8",
|
|
128
128
|
"transformIgnorePatterns": [
|