Skip to content
Quantix Security Labs

Axeline Bridge

Bridge Security Assessment of Axeline Bridge, a interoperability protocol on Optimism, Avalanche, Arbitrum covered by Quantix Protocol Research. Endpoint, verifier registry, attestation verifier, executor and message codec, as deployed on Optimism, Avalanche and Arbitrum. 2,386 nSLOC of Solidity.
ResearchUnder ReviewQX-TSA-2026-012 · v0.8
QUANTIX SECURITY LABSQX-TSA-2026-012

TECHNICAL SECURITY ASSESSMENT

Axeline Bridge

Bridge Security Assessment · Interoperability

REPORT ID QX-TSA-2026-012 · v0.8

QUANTIX RESEARCH ASSESSMENT

Endpoint, verifier registry, attestation verifier, executor and message codec, as deployed on Optimism, Avalanche and Arbitrum. 2,386 nSLOC of Solidity.

Document status
Draft, under review
Review ended
28 Aug 2026

FINDINGS BY SEVERITY8 findings

Critical

1

High

3

Medium

2

Low

1

Info

1

Quantix research assessment of Axeline Bridge (Protocol Research). Not a client engagement or a certification.

DRAFT
Draft QX-TSA-2026-012 v0.8 · issued when the review closes

Risk summary

State at remediation commit f61b3d09a7e2

Findings
8
Critical and high
4
Open or partial
4
Remediation
63%

Findings by severity

  • Critical1
  • High3
  • Medium2
  • Low1
  • Informational1

Remediation statusAnalysis

  • Resolved3
  • Partially resolved2
  • Acknowledged1
  • Open2

Axeline Bridge

Interoperability

Document
QX-TSA-2026-012 · v0.8
Type
Bridge Security Assessment
Review
27 Jul 2026 – 28 Aug 2026
Status
Remediation review in progress
Ecosystems
OptimismAvalancheArbitrum
Languages
Solidity
Risk Index
BB71.5
Assessment contents · 12 sections

01

Assessment overview

Axeline Bridge is a general-purpose messaging layer between Optimism, Avalanche and Arbitrum. Applications send payloads through an `Endpoint`; each application chooses a verifier, usually the `AttestationVerifier`, in which a threshold of attesters signs each message; and a permissionless `Executor` delivers verified messages to receiver contracts and retries failures.

The assessment began after the 22 July 2026 incident, in which an attested message delivered on Avalanche was replayed on Arbitrum. The root cause, confirmed as AX-01, was that the attested hash did not include the destination chain or endpoint. This was fixed with EIP-712 typed data on 12 August 2026. The review also found that duplicate signatures from one attester could be counted towards the threshold (AX-04, fixed).

Two high-severity findings remain open or partially resolved: failed deliveries can be retried by anyone without expiry (AX-02), and application owners can switch to a different verifier, including a 1-of-1 configuration, without any delay (AX-03). Two medium-severity findings concern gas griefing by executors and head-of-line blocking on ordered channels.

This version is marked Under Review. Applications that hold significant value should, until AX-02 and AX-03 are fixed, add deadlines to their own payloads, monitor their verifier configuration and use a threshold of at least three attesters.

02

Technical analysis: protocol architecture

On the source chain an application calls Endpoint.send(dstChainId, receiver, payload). The endpoint assigns a per-channel nonce and emits MessageSent. Attesters watch for the event, wait for source-chain finality and sign the message hash. On the destination chain anyone can call Endpoint.receiveMessage(message, signatures); the endpoint asks the VerifierRegistry which verifier the receiver uses, checks the signatures and calls the receiver.

If the receiver reverts, the message is marked failed and can be retried through the Executor. Applications can opt into ordered channels, in which a message is delivered only after all earlier nonces on that channel. Protocol contracts are upgradeable behind transparent proxies controlled by a 4-of-6 multisig with a 24-hour delay; each application's verifier settings are controlled by that application's owner.

Trusted· 4

Assumed to behave as specified; compromise is out of the threat model.

  • EndpointSend, deliver, nonces, delivered and failed records
  • VerifierRegistryMaps applications to verifiers and thresholds
  • AttestationVerifierChecks threshold attester signatures
  • Proxy admin multisigUpgrades protocol contracts (24-hour delay)
trust boundary

Semi-trusted· 2

Trusted for liveness or within bounds; misbehaviour is partly modelled.

  • AttestersSign finalised source-chain messages
  • Application ownersConfigure verifier and threshold per application
trust boundary

Untrusted· 1

May act adversarially; every input is validated.

  • ExecutorPermissionless delivery and retries
Components grouped by trust level. Calls that cross a trust boundary are where the review concentrated input validation and authorisation checks.

Trust assumptions

  • Fewer than the configured threshold of attesters for an application are malicious or compromised.
  • Attesters sign only messages that are final on the source chain.
  • Application owners configure verifiers responsibly (not enforced; see AX-03).
  • Executors are untrusted and may choose gas, timing and ordering of deliveries.

03

Scope

Endpoint, verifier registry, attestation verifier, executor and message codec, as deployed on Optimism, Avalanche and Arbitrum. 2,386 nSLOC of Solidity.

Repository
github.com/example-org/axeline-messaging
Review effort
Three reviewers over twenty-four working days, following incident response for the 22 July 2026 replay; remediation review in progress
Reviewed commit
4a0c8e2f6b1d93a7e5c0f48b2d6a19e7c3b5f084
Remediation commit
f61b3d09a7e2c58b4d0e9a16c3f72b8e05d4a9c7
Files and components in scope
PathDescriptionnSLOC
src/Endpoint.solMessage send and delivery, nonces, delivered-message records, ordered channels744
src/VerifierRegistry.solPer-application verifier and threshold configuration318
src/AttestationVerifier.solThreshold attester signatures over message hashes402
src/Executor.solPermissionless delivery, gas accounting and retries566
src/libraries/MessageCodec.solMessage encoding and hashing214
src/LightClientVerifier.solAdapter interface to light-client verifiers (interface and dispatch only)142
Total6 items2,386

Out of scope

  • Light-client verifier implementations
  • Attester node software and key storage
  • Receiver applications built on Axeline
  • Proxy administration multisig and its signers (configuration reviewed, signers not assessed)

04

Threat model

Each threat lists the actor, the vector and the mitigation, and links to the findings that realised it in the reviewed code.

Assets at risk

  • Funds held by receiver applications
  • Message integrity and uniqueness
  • Attester set and thresholds
  • Delivery liveness

Actors

  • ReplayerUntrustedResubmits observed messages and signatures to any endpoint
  • Malicious executorUntrustedDelivers with chosen gas and timing
  • Single malicious attesterSemi-trustedProduces signatures with one attester key
  • Compromised application ownerSemi-trustedChanges an application's verifier settings
Threats, vectors, mitigations and related findings
ThreatActorVectorMitigationFindings
Execute a message on a chain it was not sent toReplayerHash omits destinationEIP-712 domain with destination chain and endpointAX-01
Execute a stale message under changed conditionsMalicious executorRetries without expiryDeadlines on messages and retriesAX-02
Forge messages for one applicationCompromised application ownerInstant switch to a weak verifierDelay and minimum threshold for verifier changesAX-03
Meet the threshold with one keySingle malicious attesterDuplicate or malleable signatures countedStrictly increasing unique signersAX-04
Force messages into the failed stateMalicious executorInsufficient gas forwardedEnforce the sender's gas limitAX-05
Halt an ordered channelMalicious executorOne failing message blocks later noncesBounded skip after timeoutAX-06

05

Findings

Severity

8 findings

AX-01CriticalResolvedSignature replay

Attested message hash omits the destination chain and endpoint, allowing cross-chain replay

src/libraries/MessageCodec.sol:L41–L52 (messageHash), src/Endpoint.sol:L208–L236 (receiveMessage)

Likelihood
High
Impact
High
Weakness
CWE-294
Description

Attesters sign keccak256(abi.encode(srcChainId, nonce, sender, receiver, keccak256(payload))). The destination chain ID and destination endpoint travel in the message envelope but are not part of the signed hash. Each endpoint records delivered messages by keccak256(abi.encode(srcChainId, nonce)) in its own storage.

A message sent from Optimism to Avalanche is therefore also valid on Arbitrum: the signatures verify, and the Arbitrum endpoint has never seen that (srcChainId, nonce). Many applications deploy receivers at the same address on every chain with deterministic deployment, so the Arbitrum endpoint resolves a real receiver that uses the same verifier.

This is the root cause of the 22 July 2026 incident, in which a release message delivered on Avalanche was replayed on Arbitrum. Every attested message for an application deployed on more than one destination was replayable once on each other destination.

Preconditions
  • A receiver deployed at the same address on two or more destination chains.
  • Access to any delivered message and its signatures, which are public calldata.
Exploit scenario
  1. 1.A user bridges assets from Optimism to Avalanche; the application's receiver on Avalanche releases funds.
  2. 2.The replayer copies the message and signatures from the Avalanche delivery transaction.
  3. 3.It calls receiveMessage on the Arbitrum endpoint. The hash matches, the threshold check passes and the receiver at the same address releases funds again from its Arbitrum liquidity.
Impact

Duplicate execution of any message on each additional chain where the receiver exists, draining receiver liquidity.

Recommendation

Sign EIP-712 typed data whose domain binds the destination chain ID and the destination endpoint as verifyingContract, include source endpoint, destination fields and verifier version in the struct, reject messages not addressed to block.chainid and address(this), and record delivered messages by full typed-data hash.

Fix
src/libraries/MessageCodec.sol and src/Endpoint.sol (remediation commit)diff
- function messageHash(Message calldata m) internal pure returns (bytes32) {-     return keccak256(abi.encode(m.srcChainId, m.nonce, m.sender, m.receiver, keccak256(m.payload)));- }+ bytes32 constant MESSAGE_TYPEHASH = keccak256(+     "Message(uint64 srcChainId,address srcEndpoint,uint64 dstChainId,uint64 nonce,address sender,address receiver,bytes32 payloadHash)"+ );+ function messageHash(Message calldata m) internal view returns (bytes32) {+     return _hashTypedDataV4(keccak256(abi.encode(+         MESSAGE_TYPEHASH, m.srcChainId, m.srcEndpoint, m.dstChainId, m.nonce, m.sender, m.receiver, keccak256(m.payload)+     )));+ } ...  function receiveMessage(Message calldata m, bytes[] calldata sigs) external {-     bytes32 key = keccak256(abi.encode(m.srcChainId, m.nonce));+     if (m.dstChainId != block.chainid) revert WrongDestination();+     bytes32 key = messageHash(m); // domain verifyingContract = address(this)      if (delivered[key]) revert AlreadyDelivered();
Resolution

Fixed on 12 August 2026 and verified. Attesters sign the new typed-data format; property P2 holds on the remediation commit. A scan of the 90 days before the incident found no earlier replays.

AX-02HighPartially resolvedBridge message validation

Failed messages can be retried by anyone, indefinitely, under the current verifier

src/Executor.sol:L301–L352 (retry), src/Endpoint.sol:L262–L290

Likelihood
Medium
Impact
High
Weakness
CWE-613
Description

When a receiver reverts, the endpoint stores the message hash as failed. Executor.retry(message) can be called by anyone at any time and re-executes the message without checking signatures again, because it was verified on first delivery. Messages have no deadline.

Two problems follow. A message whose meaning depends on time (a limit order, a liquidation, a price-dependent mint) can be executed weeks later under very different conditions, at a time the executor chooses. And because the failed record is keyed by the hash and not tied to the verifier that approved it, a message that was verified under a later-removed verifier configuration remains executable after the application has changed its verifier, which defeats the purpose of rotating away from a compromised configuration.

Preconditions
  • A message that failed on first delivery, for example because the receiver was paused or out of liquidity.
Exploit scenario
  1. 1.An application's receiver is paused for maintenance; several swap messages fail.
  2. 2.Weeks later, after prices move, a searcher retries the messages whose stale terms are now favourable to the original sender it colludes with.
  3. 3.The receiver executes the swaps at the old terms against current liquidity.
Impact

Execution of stale messages at attacker-chosen times and of messages approved by configurations the application has since revoked.

Recommendation

Add a signed deadline to every message and reject expired deliveries and retries; record the verifier configuration that approved a failed message and require re-verification if it has changed; allow applications to restrict retries.

Fix
src/Executor.sol (remediation commit)diff
  function retry(Message calldata m) external {      bytes32 key = endpoint.messageHash(m);      if (!endpoint.isFailed(key)) revert NotFailed();+     if (m.deadline != 0 && block.timestamp > m.deadline) revert Expired();      endpoint.executeFailed(m);  }
Resolution

Partially resolved. An optional deadline field is supported and enforced when set; messages without a deadline and the link between failed messages and verifier configuration remain open.

AX-03HighOpenAccess control

Application owners can switch verifier or threshold instantly, including to a 1-of-1 configuration

src/VerifierRegistry.sol:L64–L109 (setVerifier, setThreshold)

Likelihood
Medium
Impact
High
Weakness
CWE-284
Description

setVerifier(app, verifier) and setThreshold(app, t) are callable by the application's owner and take effect in the same transaction. The registry accepts any verifier contract and any threshold of at least one, so an owner can configure a 1-of-1 attestation with a key it controls, or a custom verifier that returns true for everything.

Protocol upgrades are behind a 24-hour delay, but application settings are not, and users of an application generally cannot see which verifier it uses. A compromised owner key, or a malicious owner, can switch the verifier and deliver a forged message in one transaction, before any monitoring can react.

Preconditions
  • Control of an application owner key.
Exploit scenario
  1. 1.An attacker phishes the deployer key of an application that holds bridged liquidity.
  2. 2.In one transaction it sets the application's verifier to a 1-of-1 attestation verifier with its own key, signs a release message and delivers it.
  3. 3.The receiver releases its liquidity before the change is noticed.
Impact

Loss of all funds held by the affected application. Other applications are unaffected.

Recommendation

Apply a delay to verifier and threshold changes with an event at proposal time, enforce a minimum threshold (for example three attesters) for the default attestation verifier, allow only verifiers from a reviewed allow-list for applications that opt into a "protected" mode, and expose the configuration in a view function for front ends.

Fix
Recommended change (not yet implemented)diff
- function setVerifier(address app, address verifier) external onlyAppOwner(app) {-     verifierOf[app] = verifier;- }+ uint256 public constant CONFIG_DELAY = 2 days;+ uint8 public constant MIN_THRESHOLD = 3;+ function proposeVerifier(address app, address verifier, uint8 threshold) external onlyAppOwner(app) {+     if (threshold < MIN_THRESHOLD) revert ThresholdTooLow();+     pending[app] = Pending(verifier, threshold, uint64(block.timestamp + CONFIG_DELAY));+     emit VerifierProposed(app, verifier, threshold, pending[app].eta);+ }
Resolution

Open. The team plans a two-day delay and a minimum threshold of three attesters.

AX-04HighResolvedCryptography

Duplicate and malleable attester signatures count towards the threshold

src/AttestationVerifier.sol:L88–L132 (verify)

Likelihood
Medium
Impact
High
Weakness
CWE-347
Description

verify(hash, sigs) loops over the signatures, recovers each signer with ecrecover and increments a counter when the signer is a registered attester. It does not check that signers are distinct. Submitting the same signature t times satisfies a threshold of t with one attester key.

The raw ecrecover call also accepts high-s signatures, so even a distinctness check on signature bytes would not suffice: each ECDSA signature has a second valid form. The check must be on recovered addresses.

This was not the cause of the July incident, in which the replayed signatures were the original, legitimate set, but it reduces the security of every attestation configuration to a single key.

Preconditions
  • Control of one registered attester key for the application's attester set.
Exploit scenario
  1. 1.A single malicious attester signs a forged release message and submits its signature three times to meet a 3-of-5 threshold.
Impact

Arbitrary messages for any application using the attestation verifier, with one attester key.

Recommendation

Use OpenZeppelin ECDSA.recover, which rejects malleable signatures, and require recovered signers to be strictly increasing so each attester is counted once.

Fix
src/AttestationVerifier.sol (remediation commit)diff
- for (uint256 i; i < sigs.length; ++i) {-     address s = ecrecover(hash, v[i], r[i], s_[i]);-     if (isAttester[s]) ++valid;- }+ address last;+ for (uint256 i; i < sigs.length; ++i) {+     address signer = ECDSA.recover(hash, sigs[i]);+     if (signer <= last) revert UnsortedOrDuplicateSigner();+     if (!isAttester[signer]) revert UnknownSigner(signer);+     last = signer;+ }+ if (sigs.length < threshold) revert BelowThreshold();
Resolution

Fixed and verified; property P3 holds on the remediation commit.

AX-05MediumOpenDenial of service

Executor can forward too little gas and force messages into the failed state

src/Endpoint.sol:L240–L258 (_execute)

Likelihood
Medium
Impact
Medium
Weakness
CWE-400
Description

Senders specify gasLimit for the receiver call, but _execute calls the receiver inside try/catch with whatever gas remains and does not check that at least gasLimit was available. Because of the 63/64 rule, an executor can choose a transaction gas limit at which the receiver call runs out of gas while the endpoint still has enough to catch the failure and mark the message failed.

On its own this delays messages. Combined with AX-02, it lets a malicious executor take control of when a message is eventually executed.

Preconditions
  • Permissionless delivery (by design).
Exploit scenario
  1. 1.An executor delivers each message for a competitor's application with just too little gas, so every message fails and must be retried.
Impact

Delays for applications and executor-chosen execution timing for failed messages.

Recommendation

Check gasleft() against the sender's gas limit plus a buffer before calling the receiver and revert the whole delivery if it is insufficient.

Fix
Recommended change (not yet implemented)diff
+ if (gasleft() < (m.gasLimit * 64) / 63 + EXECUTION_OVERHEAD) revert InsufficientGas();  try IReceiver(m.receiver).onMessage{gas: m.gasLimit}(m.sender, m.payload) {
Resolution

Open.

AX-06MediumPartially resolvedDenial of service

One failing message blocks all later messages on an ordered channel

src/Endpoint.sol:L300–L338 (ordered delivery)

Likelihood
Medium
Impact
Medium
Weakness
CWE-400
Description

On ordered channels the endpoint delivers nonce n only after n - 1 has executed. If a message keeps failing, for example because its payload is invalid for the receiver, every later message on the channel is blocked. Before remediation there was no way to skip a message.

Preconditions
  • An application using ordered channels.
  • A message that cannot succeed.
Exploit scenario
  1. 1.A user sends a message the receiver will always reject; the application's ordered channel halts until it is upgraded.
Impact

Loss of liveness for the affected channel.

Recommendation

Allow the application owner to skip a failed message after a delay, with an event, and let receivers mark payloads as permanently invalid.

Fix
src/Endpoint.sol (remediation commit)diff
+ function skip(address app, uint64 srcChainId, uint64 nonce) external onlyAppOwner(app) {+     if (nonce != nextInbound[app][srcChainId]) revert NotHead();+     nextInbound[app][srcChainId] = nonce + 1;+     emit MessageSkipped(app, srcChainId, nonce);+ }
Resolution

Partially resolved. Application owners can skip the head message; a minimum delay before skipping, and receiver-driven invalidation, are pending.

AX-07LowAcknowledgedKey management

Messages verified before an attester is removed remain executable afterwards

src/AttestationVerifier.sol:L150–L171 (removeAttester)

Likelihood
Low
Impact
Medium
Description

Removing an attester affects future verification only. A message that was delivered and failed before the removal stays executable through retry, even if the removed attester's signature was needed to meet the threshold. When an attester is removed because its key is suspected to be compromised, messages it helped approve should be reviewed rather than remaining executable.

Preconditions
  • A compromised attester whose signature contributed to a failed message.
Exploit scenario
  1. 1.A forged message that failed on first delivery is retried after the compromised attester was removed.
Impact

Narrow window for messages approved by a revoked attester.

Recommendation

Record the attester-set version with failed messages and require re-verification against the current set on retry.

Resolution

Acknowledged; to be addressed together with the verifier-configuration link in AX-02.

AX-08InformationalResolvedCode quality

Delivery events do not index the message hash or destination

src/Endpoint.sol:L36–L44

Likelihood
Low
Impact
Low
Description

MessageDelivered(srcChainId, nonce) did not include the message hash or destination fields, so monitoring had to decode calldata to compare deliveries across chains. The rule that detected the July incident relied on this decoding.

Preconditions
  • None.
Exploit scenario
  1. 1.Not exploitable.
Impact

Slower and more fragile cross-chain monitoring.

Recommendation

Emit the typed-data hash, source and destination fields, with the hash indexed.

Resolution

Fixed.

06

Severity

8findings
  • Critical1 · 13%
  • High3 · 38%
  • Medium2 · 25%
  • Low1 · 13%
  • Informational1 · 13%

By vulnerability class

  • Denial of service2
  • Access control1
  • Bridge message validation1
  • Code quality1
  • Cryptography1
  • Key management1
  • Signature replay1

Likelihood and impact

Each finding placed by the likelihood of its preconditions and the impact of exploitation.

Findings by likelihood (columns) and impact (rows)
Impact ↓ / Likelihood →LowMediumHigh
High
0
Medium
0
Low
0
0

07

Remediation

3 of 8 findings are resolved, 1 acknowledged, 2 partially resolved and 2 open at remediation commit f61b3d09a7e2.

Remediation progress63%

Resolved and acknowledged findings count fully; partially resolved findings count half.

63%remediated
  • Resolved3 · 38%
  • Partially resolved2 · 25%
  • Acknowledged1 · 13%
  • Open2 · 25%
Findings by severity and remediation status
SeverityResolvedPartially resolvedAcknowledgedOpenTotal
Critical10001
High11013
Medium01012
Low00101
Informational10001
All findings32128

Residual items

  • AX-02HighPartially resolvedPartially resolved. An optional deadline field is supported and enforced when set; messages without a deadline and the link between failed messages and verifier configuration remain open.
  • AX-03HighOpenOpen. The team plans a two-day delay and a minimum threshold of three attesters.
  • AX-05MediumOpenOpen.
  • AX-06MediumPartially resolvedPartially resolved. Application owners can skip the head message; a minimum delay before skipping, and receiver-driven invalidation, are pending.
  • AX-07LowAcknowledgedAcknowledged; to be addressed together with the verifier-configuration link in AX-02.
  • ResolvedFixed and verified in the remediation review.
  • Partially resolvedMitigated; the residual risk is documented.
  • AcknowledgedAccepted by the protocol team with a stated rationale.
  • OpenNot yet addressed at the reviewed remediation commit.

08

Formal verification

Five rules covering delivery uniqueness, destination binding, signer uniqueness, verifier changes and ordered-channel liveness were written for the endpoint and attestation verifier. Destination binding and signer uniqueness were violated on the reviewed commit (AX-01, AX-04) and hold on the remediation commit; the verifier-change rule is violated while AX-03 remains open.

Tool: Certora Prover (CVL rules)

  • P1ProvedA message identified by its full hash is executed at most once per endpoint.Holds on both commits; the incident was a cross-endpoint replay.
  • P2ProvedA message can be executed only on the endpoint and chain named in its signed data.Remediation commit; counterexample on the reviewed commit (AX-01).
  • P3ProvedA threshold of t is met only by signatures from t distinct registered attesters.Remediation commit; counterexample on the reviewed commit (AX-04).
  • P4ViolatedChanging an application's verifier does not change whether a message already in flight can be executed.Open; see AX-02 and AX-03.
  • P5InconclusiveOn an ordered channel, every message is eventually executed or skipped.Depends on off-chain behaviour of the application owner; see AX-06.

A proved property holds for every execution of the model under its stated assumptions. Fuzzing and property-based results are evidence, not proofs, and are recorded as inconclusive.

09

Recommendations

  1. 01

    Finish the retry model

    Make deadlines mandatory for new messages and tie failed messages to the verifier configuration and attester set that approved them (AX-02, AX-07).

  2. 02

    Constrain application configuration

    Delay verifier changes, enforce a minimum threshold and expose each application's configuration so users and front ends can see it (AX-03).

  3. 03

    Enforce sender gas limits

    Reject deliveries that cannot supply the sender's gas limit (AX-05).

  4. 04

    Keep cross-chain monitoring

    The rule comparing deliveries across endpoints detected the July incident; extend it to verifier changes and retries of old messages.

  5. 05

    Guidance for applications

    Publish guidance for receivers: check the destination themselves, use deadlines and avoid relying on identical addresses across chains.

10

Methodology and limitations

  1. 01Incident-response analysis of the 22 July 2026 replay, including reconstruction of the attested hash
  2. 02Manual review of all in-scope contracts on the pre-incident commit
  3. 03Cross-chain fork tests replaying historical deliveries on all three destinations
  4. 04Invariant fuzzing of delivery uniqueness, retries and ordered channels
  5. 05Formal verification of delivery and verification rules
  6. 06Review of proxy administration and verifier configuration on all three chains
  7. 07Remediation review (in progress at the time of this version)

Severity classification

Critical
Direct loss of funds or permanent loss of control is achievable with little or no precondition.
High
Material loss or protocol disruption is achievable under realistic conditions.
Medium
Limited loss, degraded functionality, or impact that depends on specific conditions.
Low
Minor impact, defence-in-depth gaps, or issues with unlikely preconditions.
Informational
Code quality, documentation or best-practice observations without direct security impact.

Limitations

  • This version precedes the end of the remediation review; findings marked open or partially resolved may change status in the reissued report.
  • Light-client verifier implementations and attester node software were out of scope.
  • Formal verification covered the endpoint and attestation verifier; the executor was covered by fuzzing only.

No assessment can show that a system is free of vulnerabilities. This research assessment reflects the code at the commits listed. Quantix methodology

11

Technical appendix

Tools

  • FoundryMulti-fork replay tests across Optimism, Avalanche and Arbitrum
  • Certora ProverDelivery, destination-binding and signer-uniqueness rules
  • EchidnaInvariant fuzzing of retries and ordered channels
  • SlitherStatic analysis
Reviewed files (SHA-256) · 5 files
SHA-256 hashes of reviewed files
FileSHA-256
src/Endpoint.sol1d4693b3af292ec4e4a1015293b309e2c5a792ea24c0f2cfbaedb8866516637f
src/VerifierRegistry.sol128e63805102c279012ba87e7cc5c4c0364ba95bf19f139b3caa483dd3d30e51
src/AttestationVerifier.sol3d4f2ecde0598f315cdcd316ae212071412b6053a525d79407baffab1f641641
src/Executor.sold50a77603126435de2ef6787783b01991cf0b53b32c10fa08a066f93100fa30e
src/libraries/MessageCodec.sol33278ddd25999ddffe94c294c0c655c3437247a0b469de291eb67f9b6068f379

Notes

  • Document version 0.8: remediation review in progress.
  • See the case study "Cross-chain message replay on a second destination" for the incident narrative.
  • File hashes are SHA-256 digests of the reviewed sources at the audited commit.

Technical references

  1. 1.EIP-712: Typed structured data hashing and signing (opens in a new tab)
  2. 2.SWC-121: Missing protection against signature replay attacks (opens in a new tab)
  3. 3.CWE-294: Authentication Bypass by Capture-replay (opens in a new tab)
  4. 4.EIP-2612: Permit extension (deadline pattern for signed approvals) (opens in a new tab)
  5. 5.CWE-613: Insufficient Session Expiration (opens in a new tab)
  6. 6.OpenZeppelin Contracts: Access Control (opens in a new tab)
  7. 7.SWC-117: Signature malleability (opens in a new tab)
  8. 8.OpenZeppelin Contracts: Utilities (ECDSA) (opens in a new tab)
  9. 9.CWE-347: Improper Verification of Cryptographic Signature (opens in a new tab)
  10. 10.SWC-126: Insufficient gas griefing (opens in a new tab)
  11. 11.CWE-400: Uncontrolled Resource Consumption (opens in a new tab)
  12. 12.NIST SP 800-57 Part 1 Rev. 5: Recommendation for Key Management (opens in a new tab)
  13. 13.Solidity documentation: Events (opens in a new tab)

Document QX-TSA-2026-012 is under review (version 0.8).

The remediation review is still open, so no report document has been generated. The record above reflects the state at the remediation commit; version 1.0 and its PDF are produced when the review closes.

12

Report history

  1. 27 Jul 2026Review openedReviewed commit 4a0c8e2f6b1d in github.com/example-org/axeline-messaging
  2. 28 Aug 2026Review closedThree reviewers over twenty-four working days, following incident response for the 22 July 2026 replay; remediation review in progress
  3. After reviewRemediation reviewFixes checked at commit f61b3d09a7e2
  4. After reviewVersion 0.8 under reviewQX-TSA-2026-012: the PDF is issued when the remediation review closes

Commission an assessment written to be verified.

Share the repository and the commit you plan to deploy. We reply with scoping questions and an estimate.