-
Notifications
You must be signed in to change notification settings - Fork 20
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add openat/unlinkat/etc. abstractions to ReadDir/DirEntry/OpenOptions #259
Comments
I've been reassured that there is not such a hazard to using |
SGTM. I'm also interested in this from the perspective of avoiding lots of tiny little allocations when crawling a large directory tree. (It's as hand wavy as it sounds.) |
This has been accepted. Should this issue be closed now? Further discussion can happen on the tracking issue. |
I think without rust-lang/rust#104385 most of these won't be implementable on older macOS, FYI. (Mostly providing this as a link for further motivation of that change) |
Where is the tracking issue? |
The tracking issue for what? |
@ChrisDenton mentioned that further discussion should happen on the tracking issue. |
Oh, yeah. Good question, I missed that too. |
I mean a tracking issue should be created. Not that there is one already. The process is ACP -> Tracking issues -> (implementation, refinement, etc). |
tracking issue: rust-lang/rust#120426 |
Proposal
Problem statement
Current
std::fs
APIs lead to code that's vulnerable to TOCTOU issues because performing any operation relative to a directory currently has to be done by composing the directory's path and the relative path. This happens because the directory structure can change under the user's nose between enumerating the directory entries and then trying to open/create/delete/... a file in that directory.cap_std::fs::Dir by @sunfishcode already solves this.
Motivating examples or use cases
CVE-2022-21658, CVE-2018-15664, CVE-2021-20316 and similar symlink-TOCTOUs in many applications.
Solution sketch
This is more or less adopting
fs::{Dir, DirEntry}
APIs or a subset thereof into std.It may be possible to add the
Dir
methods directly toReadDir
instead.The implementation work can be done piecemeal:
copy
,create_dir_all
etc.Open Questions
How do we deal with windows? NtCreateFile is considered internal. We're already using it to make
remove_dir_all
robust against races but in principle we could revert to simpler implementation. Adding public APIs that require it would be a foward-compatibility hazard.How do we handle platforms that lack some of the necessary APIs? Emulate them via path manipulation (which reintroduces the TOCTOU) or return
Unsupported
errors?Alternatives
Status Quo
Crates handling this already exist, we can tell users to use them in security-sensitive contexts.
IO-safety APIs for ReadDir
This would simplify using
std::ReadDir
as a directory handle and then passing it to crates likecap_std
oropenat
That would adding
From<OwnedFd>
,Into<OwnedFd>
,AsFd
(and windows equivalents) toReadDir
.Issues:
*DIR
can lead to undefined behavior.I assume in practice this mostly leads to unspecified results, not memory unsafety, but who knows. To be on the safe side we'd have to reimplement what glibc does (getdents and such on each platform) to do this safely, which is a significant amount of work because those implementations aren't portable.
Either return ErrorKind::Unsupported on those platforms or figure out some workarounds
Links and related work
The text was updated successfully, but these errors were encountered: