{"id":"RUSTSEC-2026-0386","title":"`AsyncFd::new` and related constructors violate I/O safety","summary":"`AsyncFd::new` and related constructors violate I/O safety","severity":"none","vendor":"tokio","product":"tokio","ecosystem":"rust","affected":["tokio >= 1.52.0, < 1.53.3"],"patched":["tokio 1.53.3"],"published":"2026-10-13","updated":"2026-10-23","sourceUpdated":"2026-10-23T14:45:03.847864944Z","source":"OSV","sourceUrl":"https://osv.dev/vulnerability/RUSTSEC-2026-0386","references":[{"url":"https://crates.io/crates/tokio"},{"url":"https://rustsec.org/advisories/RUSTSEC-2026-0386.html"},{"url":"https://github.com/tokio-rs/tokio/pull/8587"},{"url":"https://github.com/tokio-rs/tokio/issues/8538"},{"url":"https://github.com/tokio-rs/tokio/issues/8539"}],"tags":["osv","rust"],"ingestedAt":"2026-10-24T11:59:36.122Z","slug":"RUSTSEC-2026-0386","body":"## Overview\n\n`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`.\n\n## Affected packages\n\n- `tokio >= 1.52.0, < 1.53.3`\n\n## Remediation\n\nUpgrade to a patched release:\n\n- `tokio 1.53.3`","depth":"sunlit","depthScore":3,"depthScoreParts":{"impact":2.8,"likelihood":0,"exploitation":0,"ransomware":0},"changes":[]}