Auxiliary-info store keeps unbounded data from any unauthenticated peer
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 56/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- go
- Ambito
- distributed-systems, security
Direzione di ricerca
Read msm/auxiliary.go and instance.go:413-423 to trace how auxiliary messages reach the store and how sender identities relate to the validator set for the next epoch. Review the existing approval checks in msm/approvals.go:54-60 and the epoch setup in instance.go:564-596. Done means messages from nonmembers are dropped, stored entries and bytes are bounded, and entries are removed when no longer usable; the issue also calls for a test covering non-validator identities.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Details
Any computer that can connect to a Simplex validator, even one that is not a validator, can crash it by running it out of memory. It needs no role, signature or victim action. It sends auxiliary-info messages under many made-up peer identities. The store auxInfoStore.HandleAuxiliaryMessage keeps every one, with no membership check, size cap or eviction.
flowchart TD
n1["any network peer, not a validator"]
n2["Instance.handleMessageForEpoch"]
n3["auxInfoStore.HandleAuxiliaryMessage"]
n4["validator memory (sentInfo map)"]
n5["validator-membership check and size cap"]
n1 -->|"sends auxiliary info under many identities"| n2
n2 -->|"passes on after epoch check only"| n3
n3 -->|"stores every entry, never evicts"| n4
n5 -->|"not applied"| n3
classDef actor stroke:#2563eb,stroke-width:2px
classDef vulnerable_code stroke:#dc2626,stroke-width:2px
classDef existing_control stroke:#16a34a,stroke-width:2px
classDef missing_control stroke:#dc2626,stroke-width:2px,stroke-dasharray:5 5
classDef asset stroke:#9333ea,stroke-width:2px
classDef component stroke:#6b7280,stroke-width:1px
class n1 actor
class n2 component
class n3 vulnerable_code
class n4 asset
class n5 missing_control
- attacker reads the current epoch number from any block or vote. The epoch number is public. It is the only value the attacker needs to get a message past the gate.
- attacker sends an
AuxiliaryInfomessage of up to about 2 MiB from each of many self-made peer identities. The host's per-message cap, mirrored asDefaultMaxMessageSize, is about 2 MiB. That is the only limit on each message's size. (avalanchego/misc.go:20) - the handler
Instance.handleMessageForEpochpasses each message toStateMachine.HandleAuxiliaryInfoafter checking only thatmsg.AuxiliaryInfo.Epoch == i.e.Epoch. The sender is never checked against a validator set, so any peer passes. (instance.go:413-423) - the store
auxInfoStore.HandleAuxiliaryMessagewritesa.sentInfo[from] = infofor every sender. There is no validator-membership check, no cap on the number of senders, no cap onlen(info.Data)beyond the host limit, and no eviction. Nothing in the repository deletes fromsentInfo. (msm/auxiliary.go:106-112) - the validator keeps all entries until
createEpochConfigbuilds a newStateMachinefor the next epoch. The map therefore lives for the whole epoch. Memory held is the number of distinct sender IDs times the message size. (instance.go:564-596) - the validator process runs out of memory and crashes. The attacker can do this to every validator at once, which stalls consensus.
Evidence
- msm/auxiliary.go:106–112
- instance.go:413–423
- msm/auxiliary.go:89–104
- msm/approvals.go:54–60
- instance.go:564–596
- msm/auxiliary.go:115–147
- avalanchego/misc.go:20
Impact
The attacker makes a validator's memory grow until the process is killed, and can do this to every validator at once, stalling consensus. No data is disclosed or modified.
Reproduction steps
- The attacker is any peer that can connect to a validator and deliver messages to
HandleMessage. It does not have to be a validator. It reads the current epoch number from a block or vote, then sends oneAuxiliaryInfomessage of about 2 MiB from each of many self-made peer identities. Each message passes the epoch check atinstance.go:415and stays insentInfountil the epoch ends. In the shipped configuration (NoopAuxiliaryInfoApp, whoseIsSufficientalways returns true) the stored entries are never read, but they are still retained. With a real auxiliary-info application,collectAuxInfoalso sorts and runsIsLegalAppendon every stored entry each time the leader builds a block during a transition, so the flood costs CPU as well.
Recommended fix
auxInfoStore.HandleAuxiliaryMessage (msm/auxiliary.go:106-112) keeps state keyed by an unchecked sender identity. It has no membership check, size cap or eviction, so a peer that is not a validator can make the node allocate memory without limit.
Fix criteria: Auxiliary info is kept only from members of the next epoch's validator set, and is dropped otherwise. The number of entries and the total bytes are bounded by a limit derived from the validator-set size and the message cap. Entries are discarded once they can no longer be used. A test sends messages from N non-validator identities and confirms that len(store.sentInfo) stays 0 and heap use does not grow with N.
Status on main
Re-checked against main at 90995e0 on 2026-10-26; still present:
instance.go:413-423 only checks msg.AuxiliaryInfo.Epoch == i.e.Epoch before calling msm.HandleAuxiliaryInfo (msm/msm.go:248-250). auxInfoStore.HandleAuxiliaryMessage (msm/auxiliary.go:106-112) runs a.sentInfo[from] = info with no validator-membership check, no limit on entries or bytes, and no eviction. collectAuxInfo (msm/auxiliary.go:115-147) sorts every stored entry and runs IsLegalAppend on each one. No PR touches this. Open issue #608 is about a different aux-info problem.
Severity: HIGH
Status: Open
Category: Resource exhaustion
CWE: CWE-770
Repository: ava-labs/Simplex
Branch: main
Date created: 2026-10-26
Claude Security finding: https://claude.ai/security/findings/find_01QjhTxds7zdb3mrNDj3fuAa
- Lingua principale
- Go
- Stelle
- 22
- Fork
- 4
- Merge medio
- 1g 16h
- PR unite (30g)
- 35
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di ava-labs/Simplex
-
Unverified sealing-block finalization lets a validator redirect a syncing node's replication requestsForse già presa @yacovm l’ha presa 1 giorno fa. Apertalow security
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
ava-labs/Simplex#666 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
Epoch discovery accepts a sealing block on a head count, letting low-stake validators forge epochsForse già presa @yacovm l’ha presa 1 giorno fa. Apertamedium security
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
I maintainer di solito rispondono entro 1 giorno
-
Failed notarization WAL write lets a node sign both a finalize vote and an empty voteForse già presa @yacovm l’ha presa 3 giorni fa. Apertamedium security
Difficoltà 4/5 3-5 giorni Idoneità per principianti 38/100
I maintainer di solito rispondono entro 1 giorno
-
Builder ignores parent's P-chain height, so a leader's maximal height stalls honest proposalsForse già presa @yacovm l’ha presa 4 giorni fa. Apertamedium security
Difficoltà 4/5 3-5 giorni Idoneità per principianti 55/100
I maintainer di solito rispondono entro 1 giorno
-
Honest builders never raise timestamp to parent's, so a leader's future timestamp voids honest proposalsForse già presa @yacovm l’ha presa 4 giorni fa. Apertahigh security
Difficoltà 4/5 3-5 giorni Idoneità per principianti 43/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di ava-labs/Simplex
Issue simili
-
Headerless responses block while skipping duplicate status linesForse già presa @mynhe l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 73/100
projectdiscovery/rawhttp#554 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 80/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
lognorman20/monaco#7428 ·
-
docs(prompts): IF BLOCKED workflow-scope branch says to comment on the issue on jira/local trackersApertaagent-butler-finding bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
jordansmall/spindrift#6238 ·
I maintainer di solito rispondono entro 1 giorno