FKIE_CVE-2026-27195
Vulnerability from fkie_nvd - Published: 2026-02-24 22:16 - Updated: 2026-02-25 15:20
Severity ?
Summary
Wasmtime is a runtime for WebAssembly. Starting with Wasmtime 39.0.0, the `component-model-async` feature became the default, which brought with it a new implementation of `[Typed]Func::call_async` which made it capable of calling async-typed guest export functions. However, that implementation had a bug leading to a panic under certain circumstances: First, the host embedding calls `[Typed]Func::call_async` on a function exported by a component, polling the returned `Future` once. Second, the component function yields control to the async runtime (e.g. Tokio), e.g. due to a call to host function registered using `LinkerInstance::func_wrap_async` which yields, or due an epoch interruption. Third, the host embedding drops the `Future` after polling it once. This leaves the component instance in a non-reenterable state since the call never had a chance to complete. Fourth, the host embedding calls `[Typed]Func::call_async` again, polling the returned `Future`. Since the component instance cannot be entered at this point, the call traps, but not before allocating a task and thread for the call. Fifth, the host embedding ignores the trap and drops the `Future`. This panics due to the runtime attempting to dispose of the task created above, which panics since the thread has not yet exited. When a host embedder using the affected versions of Wasmtime calls `wasmtime::component::[Typed]Func::call_async` on a guest export and then drops the returned future without waiting for it to resolve, and then does so again with the same component instance, Wasmtime will panic. Embeddings that have the `component-model-async` compile-time feature disabled are unaffected. Wasmtime 40.0.4 and 41.0.4 have been patched to fix this issue. Versions 42.0.0 and later are not affected. If an embedding is not actually using any component-model-async features then disabling the `component-model-async` Cargo feature can work around this issue. This issue can also be worked around by either ensuring every `call_async` future is awaited until it completes or refraining from using the `Store` again after dropping a not-yet-resolved `call_async` future.
References
Impacted products
| Vendor | Product | Version | |
|---|---|---|---|
| bytecodealliance | wasmtime | * | |
| bytecodealliance | wasmtime | * |
{
"configurations": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:bytecodealliance:wasmtime:*:*:*:*:*:rust:*:*",
"matchCriteriaId": "B17AD22F-CE3D-4105-8E28-2EF67BD2185E",
"versionEndExcluding": "40.0.4",
"versionStartIncluding": "39.0.0",
"vulnerable": true
},
{
"criteria": "cpe:2.3:a:bytecodealliance:wasmtime:*:*:*:*:*:rust:*:*",
"matchCriteriaId": "9BF3C16E-C1D8-468A-9F60-9F6F45DA98E3",
"versionEndExcluding": "41.0.4",
"versionStartIncluding": "41.0.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
]
}
],
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "Wasmtime is a runtime for WebAssembly. Starting with Wasmtime 39.0.0, the `component-model-async` feature became the default, which brought with it a new implementation of `[Typed]Func::call_async` which made it capable of calling async-typed guest export functions. However, that implementation had a bug leading to a panic under certain circumstances: First, the host embedding calls `[Typed]Func::call_async` on a function exported by a component, polling the returned `Future` once. Second, the component function yields control to the async runtime (e.g. Tokio), e.g. due to a call to host function registered using `LinkerInstance::func_wrap_async` which yields, or due an epoch interruption. Third, the host embedding drops the `Future` after polling it once. This leaves the component instance in a non-reenterable state since the call never had a chance to complete. Fourth, the host embedding calls `[Typed]Func::call_async` again, polling the returned `Future`. Since the component instance cannot be entered at this point, the call traps, but not before allocating a task and thread for the call. Fifth, the host embedding ignores the trap and drops the `Future`. This panics due to the runtime attempting to dispose of the task created above, which panics since the thread has not yet exited. When a host embedder using the affected versions of Wasmtime calls `wasmtime::component::[Typed]Func::call_async` on a guest export and then drops the returned future without waiting for it to resolve, and then does so again with the same component instance, Wasmtime will panic. Embeddings that have the `component-model-async` compile-time feature disabled are unaffected. Wasmtime 40.0.4 and 41.0.4 have been patched to fix this issue. Versions 42.0.0 and later are not affected. If an embedding is not actually using any component-model-async features then disabling the `component-model-async` Cargo feature can work around this issue. This issue can also be worked around by either ensuring every `call_async` future is awaited until it completes or refraining from using the `Store` again after dropping a not-yet-resolved `call_async` future."
},
{
"lang": "es",
"value": "Wasmtime es un entorno de ejecuci\u00f3n para WebAssembly. A partir de Wasmtime 39.0.0, la caracter\u00edstica \u0027component-model-async\u0027 se convirti\u00f3 en la predeterminada, lo que trajo consigo una nueva implementaci\u00f3n de \u0027[Typed]Func::call_async\u0027 que la hizo capaz de llamar a funciones de exportaci\u00f3n de invitado de tipo as\u00edncrono. Sin embargo, esa implementaci\u00f3n ten\u00eda un error que provocaba un p\u00e1nico bajo ciertas circunstancias: Primero, la incrustaci\u00f3n anfitriona llama a \u0027[Typed]Func::call_async\u0027 en una funci\u00f3n exportada por un componente, sondeando la \u0027Future\u0027 devuelta una vez. Segundo, la funci\u00f3n del componente cede el control al entorno de ejecuci\u00f3n as\u00edncrono (por ejemplo, Tokio), por ejemplo, debido a una llamada a una funci\u00f3n anfitriona registrada usando \u0027LinkerInstance::func_wrap_async\u0027 que cede, o debido a una interrupci\u00f3n de \u00e9poca. Tercero, la incrustaci\u00f3n anfitriona descarta la \u0027Future\u0027 despu\u00e9s de sondearla una vez. Esto deja la instancia del componente en un estado no reentrante ya que la llamada nunca tuvo la oportunidad de completarse. Cuarto, la incrustaci\u00f3n anfitriona llama de nuevo a \u0027[Typed]Func::call_async\u0027, sondeando la \u0027Future\u0027 devuelta. Dado que la instancia del componente no puede ser accedida en este punto, la llamada atrapa, pero no antes de asignar una tarea y un hilo para la llamada. Quinto, la incrustaci\u00f3n anfitriona ignora la trampa y descarta la \u0027Future\u0027. Esto provoca un p\u00e1nico debido a que el entorno de ejecuci\u00f3n intenta disponer de la tarea creada anteriormente, lo que provoca un p\u00e1nico ya que el hilo a\u00fan no ha salido. Cuando un incrustador anfitri\u00f3n que utiliza las versiones afectadas de Wasmtime llama a \u0027wasmtime::component::[Typed]Func::call_async\u0027 en una exportaci\u00f3n de invitado y luego descarta la \u0027Future\u0027 devuelta sin esperar a que se resuelva, y luego lo hace de nuevo con la misma instancia del componente, Wasmtime entrar\u00e1 en p\u00e1nico. Las incrustaciones que tienen la caracter\u00edstica \u0027component-model-async\u0027 en tiempo de compilaci\u00f3n deshabilitada no se ven afectadas. Wasmtime 40.0.4 y 41.0.4 han sido parcheadas para solucionar este problema. Las versiones 42.0.0 y posteriores no se ven afectadas. Si una incrustaci\u00f3n no est\u00e1 utilizando realmente ninguna caracter\u00edstica de component-model-async, entonces deshabilitar la caracter\u00edstica Cargo \u0027component-model-async\u0027 puede solucionar este problema. Este problema tambi\u00e9n puede solucionarse asegurando que cada \u0027Future\u0027 de \u0027call_async\u0027 sea esperada hasta que se complete o absteni\u00e9ndose de usar el \u0027Store\u0027 de nuevo despu\u00e9s de descartar una \u0027Future\u0027 de \u0027call_async\u0027 a\u00fan no resuelta."
}
],
"id": "CVE-2026-27195",
"lastModified": "2026-02-25T15:20:22.360",
"metrics": {
"cvssMetricV31": [
{
"cvssData": {
"attackComplexity": "LOW",
"attackVector": "NETWORK",
"availabilityImpact": "HIGH",
"baseScore": 7.5,
"baseSeverity": "HIGH",
"confidentialityImpact": "NONE",
"integrityImpact": "NONE",
"privilegesRequired": "NONE",
"scope": "UNCHANGED",
"userInteraction": "NONE",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
"version": "3.1"
},
"exploitabilityScore": 3.9,
"impactScore": 3.6,
"source": "nvd@nist.gov",
"type": "Primary"
}
],
"cvssMetricV40": [
{
"cvssData": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "HIGH",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"availabilityRequirement": "NOT_DEFINED",
"baseScore": 6.9,
"baseSeverity": "MEDIUM",
"confidentialityRequirement": "NOT_DEFINED",
"exploitMaturity": "NOT_DEFINED",
"integrityRequirement": "NOT_DEFINED",
"modifiedAttackComplexity": "NOT_DEFINED",
"modifiedAttackRequirements": "NOT_DEFINED",
"modifiedAttackVector": "NOT_DEFINED",
"modifiedPrivilegesRequired": "NOT_DEFINED",
"modifiedSubAvailabilityImpact": "NOT_DEFINED",
"modifiedSubConfidentialityImpact": "NOT_DEFINED",
"modifiedSubIntegrityImpact": "NOT_DEFINED",
"modifiedUserInteraction": "NOT_DEFINED",
"modifiedVulnAvailabilityImpact": "NOT_DEFINED",
"modifiedVulnConfidentialityImpact": "NOT_DEFINED",
"modifiedVulnIntegrityImpact": "NOT_DEFINED",
"privilegesRequired": "LOW",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "HIGH",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "PASSIVE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:H/AT:P/PR:L/UI:P/VC:N/VI:N/VA:H/SC:N/SI:N/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
"version": "4.0",
"vulnAvailabilityImpact": "HIGH",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "NONE",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"source": "security-advisories@github.com",
"type": "Secondary"
}
]
},
"published": "2026-02-24T22:16:32.253",
"references": [
{
"source": "security-advisories@github.com",
"tags": [
"Product"
],
"url": "https://bytecodealliance.zulipchat.com/#narrow/channel/206238-general/topic/.E2.9C.94.20Panic.20in.20Wasmtime.2041.2E0.2E3.20.28runtime.2Fconcurrent.2Fcomponent.29/with/574438798"
},
{
"source": "security-advisories@github.com",
"tags": [
"Patch"
],
"url": "https://github.com/bytecodealliance/wasmtime/commit/9e51c0d9a240a9613d279c061f82286bd11383fd"
},
{
"source": "security-advisories@github.com",
"tags": [
"Patch"
],
"url": "https://github.com/bytecodealliance/wasmtime/commit/d86b00736b9ece60b3c81e52f7a7e4cdd9f7d895"
},
{
"source": "security-advisories@github.com",
"tags": [
"Product",
"Release Notes"
],
"url": "https://github.com/bytecodealliance/wasmtime/releases/tag/v40.0.4"
},
{
"source": "security-advisories@github.com",
"tags": [
"Product",
"Release Notes"
],
"url": "https://github.com/bytecodealliance/wasmtime/releases/tag/v41.0.4"
},
{
"source": "security-advisories@github.com",
"tags": [
"Third Party Advisory"
],
"url": "https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-xjhv-v822-pf94"
}
],
"sourceIdentifier": "security-advisories@github.com",
"vulnStatus": "Analyzed",
"weaknesses": [
{
"description": [
{
"lang": "en",
"value": "CWE-755"
}
],
"source": "security-advisories@github.com",
"type": "Primary"
}
]
}
Loading…
Loading…
Sightings
| Author | Source | Type | Date |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Loading…
Loading…