GHSA-29h2-jr22-frmh
OpenZeppelin Confidential Contracts `VestingWalletConfidential`: a malicious ERC-7984 token is able to extract private data from the vesting wallet
GHSA-29h2-jr22-frmh is a high vulnerability (CVSS 7.1) in @openzeppelin/confidential-contracts, published September 25, 2026. No source lists public exploit code. Fixed in @openzeppelin/confidential-contracts 0.3.2.
- Severity
- 7.1 HighCVSS 4.0, GitHub Advisories
- Exploit chance
- UnscoredNo EPSS score yet
- Exploitation
- None knownNot on CISA’s or ENISA’s lists
- Fixed in
0.3.2@openzeppelin/confidential-contracts +2 more
Description
Impact
Two locations consume an encrypted handle returned by an untrusted external party and use it without verifying that the party is ACL-authorized on it.
VestingWalletConfidential
Malicious users can call release with a malicious token. This token could return an alternative handle on confidentialBalanceOf, which represents the balance of the vesting wallet on an alternative ERC-7984 token (or any other handle that the vesting wallet has access to). The vesting wallet does not check that the token has ACL access and grants access to a new handle derived from the returned handle.
Effectively, this bug allows a malicious user to gain information about any private euint64 handle that the vesting wallet has access to via a malicious ERC-7984 token. There is no loss of funds.
ERC7984
On a transfer with callback, ERC7984 uses the ebool returned by the
recipient's IERC7984Receiver.onConfidentialTransferReceived to drive the refund
logic, without checking that the recipient has ACL access to it. A malicious recipient
can return any ebool the token has access to and recover its plaintext from the
refund result, which the token grants the caller access to. The leak is limited
to ebool handles (the value is only used as an FHE.select condition), and
there is no loss of funds.
Patches
Both issues were fixed in the same patch releases: v0.5.2, v0.4.2, v0.3.2
VestingWalletConfidential: 93e75ceed2b9648f53f9d133f431064353456805 (#423).ERC7984transfer callback: fe0863af2c9dce7614acce98720a913bf6a767a5 (#428), with follow-up ee47edf189ab681cebdad18bfb53dee541987be2 (#431) permitting an uninitialized returned handle.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Affected packages
| Package | Affected | Fixed |
|---|---|---|
@openzeppelin/confidential-contractsnpm | before 0.3.2 | 0.3.2 |
@openzeppelin/confidential-contractsnpm | 0.4.0-rc.0 up to 0.4.2 | 0.4.2 |
@openzeppelin/confidential-contractsnpm | 0.5.0-rc.0 up to 0.5.2 | 0.5.2 |
What each source reports
GitHub Advisories Score used 7.1
OpenZeppelin Confidential Contracts `VestingWalletConfidential`: a malicious ERC-7984 token is able to extract private data from the vesting wallet
Impact
Two locations consume an encrypted handle returned by an untrusted external party and use it without verifying that the party is ACL-authorized on it.
VestingWalletConfidential
Malicious users can call release with a malicious token. This token could return an alternative handle on confidentialBalanceOf, which represents the balance of the vesting wallet on an alternative ERC-7984 token (or any other handle that the vesting wallet has access to). The vesting wallet does not check that the token has ACL access and grants access to a new handle derived from the returned handle.
Effectively, this bug allows a malicious user to gain information about any private euint64 handle that the vesting wallet has access to via a malicious ERC-7984 token. There is no loss of funds.
ERC7984
On a transfer with callback, ERC7984 uses the ebool returned by the
recipient's IERC7984Receiver.onConfidentialTransferReceived to drive the refund
logic, without checking that the recipient has ACL access to it. A malicious recipient
can return any ebool the token has access to and recover its plaintext from the
refund result, which the token grants the caller access to. The leak is limited
to ebool handles (the value is only used as an FHE.select condition), and
there is no loss of funds.
Patches
Both issues were fixed in the same patch releases: v0.5.2, v0.4.2, v0.3.2
VestingWalletConfidential: 93e75ceed2b9648f53f9d133f431064353456805 (#423).ERC7984transfer callback: fe0863af2c9dce7614acce98720a913bf6a767a5 (#428), with follow-up ee47edf189ab681cebdad18bfb53dee541987be2 (#431) permitting an uninitialized returned handle.
- Record
GHSA-29h2-jr22-frmh- CVSS 4.0
- 7.1 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-284
- Updated
- 2026-11-02
OSV 7.1
OpenZeppelin Confidential Contracts `VestingWalletConfidential`: a malicious ERC-7984 token is able to extract private data from the vesting wallet
Impact
Two locations consume an encrypted handle returned by an untrusted external party and use it without verifying that the party is ACL-authorized on it.
VestingWalletConfidential
Malicious users can call release with a malicious token. This token could return an alternative handle on confidentialBalanceOf, which represents the balance of the vesting wallet on an alternative ERC-7984 token (or any other handle that the vesting wallet has access to). The vesting wallet does not check that the token has ACL access and grants access to a new handle derived from the returned handle.
Effectively, this bug allows a malicious user to gain information about any private euint64 handle that the vesting wallet has access to via a malicious ERC-7984 token. There is no loss of funds.
ERC7984
On a transfer with callback, ERC7984 uses the ebool returned by the
recipient's IERC7984Receiver.onConfidentialTransferReceived to drive the refund
logic, without checking that the recipient has ACL access to it. A malicious recipient
can return any ebool the token has access to and recover its plaintext from the
refund result, which the token grants the caller access to. The leak is limited
to ebool handles (the value is only used as an FHE.select condition), and
there is no loss of funds.
Patches
Both issues were fixed in the same patch releases: v0.5.2, v0.4.2, v0.3.2
VestingWalletConfidential: 93e75ceed2b9648f53f9d133f431064353456805 (#423).ERC7984transfer callback: fe0863af2c9dce7614acce98720a913bf6a767a5 (#428), with follow-up ee47edf189ab681cebdad18bfb53dee541987be2 (#431) permitting an uninitialized returned handle.
- Record
GHSA-29h2-jr22-frmh- CVSS 4.0
- 7.1 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-284
- Updated
- 2026-11-02
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | GitHub Advisories, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
References
github.com/OpenZeppelin/openzeppelin-confidential-contracts/security/advisories/GHSA-29h2-jr22-frmh
github.com/OpenZeppelin/openzeppelin-confidential-contracts/pull/423
github.com/OpenZeppelin/openzeppelin-confidential-contracts/pull/428
github.com/OpenZeppelin/openzeppelin-confidential-contracts/pull/431
github.com/OpenZeppelin/openzeppelin-confidential-contracts/commit/93e75ceed2b9648f53f9d133f431064353456805
github.com/OpenZeppelin/openzeppelin-confidential-contracts/commit/ee47edf189ab681cebdad18bfb53dee541987be2
Show 6 moreShow less
github.com/OpenZeppelin/openzeppelin-confidential-contracts/commit/fe0863af2c9dce7614acce98720a913bf6a767a5
github.com/OpenZeppelin/openzeppelin-confidential-contracts/releases/tag/v0.3.2
github.com/OpenZeppelin/openzeppelin-confidential-contracts/releases/tag/v0.4.2
github.com/OpenZeppelin/openzeppelin-confidential-contracts/releases/tag/v0.5.2
github.com/advisories/GHSA-29h2-jr22-frmh
github.com/OpenZeppelin/openzeppelin-confidential-contracts