github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/spec/light-client/attacks/isolate-attackers_002_reviewed.md (about) 1 <!-- markdown-link-check-disable --> 2 3 # Lightclient Attackers Isolation 4 5 Adversarial nodes may have the incentive to lie to a lightclient about the state of a Tendermint blockchain. An attempt to do so is called attack. Light client [verification][verification] checks incoming data by checking a so-called "commit", which is a forwarded set of signed messages that is (supposedly) produced during executing Tendermint consensus. Thus, an attack boils down to creating and signing Tendermint consensus messages in deviation from the Tendermint consensus algorithm rules. 6 7 As Tendermint consensus and light client verification is safe under the assumption of more than 2/3 of correct voting power per block [[TMBC-FM-2THIRDS]][TMBC-FM-2THIRDS-link], this implies that if there was an attack then [[TMBC-FM-2THIRDS]][TMBC-FM-2THIRDS-link] was violated, that is, there is a block such that 8 9 - validators deviated from the protocol, and 10 - these validators represent more than 1/3 of the voting power in that block. 11 12 In the case of an [attack][node-based-attack-characterization], the lightclient [attack detection mechanism][detection] computes data, so called evidence [[LC-DATA-EVIDENCE.1]][LC-DATA-EVIDENCE-link], that can be used 13 14 - to proof that there has been attack [[TMBC-LC-EVIDENCE-DATA.1]][TMBC-LC-EVIDENCE-DATA-link] and 15 - as basis to find the actual nodes that deviated from the Tendermint protocol. 16 17 This specification considers how a full node in a Tendermint blockchain can isolate a set of attackers that launched the attack. The set should satisfy 18 19 - the set does not contain a correct validator 20 - the set contains validators that represent more than 1/3 of the voting power of a block that is still within the unbonding period 21 22 # Outline 23 24 After providing the [problem statement](#Part-I---Basics-and-Definition-of-the-Problem), we specify the [isolator function](#Part-II---Protocol) and close with the discussion about its [correctness](#Part-III---Completeness) which is based on computer-aided analysis of Tendermint Consensus. 25 26 # Part I - Basics and Definition of the Problem 27 28 For definitions of data structures used here, in particular LightBlocks [[LCV-DATA-LIGHTBLOCK.1]](https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/verification/verification_002_draft.md#lcv-data-lightblock1), we refer to the specification of [Light Client Verification][verification]. 29 30 The specification of the [detection mechanism][detection] describes 31 32 - what is a light client attack, 33 - conditions under which the detector will detect a light client attack, 34 - and the format of the output data, called evidence, in the case an attack is detected. The format is defined in 35 [[LC-DATA-EVIDENCE.1]][LC-DATA-EVIDENCE-link] and looks as follows 36 37 ```go 38 type LightClientAttackEvidence struct { 39 ConflictingBlock LightBlock 40 CommonHeight int64 41 } 42 ``` 43 44 The isolator is a function that gets as input evidence `ev` 45 and a prefix of the blockchain `bc` at least up to height `ev.ConflictingBlock.Header.Height + 1`. The output is a set of *peerIDs* of validators. 46 47 We assume that the full node is synchronized with the blockchain and has reached the height `ev.ConflictingBlock.Header.Height + 1`. 48 49 #### **[LCAI-INV-Output.1]** 50 51 When an output is generated it satisfies the following properties: 52 53 - If 54 - `bc[CommonHeight].bfttime` is within the unbonding period w.r.t. the time at the full node, 55 - `ev.ConflictingBlock.Header != bc[ev.ConflictingBlock.Header.Height]` 56 - Validators in `ev.ConflictingBlock.Commit` represent more than 1/3 of the voting power in `bc[ev.CommonHeight].NextValidators` 57 - Then: The output is a set of validators in `bc[CommonHeight].NextValidators` that 58 - represent more than 1/3 of the voting power in `bc[ev.commonHeight].NextValidators` 59 - signed Tendermint consensus messages for height `ev.ConflictingBlock.Header.Height` by violating the Tendermint consensus protocol. 60 - Else: the empty set. 61 62 # Part II - Protocol 63 64 Here we discuss how to solve the problem of isolating misbehaving processes. We describe the function `isolateMisbehavingProcesses` as well as all the helping functions below. In [Part III](#part-III---Completeness), we discuss why the solution is complete based on result from analysis with automated tools. 65 66 ## Isolation 67 68 ### Outline 69 70 We first check whether the conflicting block can indeed be verified from the common height. We then first check whether it was a lunatic attack (violating validity). If this is not the case, we check for equivocation. If this also is not the case, we start the on-chain [accountability protocol](https://docs.google.com/document/d/11ZhMsCj3y7zIZz4udO9l25xqb0kl7gmWqNpGVRzOeyY/edit). 71 72 #### **[LCAI-FUNC-MAIN.1]** 73 74 ```go 75 func isolateMisbehavingProcesses(ev LightClientAttackEvidence, bc Blockchain) []ValidatorAddress { 76 77 reference := bc[ev.conflictingBlock.Header.Height].Header 78 ev_header := ev.conflictingBlock.Header 79 80 ref_commit := bc[ev.conflictingBlock.Header.Height + 1].Header.LastCommit // + 1 !! 81 ev_commit := ev.conflictingBlock.Commit 82 83 if violatesTMValidity(reference, ev_header) { 84 // lunatic light client attack 85 signatories := Signers(ev.ConflictingBlock.Commit) 86 bonded_vals := Addresses(bc[ev.CommonHeight].NextValidators) 87 return intersection(signatories,bonded_vals) 88 89 } 90 // If this point is reached the validator sets in reference and ev_header are identical 91 else if RoundOf(ref_commit) == RoundOf(ev_commit) { 92 // equivocation light client attack 93 return intersection(Signers(ref_commit), Signers(ev_commit)) 94 } 95 else { 96 // amnesia light client attack 97 return IsolateAmnesiaAttacker(ev, bc) 98 } 99 } 100 ``` 101 102 - Implementation comment 103 - If the full node has only reached height `ev.conflictingBlock.Header.Height` then `bc[ev.conflictingBlock.Header.Height + 1].Header.LastCommit` refers to the locally stored commit for this height. (This commit must be present by the precondition on `length(bc)`.) 104 - We check in the precondition that the unbonding period is not expired. However, since time moves on, before handing the validators over Cosmos SDK, the time needs to be checked again to satisfy the contract which requires that only bonded validators are reported. This passing of validators to the SDK is out of scope of this specification. 105 - Expected precondition 106 - `length(bc) >= ev.conflictingBlock.Header.Height` 107 - `ValidAndVerifiedUnbonding(bc[ev.CommonHeight], ev.ConflictingBlock) == SUCCESS` 108 - `ev.ConflictingBlock.Header != bc[ev.ConflictingBlock.Header.Height]` 109 - `ev.conflictingBlock` satisfies basic validation (in particular all signed messages in the Commit are from the same round) 110 - Expected postcondition 111 - [[FN-INV-Output.1]](#FN-INV-Output1) holds 112 - Error condition 113 - returns an error if precondition is violated. 114 115 ### Details of the Functions 116 117 #### **[LCAI-FUNC-VVU.1]** 118 119 ```go 120 func ValidAndVerifiedUnbonding(trusted LightBlock, untrusted LightBlock) Result 121 ``` 122 123 - Conditions are identical to [[LCV-FUNC-VALID.2]][LCV-FUNC-VALID.link] except the precondition "*trusted.Header.Time > now - trustingPeriod*" is substituted with 124 - `trusted.Header.Time > now - UnbondingPeriod` 125 126 #### **[LCAI-FUNC-NONVALID.1]** 127 128 ```go 129 func violatesTMValidity(ref Header, ev Header) boolean 130 ``` 131 132 - Implementation remarks 133 - checks whether the evidence header `ev` violates the validity property of Tendermint Consensus, by checking against a reference header 134 - Expected precondition 135 - `ref.Height == ev.Height` 136 - Expected postcondition 137 - returns evaluation of the following disjunction 138 **[LCAI-NONVALID-OUTPUT.1]** == 139 `ref.ValidatorsHash != ev.ValidatorsHash` or 140 `ref.NextValidatorsHash != ev.NextValidatorsHash` or 141 `ref.ConsensusHash != ev.ConsensusHash` or 142 `ref.AppHash != ev.AppHash` or 143 `ref.LastResultsHash != ev.LastResultsHash` 144 145 ```go 146 func IsolateAmnesiaAttacker(ev LightClientAttackEvidence, bc Blockchain) []ValidatorAddress 147 ``` 148 149 - Implementation remarks 150 - This triggers the [query/response protocol](https://docs.google.com/document/d/11ZhMsCj3y7zIZz4udO9l25xqb0kl7gmWqNpGVRzOeyY/edit). 151 - Expected postcondition 152 - returns attackers according to [LCAI-INV-Output.1]. 153 154 ```go 155 func RoundOf(commit Commit) []ValidatorAddress 156 ``` 157 158 - Expected precondition 159 - `commit` is well-formed. In particular all votes are from the same round `r`. 160 - Expected postcondition 161 - returns round `r` that is encoded in all the votes of the commit 162 - Error condition 163 - reports error if precondition is violated 164 165 ```go 166 func Signers(commit Commit) []ValidatorAddress 167 ``` 168 169 - Expected postcondition 170 - returns all validator addresses in `commit` 171 172 ```go 173 func Addresses(vals Validator[]) ValidatorAddress[] 174 ``` 175 176 - Expected postcondition 177 - returns all validator addresses in `vals` 178 179 # Part III - Completeness 180 181 As discussed in the beginning of this document, an attack boils down to creating and signing Tendermint consensus messages in deviation from the Tendermint consensus algorithm rules. 182 The main function `isolateMisbehavingProcesses` distinguishes three kinds of wrongly signed messages, namely, 183 184 - lunatic: signing invalid blocks 185 - equivocation: double-signing valid blocks in the same consensus round 186 - amnesia: signing conflicting blocks in different consensus rounds, without having seen a quorum of messages that would have allowed to do so. 187 188 The question is whether this captures all attacks. 189 First observe that the first check in `isolateMisbehavingProcesses` is `violatesTMValidity`. It takes care of lunatic attacks. If this check passes, that is, if `violatesTMValidity` returns `FALSE` this means that [[LCAI-NONVALID-OUTPUT.1]](#LCAI-FUNC-NONVALID1]) evaluates to false, which implies that `ref.ValidatorsHash = ev.ValidatorsHash`. Hence, after `violatesTMValidity`, all the involved validators are the ones from the blockchain. It is thus sufficient to analyze one instance of Tendermint consensus with a fixed group membership (set of validators). Also, as we have two different blocks for the same height, it is sufficient to consider two different valid consensus values, that is, binary consensus. 190 191 For this fixed group membership, we have analyzed the attacks using the TLA+ specification of [Tendermint Consensus in TLA+][tendermint-accountability]. We checked that indeed the only possible scenarios that can lead to violation of agreement are **equivocation** and **amnesia**. An independent study by Galois of the protocol based on [Ivy proofs](https://github.com/tendermint/spec/tree/master/ivy-proofs) led to the same conclusion. 192 193 # References 194 195 [[supervisor]] The specification of the light client supervisor. 196 197 [[verification]] The specification of the light client verification protocol. 198 199 [[detection]] The specification of the light client attack detection mechanism. 200 201 [[tendermint-accountability]]: TLA+ specification to check the types of attacks 202 203 [tendermint-accountability]: 204 https://github.com/tendermint/spec/blob/master/rust-spec/tendermint-accountability/README.md 205 206 [supervisor]: 207 https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/supervisor/supervisor_001_draft.md 208 209 [verification]: https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/verification/verification_002_draft.md 210 211 [detection]: 212 https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/detection/detection_003_reviewed.md 213 214 [LC-DATA-EVIDENCE-link]: 215 https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/detection/detection_003_reviewed.md#lc-data-evidence1 216 217 [TMBC-LC-EVIDENCE-DATA-link]: 218 https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/detection/detection_003_reviewed.md#tmbc-lc-evidence-data1 219 220 [node-based-attack-characterization]: 221 https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/detection/detection_003_reviewed.md#node-based-characterization-of-attacks 222 223 [TMBC-FM-2THIRDS-link]: https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/verification/verification_002_draft.md#tmbc-fm-2thirds1 224 225 [LCV-FUNC-VALID.link]: https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/verification/verification_002_draft.md#lcv-func-valid2