Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings
CVE-2024-43806

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

rustix's `rustix::fs::Dir` iterator with the `linux_raw` backend can cause memory explosion

Moderate severity GitHub Reviewed PublishedOct 17, 2023 in bytecodealliance/rustix • UpdatedAug 27, 2024

Package

cargorustix (Rust)

Affected versions

>= 0.35.11, < 0.35.15
>= 0.36.0, < 0.36.16
>= 0.37.0, < 0.37.25
>= 0.38.0, < 0.38.19

Patched versions

0.35.15
0.36.16
0.37.25
0.38.19

Description

Summary

When usingrustix::fs::Dir using thelinux_raw backend, it's possible for the iterator to "get stuck" when an IO error is encountered. Combined with a memory over-allocation issue inrustix::fs::Dir::read_more, this can cause quick and unbounded memory explosion (gigabytes in a few seconds if used on a hot path) and eventually lead to an OOM crash of the application.

Details

Discovery

The symptoms were initially discovered inimsnif/bandwhich#284. That post has lots of details of our investigation. Seethis post and theDiscord thread for details.

Diagnosis

This issue is caused by the combination of two independent bugs:

  1. Stuck iterator
  • Therustix::fs::Dir iterator can fail to halt after encountering an IO error, causing the caller to be stuck in an infinite loop.
  1. Memory over-allocation
  • Dir::read_more incorrectly grows the read buffer unconditionally each time it is called, regardless of necessity.

Since<Dir as Iterator>::next callsDir::read, which in turn callsDir::read_more, this means an IO error encountered during reading a directory can lead to rapid and unbounded growth of memory use.

PoC

fnmain() ->Result<(),Box<dyn std::error::Error>>{// create a directory, get a FD to it, then unlink the directory but keep the FD    std::fs::create_dir("tmp_dir")?;let dir_fd = rustix::fs::openat(        rustix::fs::CWD,        rustix::cstr!("tmp_dir"),        rustix::fs::OFlags::RDONLY | rustix::fs::OFlags::CLOEXEC,        rustix::fs::Mode::empty(),)?;    std::fs::remove_dir("tmp_dir")?;// iterator gets stuck in infinite loop and memory explodes    rustix::fs::Dir::read_from(dir_fd)?// the iterator keeps returning `Some(Err(_))`, but never halts by returning `None`// therefore if the implementation ignores the error (or otherwise continues// after seeing the error instead of breaking), the loop will not halt.filter_map(|dirent_maybe_error| dirent_maybe_error.ok()).for_each(|dirent|{// your happy pathprintln!("{dirent:?}");});Ok(())}

Impact

If a program tries to access a directory with its file descriptor after the file has been unlinked (or any other action that leaves theDir iterator in the stuck state), and the implementation does not break after seeing an error, it can cause a memory explosion.

As an example, Linux's various virtual file systems (e.g./proc,/sys) can contain directories that spontaneously pop in and out of existence. Attempting to iterate over them usingrustix::fs::Dir directly or indirectly (e.g. with theprocfs crate) can trigger this fault condition if the implementation decides to continue on errors.

An attacker knowledgeable about the implementation details of a vulnerable target can therefore try to trigger this fault condition via any one or a combination of several available APIs. If successful, the application host will quickly run out of memory, after which the application will likely be terminated by an OOM killer, leading to denial of service.

References

@sunfishcodesunfishcode published to bytecodealliance/rustixOct 17, 2023
Published to the GitHub Advisory DatabaseOct 18, 2023
ReviewedOct 18, 2023
Published by theNational Vulnerability DatabaseAug 26, 2024
Last updatedAug 27, 2024

Severity

Moderate

CVSS overall score

This score calculates overall vulnerability severity from 0 to 10 and is based on the Common Vulnerability Scoring System (CVSS).
/ 10

CVSS v3 base metrics

Attack vector
Network
Attack complexity
Low
Privileges required
Low
User interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

CVSS v3 base metrics

Attack vector:More severe the more the remote (logically and physically) an attacker can be in order to exploit the vulnerability.
Attack complexity:More severe for the least complex attacks.
Privileges required:More severe if no privileges are required.
User interaction:More severe when no user interaction is required.
Scope:More severe when a scope change occurs, e.g. one vulnerable component impacts resources in components beyond its security scope.
Confidentiality:More severe when loss of data confidentiality is highest, measuring the level of data access available to an unauthorized user.
Integrity:More severe when loss of data integrity is the highest, measuring the consequence of data modification possible by an unauthorized user.
Availability:More severe when the loss of impacted component availability is highest.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H

EPSS score

Exploit Prediction Scoring System (EPSS)

This score estimates the probability of this vulnerability being exploited within the next 30 days. Data provided byFIRST.
(47th percentile)

Weaknesses

Uncontrolled Resource Consumption

The product does not properly control the allocation and maintenance of a limited resource, thereby enabling an actor to influence the amount of resources consumed, eventually leading to the exhaustion of available resources.Learn more on MITRE.

CVE ID

CVE-2024-43806

GHSA ID

GHSA-c827-hfw6-qwvm

Credits

LoadingChecking history
See something to contribute?Suggest improvements for this vulnerability.

[8]ページ先頭

©2009-2025 Movatter.jp