{"id":"RUSTSEC-2026-0386","revision":"ccdecc300d71493395bb760d805db843","records":[{"revision":"ccdecc300d71493395bb760d805db843","observedAt":"2026-10-24T13:19:54.901+00:00","statement":{"source":"osv","id":"RUSTSEC-2026-0386","aliases":[],"title":"`AsyncFd::new` and related constructors violate I/O safety","description":"`tokio::io::unix::AsyncFd` provides safe constructors (`new`, `with_interest`, `try_new`, and `try_with_interest`) that accept any `T: AsRawFd` rather than requiring proof of ownership or validity of the file descriptor. Because `RawFd` implements `AsRawFd`, safe code can construct an `AsyncFd` from an arbitrary or closed file descriptor, or close/replace the underlying file descriptor while the `AsyncFd` is still alive.\n\nThis violates I/O safety in two ways:\n\n1. `AsyncFd<T>` implements `AsFd` for all `T: AsRawFd` by calling `BorrowedFd::borrow_raw(self.as_raw_fd())`, allowing safe code to obtain an arbitrary `BorrowedFd<'_>` without owning the file descriptor.\n2. Tokio's I/O driver stores a pointer to an internal allocation in the `epoll`/`kqueue` user data for registered file descriptors. If the underlying file descriptor is duplicated and then closed while an `AsyncFd` is alive, and the OS reuses that file descriptor number for a another IO resource on the same runtime, dropping the first `AsyncFd` deregisters the reused file descriptor number and frees the first while the original file description remains registered in `epoll`, leading to a use-after-free when a readiness event fires.\n\nStarting in Tokio 1.51.6, 1.53.3, and 1.54.0, `AsyncFd::new`, `AsyncFd::with_interest`, `AsyncFd::try_new`, and `AsyncFd::try_with_interest` are deprecated in favor of the `unsafe` constructors `AsyncFd::register` and `AsyncFd::register_with_interest`. Callers must ensure that the file descriptor remains valid, open, and unchanged for the lifetime of the `AsyncFd`.","state":0,"publishedAt":"2026-10-13T12:00:00+00:00","modifiedAt":"2026-10-23T14:45:03.8478649+00:00","affected":[{"ecosystem":"crates.io","name":"tokio","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0.3.2"},{"kind":"fixed","version":"1.51.6"},{"kind":"introduced","version":"1.52.0"},{"kind":"fixed","version":"1.53.3"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[],"references":["https://crates.io/crates/tokio","https://rustsec.org/advisories/RUSTSEC-2026-0386.html","https://github.com/tokio-rs/tokio/pull/8587","https://github.com/tokio-rs/tokio/issues/8538","https://github.com/tokio-rs/tokio/issues/8539"],"sourceUrl":"https://osv.dev/vulnerability/RUSTSEC-2026-0386","license":"OSV · upstream source license applies","key":"osv:RUSTSEC-2026-0386","identifiers":["RUSTSEC-2026-0386"]},"retained":false,"historicalAffected":[]}],"coverage":[]}