Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

IoReader::read(): user-provided Read on uninitialized buffer may cause UB #1

Closed
JOE1994 opened this issue Jan 27, 2021 · 1 comment
Closed

Comments

@JOE1994
Copy link

JOE1994 commented Jan 27, 2021

Hello 🦀,
we (Rust group @sslab-gatech) found a memory-safety/soundness issue in this crate while scanning Rust code on crates.io for potential vulnerabilities.

Issue Description

ms3d/src/read.rs

Lines 18 to 27 in 9bba59d

impl<R: io::Read> Read for IoReader<R> {
fn read(&mut self, len: usize) -> io::Result<&[u8]> {
unsafe {
self.buf.reserve(len);
let slice = self.buf.get_unchecked_mut(..len);
self.rdr.read_exact(slice)?;
Ok(slice)
}
}
}

IoReader::read() method creates an uninitialized buffer and passes it to user-provided Read implementation. This is unsound, because it allows safe Rust code to exhibit an undefined behavior (read from uninitialized memory). This method is invokable from Model::from_reader() method.

This part from the Read trait documentation explains the issue:

It is your responsibility to make sure that buf is initialized before calling read. Calling read with an uninitialized buf (of the kind one obtains via MaybeUninit<T>) is not safe, and can lead to undefined behavior.

How to fix the issue?

The Naive & safe way to fix the issue is to always zero-initialize a buffer before lending it to a user-provided Read implementation. Note that this approach will add runtime performance overhead of zero-initializing the buffer.

As of Jan 2021, there is not yet an ideal fix that works in stable Rust with no performance overhead. Below are links to relevant discussions & suggestions for the fix.

@JOE1994
Copy link
Author

JOE1994 commented Jan 30, 2021

Thank you for the quick fix 👍

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant