Description
Payy is an Ethereum L2 zk-rollup for privacy preserving and regulatory compliant transactions. Prior to version 1.3.0, agg_agg forwards the compacted message stream from its inner proofs into a public messages: [Field; 1000] array, but it never checks that the unused tail of the outer array is zero. A registered prover can build a valid agg_final proof for an approved rollup block while inserting an extra burn message after the real messages. RollupV1.verifyRollup() then parses that public input as a normal burn and transfers USDC from the rollup contract to the attacker. This is a severe circuit soundness failure: the proof system accepts a public statement whose messages array is not fully derived from the verified inner proofs. On the current deployment, verifyRollup() is restricted to the existing allowlisted prover, so a fresh public caller cannot submit the invalid proof directly. That gate limits who can reach L1 today; it does not make the circuit statement sound. The issue becomes permissionless under the prover model described in the Payy whitepaper. Section 3.3.2 states: "To join as a prover, the prover is required to submit a small stake", and Section 3.3.1 states that if a prover fails to submit, "other nodes can submit the block proof instead." In that model, an attacker only needs to become a registered prover and use public validator approval data for an already approved block. This issue has been patched in version 1.3.0.
Published: 2026-09-28
Score: 8.7 High
EPSS: < 1% Very Low
KEV: No
Impact: Unauthorized Fund Transfer
Action: Immediate Patch
AI Analysis

Impact

The flaw lies in the agg_agg component of Payy, an Ethereum L2 zk-rollup, where the system forwards an array of compacted messages to a public messages list without validating that the unused tail of the array is zero. This omission means a prover can construct a valid aggregated proof that includes forging an additional burn message after legitimate ones. During RollupV1.verifyRollup() the rollup contract interprets this forged burn as a legitimate instruction and transfers USDC from the contract to the attacker. The CVSS score of 8.7 classifies this as a high‑severity attack that grants an attacker unauthorized transfer of funds, meeting the criteria of CWE‑349 for insufficient verification of critical data.

Affected Systems

All deployments of the polybase:payy zk‑rollup running a version older than 1.3.0 are affected. The current production setup restricts verification to an allowlisted prover, mitigating immediate exploitation, but the vulnerability becomes permissionless under the prover model described in the whitepaper once a prover stakes and is approved. Thus any node that can join as a prover could potentially use approved block data to construct a malicious proof.

Risk and Exploitability

With a CVSS score of 8.7 the risk is high, although the EPSS score is not available and the vulnerability is not listed in CISA’s KEV catalog. The attack requires the attacker to become a registered prover or to rely on a future prover model that permits stake‑based registration. Once a prover is in place, the malicious proof can be submitted to the rollup contract, triggering an immediate transfer of USDC. The vulnerability thus poses a significant threat to the financial integrity of the rollup system.

Generated by OpenCVE AI on September 28, 2026 at 18:30 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade Payy to version 1.3.0 or later to include the fix that validates the message array tail.
  • If upgrade is not immediately possible, lock or hard‑code the prover list to trusted entities until the upgrade is applied, preventing new prover registrations that could exploit the flaw.
  • Continuously monitor prover registrations and verify that all submitted rollup proofs contain only the intended burn messages to detect any unauthorized transfers.

Generated by OpenCVE AI on September 28, 2026 at 18:30 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Mon, 28 Sep 2026 20:15:00 +0000

Type Values Removed Values Added
First Time appeared Polybase
Polybase payy
Vendors & Products Polybase
Polybase payy

Mon, 28 Sep 2026 18:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'yes', 'Exploitation': 'poc', 'Technical Impact': 'partial'}, 'version': '2.0.3'}


Mon, 28 Sep 2026 17:00:00 +0000

Type Values Removed Values Added
Description Payy is an Ethereum L2 zk-rollup for privacy preserving and regulatory compliant transactions. Prior to version 1.3.0, agg_agg forwards the compacted message stream from its inner proofs into a public messages: [Field; 1000] array, but it never checks that the unused tail of the outer array is zero. A registered prover can build a valid agg_final proof for an approved rollup block while inserting an extra burn message after the real messages. RollupV1.verifyRollup() then parses that public input as a normal burn and transfers USDC from the rollup contract to the attacker. This is a severe circuit soundness failure: the proof system accepts a public statement whose messages array is not fully derived from the verified inner proofs. On the current deployment, verifyRollup() is restricted to the existing allowlisted prover, so a fresh public caller cannot submit the invalid proof directly. That gate limits who can reach L1 today; it does not make the circuit statement sound. The issue becomes permissionless under the prover model described in the Payy whitepaper. Section 3.3.2 states: "To join as a prover, the prover is required to submit a small stake", and Section 3.3.1 states that if a prover fails to submit, "other nodes can submit the block proof instead." In that model, an attacker only needs to become a registered prover and use public validator approval data for an already approved block. This issue has been patched in version 1.3.0.
Title Payy: agg_agg trailing message slots are unconstrained and allow forged burn messages
Weaknesses CWE-349
References
Metrics cvssV4_0

{'score': 8.7, 'vector': 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N'}


cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-09-28T17:27:18.467Z

Reserved: 2026-05-20T18:40:45.835Z

Link: CVE-2026-48100

cve-icon Vulnrichment

Updated: 2026-09-28T17:27:03.379Z

cve-icon NVD

Status : Deferred

Published: 2026-09-28T17:17:49.547

Modified: 2026-09-30T19:57:08.043

Link: CVE-2026-48100

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-09-28T19:42:05Z

Weaknesses
  • CWE-349

    Acceptance of Extraneous Untrusted Data With Trusted Data