Malicious plugin names, recipients, or identities can cause arbitrary binary execution
A plugin name containing a path separator may allow an attacker to execute an arbitrary binary. Such a plugin name can be provided through an attacker-controlled input to the following `age` APIs when the `plugin` feature flag is enabled: - [`age::plugin::Identity::from_str`](https://docs.rs/age/0.11.0/age/plugin/struct.Identity.html#impl-FromStr-for-Identity) (or equivalently [`str::parse::()`](https://doc.rust-lang.org/stable/core/primitive.str.html#method.parse)) - [`age::plugin::Identity::default_for_plugin`](https://docs.rs/age/0.11.0/age/plugin/struct.Identity.html#method.default_for_plugin) - [`age::plugin::IdentityPluginV1::new`](https://docs.rs/age/0.11.0/age/plugin/struct.IdentityPluginV1.html#method.new) (the `plugin_name` argument) - [`age::plugin::Recipient::from_str`](https://docs.rs/age/0.11.0/age/plugin/struct.Recipient.html#impl-FromStr-for-Recipient) (or equivalently [`str::parse::()`](https://doc.rust-lang.org/stable/core/primitive.str.html#method.parse)) - [`age::plugin::RecipientPluginV1::new`](https://docs.rs/age/0.11.0/age/plugin/struct.RecipientPluginV1.html#method.new) (the `plugin_name` argument) On UNIX systems, a directory matching `age-plugin-*` needs to exist in the working directory for the attack to succeed. The binary is executed with a single flag, either `--age-plugin=recipient-v1` or `--age-plugin=identity-v1`. The standard input includes the recipient or identity string, and the random file key (if encrypting) or the header of the file (if
- Products
- age
- Affected versions
- Not specified
- Fixed versions
- 0.10.1, 0.11.1, 0.6.1, 0.7.2, 0.8.2, 0.9.3
- CVEs
- Not specified
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 30 Oct 2026, 08:44 UTC · Revision 1
Source evidence
Malicious plugin names, recipients, or identities can cause arbitrary binary execution
core-osv · Original sourcePublished 18 Dec 2024, 12:00 UTC
A plugin name containing a path separator may allow an attacker to execute an arbitrary binary. Such a plugin name can be provided through an attacker-controlled input to the following `age` APIs when the `plugin` feature flag is enabled: - [`age::plugin::Identity::from_str`](https://docs.rs/age/0.11.0/age/plugin/struct.Identity.html#impl-FromStr-for-Identity) (or equivalently [`str::parse::()`](https://doc.rust-lang.org/stable/core/primitive.str.html#method.parse)) - [`age::plugin::Identity::default_for_plugin`](https://docs.rs/age/0.11.0/age/plugin/struct.Identity.html#method.default_for_plugin) - [`age::plugin::IdentityPluginV1::new`](https://docs.rs/age/0.11.0/age/plugin/struct.IdentityPluginV1.html#method.new) (the `plugin_name` argument) - [`age::plugin::Recipient::from_str`](https://docs.rs/age/0.11.0/age/plugin/struct.Recipient.html#impl-FromStr-for-Recipient) (or equivalently [`str::parse::()`](https://doc.rust-lang.org/stable/core/primitive.str.html#method.parse)) - [`age::plugin::RecipientPluginV1::new`](https://docs.rs/age/0.11.0/age/plugin/struct.RecipientPluginV1.html#method.new) (the `plugin_name` argument) On UNIX systems, a directory matching `age-plugin-*` needs to exist in the working directory for the attack to succeed. The binary is executed with a single flag, either `--age-plugin=recipient-v1` or `--age-plugin=identity-v1`. The standard input includes the recipient or identity string, and the random file key (if encrypting) or the header of the file (if
osv:RUSTSEC-2024-0433
age
Fixed versions: 0.6.1, 0.7.2, 0.8.2, 0.9.3, 0.10.1, 0.11.1
Complete source record
{
"id": "689b86611e4bfb949c788118d7035f996264611c395a29bfeb0cc7d00a10ef95",
"url": "https://osv.dev/vulnerability/RUSTSEC-2024-0433",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Malicious plugin names, recipients, or identities can cause arbitrary binary execution",
"summary": "A plugin name containing a path separator may allow an attacker to execute an arbitrary binary. Such a plugin name can be provided through an attacker-controlled input to the following `age` APIs when the `plugin` feature flag is enabled: - [`age::plugin::Identity::from_str`](https://docs.rs/age/0.11.0/age/plugin/struct.Identity.html#impl-FromStr-for-Identity) (or equivalently [`str::parse::()`](https://doc.rust-lang.org/stable/core/primitive.str.html#method.parse)) - [`age::plugin::Identity::default_for_plugin`](https://docs.rs/age/0.11.0/age/plugin/struct.Identity.html#method.default_for_plugin) - [`age::plugin::IdentityPluginV1::new`](https://docs.rs/age/0.11.0/age/plugin/struct.IdentityPluginV1.html#method.new) (the `plugin_name` argument) - [`age::plugin::Recipient::from_str`](https://docs.rs/age/0.11.0/age/plugin/struct.Recipient.html#impl-FromStr-for-Recipient) (or equivalently [`str::parse::()`](https://doc.rust-lang.org/stable/core/primitive.str.html#method.parse)) - [`age::plugin::RecipientPluginV1::new`](https://docs.rs/age/0.11.0/age/plugin/struct.RecipientPluginV1.html#method.new) (the `plugin_name` argument) On UNIX systems, a directory matching `age-plugin-*` needs to exist in the working directory for the attack to succeed. The binary is executed with a single flag, either `--age-plugin=recipient-v1` or `--age-plugin=identity-v1`. The standard input includes the recipient or identity string, and the random file key (if encrypting) or the header of the file (if",
"evidence": "osv:RUSTSEC-2024-0433",
"products": [
{
"name": {
"value": "age",
"evidence": "/affected/0/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "0.6.1",
"evidence": "/affected/0/ranges"
},
{
"value": "0.7.2",
"evidence": "/affected/0/ranges"
},
{
"value": "0.8.2",
"evidence": "/affected/0/ranges"
},
{
"value": "0.9.3",
"evidence": "/affected/0/ranges"
},
{
"value": "0.10.1",
"evidence": "/affected/0/ranges"
},
{
"value": "0.11.1",
"evidence": "/affected/0/ranges"
}
],
"affected_versions": []
}
],
"severity": "unknown",
"structured": {
"id": "RUSTSEC-2024-0433",
"aliases": [
"GHSA-4fg7-vxc8-qx5w",
"RUSTSEC-2024-0432",
"RUSTSEC-2024-0433"
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "0.6.0"
},
{
"fixed": "0.6.1"
},
{
"introduced": "0.7.0"
},
{
"fixed": "0.7.2"
},
{
"introduced": "0.8.0"
},
{
"fixed": "0.8.2"
},
{
"introduced": "0.9.0"
},
{
"fixed": "0.9.3"
},
{
"introduced": "0.10.0"
},
{
"fixed": "0.10.1"
},
{
"introduced": "0.11.0"
},
{
"fixed": "0.11.1"
}
]
}
],
"package": {
"name": "age",
"purl": "pkg:cargo/age",
"ecosystem": "crates.io"
},
"database_specific": {
"cvss": null,
"source": "https://github.com/rustsec/advisory-db/blob/osv/crates/RUSTSEC-2024-0433.json",
"categories": [
"code-execution"
],
"informational": null
},
"ecosystem_specific": {
"affects": {
"os": [],
"arch": [],
"functions": [
"age::plugin::Identity::default_for_plugin",
"age::plugin::Identity::from_str",
"age::plugin::IdentityPluginV1::new",
"age::plugin::Recipient::from_str",
"age::plugin::RecipientPluginV1::new"
]
},
"affected_functions": null
}
}
],
"modified": "2026-10-12T18:00:12.403778948Z",
"provider": "osv",
"references": [
"https://crates.io/crates/age",
"https://rustsec.org/advisories/RUSTSEC-2024-0433.html",
"https://github.com/str4d/rage/commit/703152ecfa86f27952a35b57dd525ed39396a227"
],
"provider_metadata": {
"license": "CC0-1.0"
}
},
"related_cves": [],
"security_relevant": true,
"severity_evidence": null
},
"source_id": "core-osv",
"document_id": 306429,
"published_at": "2024-12-18T12:00:00+00:00"
}