---
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'
---

## Overview

`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.

This violates I/O safety in two ways:

1. `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.
2. 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.

Starting 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`.

## Affected packages

- `tokio >= 1.52.0, < 1.53.3`

## Remediation

Upgrade to a patched release:

- `tokio 1.53.3`
