OpenZeppelin Contracts initializer reentrancy may lead to double initialization
Description
OpenZeppelin Contracts is a library for secure smart contract development. Before version 4.4.1 but after 3.2.0, initializer functions that are invoked separate from contract creation (the most prominent example being minimal proxies) may be reentered if they make an untrusted non-view external call. Once an initializer has finished running it can never be re-executed. However, an exception put in place to support multiple inheritance made reentrancy possible in the scenario described above, breaking the expectation that there is a single execution. Note that upgradeable proxies are commonly initialized together with contract creation, where reentrancy is not feasible, so the impact of this issue is believed to be minor. This issue has been patched, please upgrade to version 4.4.1. As a workaround, avoid untrusted external calls during initialization.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
OpenZeppelin Contracts initializer reentrancy allows double initialization in minimal proxies due to untrusted external calls; patched in 4.4.1.
CVE-2022-39384 is a reentrancy vulnerability in OpenZeppelin Contracts versions 3.2.0 through 4.4.0. Initializer functions, when invoked separately from contract creation (e.g., via minimal proxies), could be reentered if they make an untrusted non-view external call. The root cause is an exception in the initializer modifier designed to support multiple inheritance, which inadvertently allowed nested initializer calls after the initial execution had completed [1][3].
To exploit this, an attacker must cause an initializer function to make an untrusted external call during its execution. This is feasible in scenarios where initialization occurs after contract deployment, such as with minimal proxies. Upgradeable proxies initialized together with contract creation are less exposed because reentrancy is not feasible in that context [3].
The impact is that an initializer could be executed twice, breaking the guarantee of single initialization. While considered minor, double initialization could lead to unexpected contract state. The issue is patched in version 4.4.1, and the workaround is to avoid untrusted external calls during initialization [1][4].
AI Insight generated on May 21, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
@openzeppelin/contractsnpm | >= 3.2.0, < 4.4.1 | 4.4.1 |
@openzeppelin/contracts-upgradeablenpm | >= 3.2.0, < 4.4.1 | 4.4.1 |
Affected products
3- ghsa-coords2 versions
>= 3.2.0, < 4.4.1+ 1 more
- (no CPE)range: >= 3.2.0, < 4.4.1
- (no CPE)range: >= 3.2.0, < 4.4.1
- OpenZeppelin/openzeppelin-contractsv5Range: >= 3.2.0, < 4.4.1
Patches
0No patches discovered yet.
Vulnerability mechanics
AI mechanics synthesis has not run for this CVE yet.
References
4News mentions
0No linked articles in our index yet.