Skip to content

fix: merge security-audit-fixes audit fixes into main#269

Merged
0xNilesh merged 42 commits into
mainfrom
security-audit-fixes
Jun 17, 2026
Merged

fix: merge security-audit-fixes audit fixes into main#269
0xNilesh merged 42 commits into
mainfrom
security-audit-fixes

Conversation

@0xNilesh

Copy link
Copy Markdown
Member

Promotes the accumulated audit fixes on security-audit-fixes to main, including the 14 commits just merged via #268.

Heads-up for the merge:

  • main is ahead of security-audit-fixes on the evm dependency (pushchain/evm …20260616 vs …20260604) and has 1 commit security-audit-fixes lacks. Expect a go.mod resolution at merge — keep main's newer evm pin.
  • The ported audit fixes were built and unit-tested against the older evm pin (rc2 patch-level difference); worth a CI pass on main's evm.

Aman035 and others added 30 commits June 10, 2026 12:56
* add: timeouts to server

* refactor: harden health to accept only get req

(cherry picked from commit 6f961a6)
…) and MarkBallotFinalized() (#217)

(cherry picked from commit 4d9c8ee)
…an Aggregation

* feat: added min val required as 2 for first chain oracle vote

* tests: updated tests for chain meta first vote changes

* feat: updated min validator votes requird for first chain meta value to 3 instead of 2

(cherry picked from commit 8848c0a)
* feat: remove default admin addresses from modules

* feat: added modules admin in testnet genesis creation script

* tests: added default admin integration tests

* tests: added default admin integration tests

* fix: fixed interchain gh workflow e2e tests

* fix: fixed interchain gh workflow e2e tests

* fix: fixed interchain gh workflow e2e tests

(cherry picked from commit 2003414)
…r ASCII hex, not the raw message

(cherry picked from commit 5659657)
… code hash as a deployed contract (#237)

(cherry picked from commit a426e3f)
… block height expiry

(cherry picked from commit 3948c36)
…alidation and in the handler (#242)

(cherry picked from commit a4ae809)
…tor network identity with placeholders (#243)

(cherry picked from commit 82fd7fe)
… in validation and logging (#244)

(cherry picked from commit bf0c3ee)
…etTokenConfigByPRC20 (#245)

(cherry picked from commit f409cb3)
… ID collides when a single source tx contains multiple Inbounds

(cherry picked from commit e46574f)
…going-TSS guard used elsewhere (#258)

(cherry picked from commit 3f3d73d)
…m and can deadlock finalization (#259)

* feat: narrowed eligible voters to only return the validators that are bonded

* feat: added automatic staking hooks to handle bonding/unbonding of UVs

* feat: added MsgRecomputeBallotQuorum for adjusting a ballot quorum and MsgRevertStuckInbound for reverting a stuck inbound when its ballot has been expired as an escape hatch

(cherry picked from commit 38fbf73)
#219)

* feat: added proto changes for pendingInbounds and expiredInbounds

* refactor: added generated protobuf

* feat: added ballot hooks and updated changes for pendingInbounds and pendingOutbounds

* tests: added integration tests for pendingInbounds proto changes

* docs: added pendingInbounds and pendingOutbounds lifecycle in README

* test: assert signing_deadline + variants coexist on PendingOutboundEntry

Guards the F-2026-16642 <- audit-fixes merge resolution where both branches
claimed proto field 4 on PendingOutboundEntry. signing_deadline kept field 4
(deployed on testnet); the per-variant audit trail moved to field 5. This test
seeds an entry with a signing deadline, records outbound votes, and asserts
both fields survive the RecordOutboundVote read-modify-write.

(cherry picked from commit cbb9cf4)
* feat(utils): per-namespace canonicalization helpers for keys

Shared canonical string forms for ballot/storage keys, keyed by CAIP-2
namespace: eip155 addresses -> EIP-55, eip155 hashes -> 0x-lowercase,
solana -> base58 preserved (case-significant) / hex lowercased, other ->
trimmed. Strict variants reject malformed input; lenient variants fall back
to trimmed input on the vote-ingress path that must never drop a vote.
Foundation for the ballot-key and token-key canonicalization fixes.

* fix(uregistry): canonicalize token addresses in storage keys [F-2026-17022]

GetTokenConfigsStorageKey canonicalizes the address per CAIP-2 namespace
(EIP-55 for eip155), making the storage key the single canonical chokepoint
for add/update/remove/get. The PRC20 reverse index moves from lowercase to
EIP-55 and GetTokenConfigByPRC20 canonicalizes its query identically.
TokenConfig/NativeRepresentation ValidateBasic enforce parseable addresses,
so case-variant duplicate registrations collide on the canonical key and are
rejected.

* fix(utss): canonicalize fund-migration txHash before ballot key [F-2026-17041]

VoteFundMigration canonicalizes the observed txHash against the migration's
chain namespace before deriving the ballot key, so equivalent hash encodings
from different validators aggregate on one ballot instead of fragmenting.
Adds MsgVoteFundMigration.ValidateBasic.

* fix(uexecutor): canonical voting digests for inbound/outbound ballots [F-2026-16039, F-2026-16632]

Replace full-proto-Marshal ballot identity with explicit injective digests
(hashFields: sha256 over per-field sha256 hex digests joined by ':'),
domain-separated via collections prefixes so inbound vs outbound keys stay
disjoint in the shared Ballots map. The inbound digest covers every
execution-relevant field except universal_payload (recomputed on-chain from
raw_payload); the outbound digest covers all observation fields. Inbound
fields are canonicalized at vote / admin-revert ingress and the key functions
self-canonicalize, so stored state, UTX keys and registry lookups all
converge on one representation per logical event.

Because the digests are one-way, the ballot terminal hook now locates the
audit-trail entry by scanning PendingInbounds for the ballot id instead of
decoding the inbound back out of the id. Existing test assertions updated for
the canonical (EIP-55 / lowercase-hash) stored forms.

* feat(uexecutor): InboundKeys and OutboundBallotKey queries

Let off-chain validators read the canonical UTX id + ballot ids from the
chain rather than re-implementing the canonicalization/digest rules.
InboundKeys(inbound) returns utx_id, ballot_id and the canonical inbound;
OutboundBallotKey(utx_id, outbound_id, observed_tx) looks up the outbound's
destination chain to canonicalize the observed hash, then returns the ballot
id and canonical observation. Includes generated proto.

(cherry picked from commit 93de525)
F-16996's fix was deleting the buggy v2 migrate.go, which is correct for the
fresh-genesis mainnet branch. On testnet the v2 migration already executed
(module is at consensus v2) and must stay registered so new nodes replaying
from genesis reach the same state. The placeholder-identity bug is a separate
forward-remediation decision, out of scope for this upgrade port.
- implement RebuildPRC20Index (M2 migration helper; test existed, impl didn't)
- genesis_internal_test: statedb.Account.Balance is *uint256.Int on evm v1.0
  (was *big.Int on v0.2.1); system-contract count 46->47 to match final
  audit-fixes (0xCA auto-reserved after legacy usigverifier removal)
- utss v4 migrate_test stub: UpdateValidatorStatus gained TransitionReason
  param from F-16991
- go.mod/go.sum: go mod tidy (base58 for canonicalization)
New gov software-upgrade 'security-audit-fixes' appended to the Upgrades slice
(main's existing handlers untouched). RunMigrations drives two state migrations:

- uexecutor v6 -> v7: PendingInbounds KeySet -> variant-aware Map reshape at
  prefix 2 (F-2026-16642). Legacy bare keys rewritten as PendingInboundEntry.
- uregistry v3 -> v4: re-key TokenConfigs under canonical (EIP-55) keys and
  backfill the PRC20 reverse index (F-2026-17022).

utss/uvalidator changes are additive (TransitionReason defaults, new msgs) so
their consensus versions are unchanged. Staking-hook wiring for F-16991 came in
via app/app.go with that commit. Reserved system-contract deploy (F-17025, 41
slots) intentionally deferred to fresh-genesis/mainnet.
v1.0 CallEVM added a gasCap *big.Int param after commit; the ported
balanceOf assertion used the v0.2.1 arg order.
…224)

* add: opts in svm rpc client

* add: pagination in GetSignaturesForAddress, fix: slot sig order issue

* chore: tc

(cherry picked from commit 35bd9b6)
* remove: initial config log

* fix: remove logging rpc url in pushcore

* refactor: pushsigner logger

* refactor: core logs, remove unnecessary info logs

* fix: common chain logs

* fix: push client logs

* fix: chains log refactor

* fix: tss logs

(cherry picked from commit a00e7d6)
* add: MaxFrameSize to p2p network

* refactor: move coordinator check up so malicious peer req are rejected sooner

* chore: fix tc

(cherry picked from commit 9524142)
… chain client is not attached

(cherry picked from commit 634e234)
…ecution success

* add: evm event confirmation check receipt status

* add: svm tx confirmation check err status

* chore: tc

(cherry picked from commit ed82cbe)
…RPC fails

* add: cache with staleness

* chore: tc

(cherry picked from commit 7d748bd)
…st retry storm after peer already migrated funds

* F-2026-16962 | fund migration vote races on balance re-query

Brings PR #209 (pushchain/push-chain-node) onto audit-fixes for audit
review.

The migration sweep amount is computed at signing time from the old
vault's balance, but the broadcast path was re-querying the balance —
racing with another validator's successful sweep would produce a
different sweep amount and a different signed tx hash.

- UnsignedSigningReq: add TSSFundMigrationAmount carried alongside Nonce
  from signing to broadcast (both are signing-time-decided values that
  must reach broadcast unchanged)
- EVM tx_builder: store maxTransfer in the signing request; broadcast
  reuses it verbatim instead of recomputing
- sessionmanager: persist and forward TSSFundMigrationAmount through
  the signing session
- txbroadcaster: pass the stored amount to the broadcast call

* add: tc

(cherry picked from commit 58ed01b)
Aman035 and others added 12 commits June 17, 2026 11:46
…Tx not found” as reverted

* feat: added tss signing deadline in chainConfig and pendingOutboundEntry

* tests: added tests for deadline changes

* feat: added signingDeadline in OutboundCreated event

* fix: parse signatureDeadline

* fix: tx builder tss msg creation

* add: check for queryTime

* fix: add deadline check in broadcast

* fix: handle deadline = 0 , legacy tx

* fix: svm revert logic

* fix: tc

* fix: simulation tc

* fix: evm revert logic when tx is not found

* fix: log binding

* remove unused fn

* chore: tc

* fix: nonce handling + refactor

---------

Co-authored-by: Nilesh Gupta <guptanilesh2312@gmail.com>
(cherry picked from commit 78a44a4)
* refactor: return last error

* remove: best effort approach

* fix: tx builder

* feat: add rent reclaimer for orphan pdas

* revert: rpc fn

* fix: lazy handling in tx builder

* fix: add temp retires approach in svm

* skip svm chains in coordinator to prevent slowness from svm retires

* fix: orphan pda closure

* fix: txBuilder ref finalize account write status

* fix: tc

* fix: storeRefundRecipient

(cherry picked from commit 2882a17)
…tuck due to architecture (failure visibility limited to signer set)

* feat: added tss signing deadline in chainConfig and pendingOutboundEntry

* tests: added tests for deadline changes

* feat: added signingDeadline in OutboundCreated event

* fix: parse signatureDeadline

* fix: tx builder tss msg creation

* add: check for queryTime

* fix: add deadline check in broadcast

* fix: handle deadline = 0 , legacy tx

* fix: svm revert logic

* fix: tc

* fix: simulation tc

* fix: evm revert logic when tx is not found

* fix: log binding

* remove unused fn

* chore: tc

* fix: nonce handling + refactor

* route internal messages via sessionManager

* fix: log level

* remove: deprecated doc

* chore: fix formating

* fix: allow balance to be added to query for verification and avoiding query

* feat: add ack with sig & coordinator verification

* fix: msgHandler validation

* fix: add broadcasting and handling to increase set

* minor error logs + tc

* persist signature

* mark found tx as braodcasted

---------

Co-authored-by: Nilesh Gupta <guptanilesh2312@gmail.com>
(cherry picked from commit 83a0528)
…EVERT based on push chain state, not observed chain state and can result into false voting

* feat: added tss signing deadline in chainConfig and pendingOutboundEntry

* tests: added tests for deadline changes

* feat: added signingDeadline in OutboundCreated event

* fix: parse signatureDeadline

* fix: tx builder tss msg creation

* add: check for queryTime

* fix: add deadline check in broadcast

* fix: handle deadline = 0 , legacy tx

* fix: svm revert logic

* fix: tc

* fix: simulation tc

* fix: evm revert logic when tx is not found

* fix: log binding

* remove unused fn

* chore: tc

* fix: nonce handling + refactor

* route internal messages via sessionManager

* fix: log level

* remove: deprecated doc

* chore: fix formating

* fix: allow balance to be added to query for verification and avoiding query

* feat: add ack with sig & coordinator verification

* fix: msgHandler validation

* fix: add broadcasting and handling to increase set

* minor error logs + tc

* change to hard delete

* fix: attach eventCleaners to external chains

* removed artifical expiry and fixed sweeper

* fix: event cleaner closing

* fix: tc

---------

Co-authored-by: Nilesh Gupta <guptanilesh2312@gmail.com>
(cherry picked from commit 65b529a)
…tuck due to architecture (failure visibility limited to signer set)

* fix: inprogress settlement

* fix: solana tx resolving

(cherry picked from commit 1fa5a61)
…e endpoint under concurrent load

(cherry picked from commit 4706e90)
fix: port remaining audit-fixes commits onto security-audit-fixes
Makes the Push-origin UTX id robust by contract (mirrors GetInboundUniversalTxKey, normalizes case/0x); no behavior change for real EVM receipt hashes. Adds Pc UTX key tests.
@0xNilesh 0xNilesh merged commit b2d9eff into main Jun 17, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants