Post
This post by its id.
https://api.web3aggregator.io/api/v1/posts/18416 curl -H "Authorization: Bearer $W3A_API_KEY" 'https://api.web3aggregator.io/api/v1/posts/18416'
Needs a key: W3A_API_KEY in your environment.
The API gives this message alone: an album's other parts are posts of their own there, linked by album.
API docszkLink Nova's Arbitrator hacked for~$780K
Rootcause: The Arbitrator contract had two related flaws that the attacker combined:
Uncleared transient storage of the authentication hash
During a legitimate claim, an authenticated gateway callback stores
The contract never cleared
Caller-controlled target and calldata in the claim path
The claim function accepted a user-supplied target address and calldata. This let the attacker point the second claim at the Ethereum Gateway and supply
Resulting attack flow (same transaction):
First claim: legitimate Linea message → sets
Second claim: reuses the stale hash for verification while forcing the trusted Arbitrator to call the Ethereum Gateway with malicious root-update calldata.
The zkLink contract accepted the attacker-controlled root because it came from the authorized Gateway.
Attacker then submitted matching withdrawal proofs against the forged root and drained funds.
@EthSecurity1
Rootcause: The Arbitrator contract had two related flaws that the attacker combined:
Uncleared transient storage of the authentication hash
During a legitimate claim, an authenticated gateway callback stores
finalizeMessageHash (in transient storage). The Arbitrator later checks this hash against the expected source gateway, value, and message.The contract never cleared
finalizeMessageHash after use. Transient storage persists for the entire transaction, so a second claim in the same transaction could reuse the first claim’s already-set (and still-valid) hash without triggering a fresh authenticated callback.Caller-controlled target and calldata in the claim path
The claim function accepted a user-supplied target address and calldata. This let the attacker point the second claim at the Ethereum Gateway and supply
sendMessage() calldata that invoked a privileged syncBatchRoot update with an attacker-chosen root.Resulting attack flow (same transaction):
First claim: legitimate Linea message → sets
finalizeMessageHash and forwards normally.Second claim: reuses the stale hash for verification while forcing the trusted Arbitrator to call the Ethereum Gateway with malicious root-update calldata.
The zkLink contract accepted the attacker-controlled root because it came from the authorized Gateway.
Attacker then submitted matching withdrawal proofs against the forged root and drained funds.
@EthSecurity1