Katalog CVE

CVE-2026-48100

WysokieCVSS 8.7
Opublikowano: Zaktualizowano: Przetłumaczono: NVD NIST

Prawdopodobieństwo exploitacji (EPSS)

Niskie ryzyko
0.18%

Percentyl 7 - wyżej niż 7% wszystkich znanych CVE

Streszczenie

W Payy przed wersją 1.3.0, funkcja agg_agg przekazuje skompresowany strumień wiadomości z wewnętrznych dowodów do publicznej tablicy messages: [Field; 1000], ale nie sprawdza, czy nieużywana część tablicy jest zerowa. Zarejestrowany prover może zbudować ważny dowód agg_final dla zatwierdzonego bloku rollup, wstawiając dodatkową wiadomość burn po prawdziwych wiadomościach. RollupV1.verifyRollup() interpretuje to jako normalny burn i transferuje USDC z kontraktu rollup do atakującego. Jest to poważna awaria dźwięczności obwodu.

Ocena ryzyka

Atakujący prover może ukraść USDC z kontraktu rollup, co prowadzi do strat finansowych. Obecnie dostęp jest ograniczony do allowlisty proverów, ale w przyszłym modelu może stać się dostępny dla każdego, kto postawi stake.

Rekomendacja

Zaktualizuj Payy do wersji 1.3.0 lub nowszej. Dodatkowo przejrzyj logikę weryfikacji dowodów i rozważ wprowadzenie dodatkowych kontroli integralności tablicy messages.

Powiązane podatności

Oryginalny opis (angielski, źródło NVD)

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.

Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS