Source |
CVE Liste |
Identifiant |
8351883 |
Date de publication |
2023-07-03 17:15:09 (vue: 2023-07-03 19:07:06) |
Titre |
CVE-2023-34450 |
Texte |
CometBft est un middleware byzantin pour les défauts (BFT) qui prend une machine de transition d'état et la reproduit sur de nombreuses machines.Une modification interne apportée aux versions 0,34,28 et 0,37.1 à la façon dont Struct «Peerstate» est sérialisé en JSON a introduit une impasse lorsque la nouvelle fonction Marshalljson est appelée.Cette fonction peut être appelée à partir de deux endroits.Le premier est via les journaux, la définition du module de journalisation du «consensus» au niveau «débogage» (ne devrait pas se produire en production) et la définition du format de sortie du journal sur JSON.Le second est via RPC `Dump_Consensus_State`.
Le cas 1, qui ne devrait pas être touché en production, allait finalement frapper la blocage dans la plupart des Goroutines, arrêtant efficacement le nœud.
Dans le cas 2, seules les structures de données liées au premier pair seront bloquées, ainsi que le (s) thread (s) traitant de la demande de RPC.Cela signifie qu'un seul des canaux de communication avec les pairs du nœud \\ sera bloqué.Finalement, le pair allait passer du temps et exclu de la liste (généralement après 2 minutes).Les Goroutines impliquées dans la blocage ne seront pas collectées aux ordures, mais elles n'interféreront pas avec le système après l'exclusion du pair.
Le pire cas théorique pour le cas 2, est un réseau avec seulement deux nœuds validateurs.Dans ce cas, chacun des nœuds n'a qu'une seule structure «Peerstate».Si `dump_consensus_state` est appelé dans l'un ou l'autre nœud (ou les deux), la chaîne s'arrêtera jusqu'à ce que le temps de connexion par les pairs soit sorti, après quoi les nœuds se reconnecteront (avec différentes structures« Peerstate ») et que la chaîne progressera à nouveau.Ensuite, le même processus peut être répété.
À mesure que le nombre de nœuds dans un réseau augmente, et donc, le nombre de structures homologues chaque nœud maintient, la possibilité de reproduire la perturbation visible avec deux nœuds diminue.Seule la première structure «Peerstate» sera imprégnée de blocage, et non les autres (RPC `Dump_Consensus_State» y accède dans une boucle pour une boucle, donc la blocage à la première itération provoque le reste des itérations de cette boucle «pour» ne jamais être atteinte).
Cette régression a été fixée dans les versions 0,34,29 et 0,37.2.Certaines solutions de contournement sont disponibles.Pour le cas 1 (en appuyant sur l'impasse via les journaux), soit ne définissez pas la sortie du journal sur "JSON", laissez "Plain", ou ne définissez pas le module de journalisation du consensus sur "débogage", laissez-leà "info" ou supérieur.Pour le cas 2 (en appuyant sur l'impasse via RPC `Dump_Consensus_State`), n'exposez pas` dump_consensus_state` RPC Endpoint à l'Internet public (par exemple, via les règles dans la configuration Nginx de One \\).
CometBFT is a Byzantine Fault Tolerant (BFT) middleware that takes a state transition machine and replicates it on many machines. An internal modification made in versions 0.34.28 and 0.37.1 to the way struct `PeerState` is serialized to JSON introduced a deadlock when new function MarshallJSON is called. This function can be called from two places. The first is via logs, setting the `consensus` logging module to "debug" level (should not happen in production), and setting the log output format to JSON. The second is via RPC `dump_consensus_state`.
Case 1, which should not be hit in production, will eventually hit the deadlock in most goroutines, effectively halting the node.
In case 2, only the data structures related to the first peer will be deadlocked, together with the thread(s) dealing with the RPC request(s). This means that only one of the channels of communication to the node\'s peers will be blocked. Eventually the peer will timeout and excluded from the list (typically after 2 minutes). The goroutines involved in the deadlock will not be garbage collected, but they will not interfere with the system aft |
Notes |
|
Envoyé |
Oui |
Condensat |
2023 34450 `consensus` `dump `peerstate` accesses after again are available bft blocked both but byzantine called can case causes chain channels collected cometbft communication connections consensus cve data deadlock deadlocked dealing debug decreases different don each effectively either endpoint eventually excluded expose fault first fixed format from function garbage goroutines halt halting happen has higher hit hitting increases info interfere internal internet introduced involved iteration iterations json leave level list log logging logs loop machine machines made maintains many marshalljson means middleware minutes modification module most network never new nginx node nodes not number one only others out output peer peers perturbation places plain possibility process production progress public reached reconnect regression related repeated replicates reproducing request rest rpc rules same second serialized set setting setup should some state state` struct structs structures system takes them then theoretical thread thus time timeout together tolerant transition two typically until validator versions visible way when which will workarounds worst |
Tags |
|
Stories |
|
Move |
|