Race condition in `tokio::time::Interval` on Tokio v1.54.0
## Summary On the multi-threaded runtime, there is a race condition between `Interval::poll_tick` and the runtime's time driver. This affects `Interval` only. `Sleep` and `Timeout` are **not** affected. ## Details In Tokio v1.54.0, a race condition between `tokio::time::Interval::poll_tick` (including `.tick().await`) and the runtime time driver can drop an internal timer entry without synchronizing with the driver thread that is firing it. This causes a data race and use-after-free on the timer's waker and task state in safe Rust, leading to assertion panics, task reference-count corruption, or heap memory corruption. This bug was introduced by https://github.com/tokio-rs/tokio/pull/8458, and it was fixed by https://github.com/tokio-rs/tokio/pull/8692. ## Impact This may lead to crashes and use-after-frees in applications using `Interval` on a multi-threaded runtime. Since this issue is known to lead to crashes in production systems, the v1.54.0 release of Tokio has been yanked. ## Credits Thank you to [creepycode](https://github.com/ByteZ1337) and [carabistouille](https://github.com/carabistouflette) for reporting this privately using the procedure outlined in our security policy. They both reported the issue independently of each other.
- Products
- tokio
- Affected versions
- Not specified
- Fixed versions
- 1.54.1
- CVEs
- CVE-2026-115567
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 1 Nov 2026, 04:03 UTC · Revision 1
Source evidence
Race condition in `tokio::time::Interval` on Tokio v1.54.0
core-osv · Original sourcePublished 21 Oct 2026, 12:00 UTC
## Summary On the multi-threaded runtime, there is a race condition between `Interval::poll_tick` and the runtime's time driver. This affects `Interval` only. `Sleep` and `Timeout` are **not** affected. ## Details In Tokio v1.54.0, a race condition between `tokio::time::Interval::poll_tick` (including `.tick().await`) and the runtime time driver can drop an internal timer entry without synchronizing with the driver thread that is firing it. This causes a data race and use-after-free on the timer's waker and task state in safe Rust, leading to assertion panics, task reference-count corruption, or heap memory corruption. This bug was introduced by https://github.com/tokio-rs/tokio/pull/8458, and it was fixed by https://github.com/tokio-rs/tokio/pull/8692. ## Impact This may lead to crashes and use-after-frees in applications using `Interval` on a multi-threaded runtime. Since this issue is known to lead to crashes in production systems, the v1.54.0 release of Tokio has been yanked. ## Credits Thank you to [creepycode](https://github.com/ByteZ1337) and [carabistouille](https://github.com/carabistouflette) for reporting this privately using the procedure outlined in our security policy. They both reported the issue independently of each other.
osv:RUSTSEC-2026-0384
tokio
Fixed versions: 1.54.1
Complete source record
{
"id": "445fc8cd3f8fa805df41fd83c31f5f7ac095866552de132dc289b058f171cb26",
"url": "https://osv.dev/vulnerability/RUSTSEC-2026-0384",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Race condition in `tokio::time::Interval` on Tokio v1.54.0",
"summary": "## Summary On the multi-threaded runtime, there is a race condition between `Interval::poll_tick` and the runtime's time driver. This affects `Interval` only. `Sleep` and `Timeout` are **not** affected. ## Details In Tokio v1.54.0, a race condition between `tokio::time::Interval::poll_tick` (including `.tick().await`) and the runtime time driver can drop an internal timer entry without synchronizing with the driver thread that is firing it. This causes a data race and use-after-free on the timer's waker and task state in safe Rust, leading to assertion panics, task reference-count corruption, or heap memory corruption. This bug was introduced by https://github.com/tokio-rs/tokio/pull/8458, and it was fixed by https://github.com/tokio-rs/tokio/pull/8692. ## Impact This may lead to crashes and use-after-frees in applications using `Interval` on a multi-threaded runtime. Since this issue is known to lead to crashes in production systems, the v1.54.0 release of Tokio has been yanked. ## Credits Thank you to [creepycode](https://github.com/ByteZ1337) and [carabistouille](https://github.com/carabistouflette) for reporting this privately using the procedure outlined in our security policy. They both reported the issue independently of each other.",
"evidence": "osv:RUSTSEC-2026-0384",
"products": [
{
"name": {
"value": "tokio",
"evidence": "/affected/0/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "1.54.1",
"evidence": "/affected/0/ranges"
}
],
"affected_versions": []
}
],
"severity": "unknown",
"structured": {
"id": "RUSTSEC-2026-0384",
"aliases": [
"CVE-2026-115567",
"GHSA-5wjr-9356-4wc8",
"RUSTSEC-2026-0384"
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.54.0"
},
{
"fixed": "1.54.1"
}
]
}
],
"package": {
"name": "tokio",
"purl": "pkg:cargo/tokio",
"ecosystem": "crates.io"
},
"database_specific": {
"cvss": null,
"source": "https://github.com/rustsec/advisory-db/blob/osv/crates/RUSTSEC-2026-0384.json",
"categories": [
"memory-corruption",
"thread-safety"
],
"informational": null
},
"ecosystem_specific": {
"affects": {
"os": [],
"arch": [],
"functions": []
},
"affected_functions": null
}
}
],
"modified": "2026-10-24T08:30:13Z",
"provider": "osv",
"references": [
"https://crates.io/crates/tokio",
"https://rustsec.org/advisories/RUSTSEC-2026-0384.html",
"https://github.com/tokio-rs/tokio/pull/8692"
],
"provider_metadata": {
"license": "CC0-1.0"
}
},
"related_cves": [
{
"value": "CVE-2026-115567",
"evidence": "/aliases"
}
],
"security_relevant": true,
"severity_evidence": null
},
"source_id": "core-osv",
"document_id": 428918,
"published_at": "2026-10-21T12:00:00+00:00"
}