Aztec Plonk Verifier: 0 Bug
Aztec Plonk Verifier: 0 Bug
Identified By: Nguyen Thoi Minh Quan
The Aztec Plonk verifier, written in C++, accepts proofs containing multiple elements as per the Plonk protocol. However, by manually setting two of the elements to 0, the verifier will automatically accept that proof regardless of the other elements. This allows an attacker to successfully forge a proof.
Background
The full description of this vulnerability is quite math heavy and dives deep into the Plonk protocol. The finder of this vulnerability, Nguyen Thoi Minh Quan, has a great detailed description of the vulnerability here.
Elliptic curves have what is known as a point at infinity. Let O = point at infinity
and P
be any point on the curve. Then O + P = P
. When implementing a cryptographic protocol in code, there are different ways to express the point at inifinity. For example, sometimes the number 0
is considered the point at infinity, but other times 0
is considered as the point (0, 0)
, which is not the point at infinity. This will be important later.
Plonk proofs require a group of elements and curve points, and then will check whether these elements and points satisfy certain equations. One of the main equations to check is an elliptic curve pairing. The curve points that are of importance for this bug are [Wz]1 and [Wzw]1.
The Vulnerability
When [Wz]1 and [Wzw]1 are checked in the verifier code, a value of 0
is recognized as not on the elliptic curve, but the code does not fail immediately. The verifier continues on and later recognizes the 0
value as the point at infinity. This causes the pairing equation to be satisfied, and therefore the proof is successfully verified.
The Fix
The verifier was missing checks at a few different spots in the code. Just one of these checks would stop the 0 bug from working. These checks are explained in more detail in the finder's description. A simple to understand fix would be to agree on a consistent representation of the point at infinity. If 0
was consistently decided as not the point at infinity, then this bug would not work.
This bug is a good example of how implementing a secure cryptographic protocol can become insecure very easily. If one follows the Plonk paper exactly, this bug is not possible. This is a good reminder to test a protocol with inputs that theoretically would never work, as this finder did.
References
Nguyen Thoi Minh Quan's Description
https://github.com/0xPARC/zk-bug-tracker#aztec-2