github.com/aakash4dev/cometbft@v0.38.2/spec/light-client/attacks/isolate-attackers_002_reviewed.md (about)

     1  <!-- markdown-link-check-disable -->
     2  # Lightclient Attackers Isolation
     3  
     4  Adversarial nodes may have the incentive to lie to a lightclient about the
     5  state of a Cosmos blockchain, built using Tendermint consensus algorithm.
     6  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.
     7  
     8  As Tendermint consensus and light client verification is safe under the assumption of more than 2/3 of correct voting power per block [[CMBC-FM-2THIRDS]][CMBC-FM-2THIRDS-link], this implies that if there was an attack then [[CMBC-FM-2THIRDS]][CMBC-FM-2THIRDS-link] was violated, that is, there is a block such that
     9  
    10  - validators deviated from the protocol, and
    11  - these validators represent more than 1/3 of the voting power in that block.
    12  
    13  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
    14  
    15  - to proof that there has been attack [[CMBC-LC-EVIDENCE-DATA.1]][CMBC-LC-EVIDENCE-DATA-link] and
    16  - as basis to find the actual nodes that deviated from the Tendermint algorithm.
    17  
    18  This specification considers how a full node in a Cosmos blockchain can isolate a set of attackers that launched the attack. The set should satisfy
    19  
    20  - the set does not contain a correct validator
    21  - the set contains validators that represent more than 1/3 of the voting power of a block that is still within the unbonding period
    22  
    23  # Outline
    24  
    25  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 algorithm.
    26  
    27  # Part I - Basics and Definition of the Problem
    28  
    29  For definitions of data structures used here, in particular LightBlocks [[LCV-DATA-LIGHTBLOCK.1]](https://github.com/aakash4dev/cometbft/blob/main/spec/light-client/verification/verification_002_draft.md#lcv-data-lightblock1), we refer to the specification of [Light Client Verification][verification].
    30  
    31  The specification of the [detection mechanism][detection] describes
    32  
    33  - what is a light client attack,
    34  - conditions under which the detector will detect a light client attack,
    35  - and the format of the output data, called evidence, in the case an attack is detected. The format is defined in
    36  [[LC-DATA-EVIDENCE.1]][LC-DATA-EVIDENCE-link] and looks as follows
    37  
    38  ```go
    39  type LightClientAttackEvidence struct {
    40      ConflictingBlock   LightBlock
    41      CommonHeight       int64
    42  }
    43  ```
    44  
    45  The isolator is a function that gets as input evidence `ev`
    46  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.
    47  
    48  We assume that the full node is synchronized with the blockchain and has reached the height `ev.ConflictingBlock.Header.Height + 1`.
    49  
    50  #### **[LCAI-INV-Output.1]**
    51  
    52  When an output is generated it satisfies the following properties:
    53  
    54  - If
    55      - `bc[CommonHeight].bfttime` is within the unbonding period w.r.t. the time at the full node,
    56      - `ev.ConflictingBlock.Header != bc[ev.ConflictingBlock.Header.Height]`
    57      - Validators in `ev.ConflictingBlock.Commit` represent more than 1/3 of the voting power in `bc[ev.CommonHeight].NextValidators`
    58  - Then: The output is a set of validators in `bc[CommonHeight].NextValidators` that
    59      - represent more than 1/3 of the voting power in `bc[ev.commonHeight].NextValidators`
    60      - signed Tendermint consensus messages for height `ev.ConflictingBlock.Header.Height` by violating the Tendermint consensus algorithm.
    61  - Else: the empty set.
    62  
    63  # Part II - Protocol
    64  
    65  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.
    66  
    67  ## Isolation
    68  
    69  ### Outline
    70  
    71  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 <!-- markdown-link-check-disable-next-line -->[accountability protocol](https://docs.google.com/document/d/11ZhMsCj3y7zIZz4udO9l25xqb0kl7gmWqNpGVRzOeyY/edit).
    72  
    73  #### **[LCAI-FUNC-MAIN.1]**
    74  
    75  ```go
    76  func isolateMisbehavingProcesses(ev LightClientAttackEvidence, bc Blockchain) []ValidatorAddress {
    77  
    78      reference := bc[ev.conflictingBlock.Header.Height].Header
    79      ev_header := ev.conflictingBlock.Header
    80  
    81      ref_commit := bc[ev.conflictingBlock.Header.Height + 1].Header.LastCommit // + 1 !!
    82      ev_commit := ev.conflictingBlock.Commit
    83  
    84      if violatesTMValidity(reference, ev_header) {
    85          // lunatic light client attack
    86          signatories := Signers(ev.ConflictingBlock.Commit)
    87          bonded_vals := Addresses(bc[ev.CommonHeight].NextValidators)
    88          return intersection(signatories,bonded_vals)
    89  
    90      }
    91      // If this point is reached the validator sets in reference and ev_header are identical
    92      else if RoundOf(ref_commit) == RoundOf(ev_commit) {
    93          // equivocation light client attack
    94          return intersection(Signers(ref_commit), Signers(ev_commit))
    95      }
    96      else {
    97          // amnesia light client attack
    98          return IsolateAmnesiaAttacker(ev, bc)
    99      }
   100  }
   101  ```
   102  
   103  - Implementation comment
   104      - 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)`.)
   105      - 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.
   106  - Expected precondition
   107      - `length(bc) >= ev.conflictingBlock.Header.Height`
   108      - `ValidAndVerifiedUnbonding(bc[ev.CommonHeight], ev.ConflictingBlock) == SUCCESS`
   109      - `ev.ConflictingBlock.Header != bc[ev.ConflictingBlock.Header.Height]`
   110      - `ev.conflictingBlock` satisfies basic validation (in particular all signed messages in the Commit are from the same round)
   111  - Expected postcondition
   112      - [[FN-INV-Output.1]](#FN-INV-Output1) holds
   113  - Error condition
   114      - returns an error if precondition is violated.
   115  
   116  ### Details of the Functions
   117  
   118  #### **[LCAI-FUNC-VVU.1]**
   119  
   120  ```go
   121  func ValidAndVerifiedUnbonding(trusted LightBlock, untrusted LightBlock) Result
   122  ```
   123  
   124  - Conditions are identical to [[LCV-FUNC-VALID.2]][LCV-FUNC-VALID.link] except the precondition "*trusted.Header.Time > now - trustingPeriod*" is substituted with
   125      - `trusted.Header.Time > now - UnbondingPeriod`
   126  
   127  #### **[LCAI-FUNC-NONVALID.1]**
   128  
   129  ```go
   130  func violatesTMValidity(ref Header, ev Header) boolean
   131  ```
   132  
   133  - Implementation remarks
   134      - checks whether the evidence header `ev` violates the validity property of Tendermint consensus algorithm, by checking against a reference header
   135  - Expected precondition
   136      - `ref.Height == ev.Height`
   137  - Expected postcondition
   138      - returns evaluation of the following disjunction  
   139      **[LCAI-NONVALID-OUTPUT.1]** ==  
   140      `ref.ValidatorsHash != ev.ValidatorsHash` or  
   141      `ref.NextValidatorsHash != ev.NextValidatorsHash` or  
   142      `ref.ConsensusHash != ev.ConsensusHash` or  
   143      `ref.AppHash != ev.AppHash` or  
   144      `ref.LastResultsHash != ev.LastResultsHash`
   145  
   146  ```go
   147  func IsolateAmnesiaAttacker(ev LightClientAttackEvidence, bc Blockchain) []ValidatorAddress
   148  ```
   149  
   150  - Implementation remarks <!-- markdown-link-check-disable-next-line -->
   151      - This triggers the [query/response protocol](https://docs.google.com/document/d/11ZhMsCj3y7zIZz4udO9l25xqb0kl7gmWqNpGVRzOeyY/edit).
   152  - Expected postcondition
   153      - returns attackers according to [LCAI-INV-Output.1].
   154  
   155  ```go
   156  func RoundOf(commit Commit) []ValidatorAddress
   157  ```
   158  
   159  - Expected precondition
   160      - `commit` is well-formed. In particular all votes are from the same round `r`.
   161  - Expected postcondition
   162      - returns round `r` that is encoded in all the votes of the commit
   163  - Error condition
   164      - reports error if precondition is violated
   165  
   166  ```go
   167  func Signers(commit Commit) []ValidatorAddress
   168  ```
   169  
   170  - Expected postcondition
   171      - returns all validator addresses in `commit`
   172  
   173  ```go
   174  func Addresses(vals Validator[]) ValidatorAddress[]
   175  ```
   176  
   177  - Expected postcondition
   178      - returns all validator addresses in `vals`
   179  
   180  # Part III - Completeness
   181  
   182  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.
   183  The main function `isolateMisbehavingProcesses` distinguishes three kinds of wrongly signed messages, namely,
   184  
   185  - lunatic: signing invalid blocks
   186  - equivocation: double-signing valid blocks in the same consensus round
   187  - amnesia: signing conflicting blocks in different consensus rounds, without having seen a quorum of messages that would have allowed to do so.
   188  
   189  The question is whether this captures all attacks.
   190  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.
   191  
   192  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/aakash4dev/cometbft/tree/main/spec/ivy-proofs) led to the same conclusion.
   193  
   194  # References
   195  
   196  [[supervisor]] The specification of the light client supervisor.
   197  
   198  [[verification]] The specification of the light client verification protocol.
   199  
   200  [[detection]] The specification of the light client attack detection mechanism.
   201  
   202  
   203  [tendermint-accountability]:
   204  https://github.com/aakash4dev/cometbft/tree/main/spec/light-client/accountability
   205  
   206  [supervisor]:
   207  https://github.com/aakash4dev/cometbft/blob/main/spec/light-client/supervisor/supervisor_001_draft.md
   208  
   209  [verification]: https://github.com/aakash4dev/cometbft/blob/main/spec/light-client/verification/verification_002_draft.md
   210  
   211  [detection]:
   212  https://github.com/aakash4dev/cometbft/blob/main/spec/light-client/detection/detection_003_reviewed.md
   213  
   214  [LC-DATA-EVIDENCE-link]:
   215  https://github.com/aakash4dev/cometbft/blob/main/spec/light-client/detection/detection_003_reviewed.md#lc-data-evidence1
   216  
   217  [CMBC-LC-EVIDENCE-DATA-link]:
   218  https://github.com/aakash4dev/cometbft/blob/main/spec/light-client/detection/detection_003_reviewed.md#cmbc-lc-evidence-data1
   219  
   220  [node-based-attack-characterization]:
   221  https://github.com/aakash4dev/cometbft/blob/main/spec/light-client/detection/detection_003_reviewed.md#block-based-characterization-of-attacks
   222  
   223  [CMBC-FM-2THIRDS-link]: https://github.com/aakash4dev/cometbft/blob/main/spec/light-client/verification/verification_002_draft.md#cmbc-fm-2thirds1
   224  
   225  [LCV-FUNC-VALID.link]: https://github.com/aakash4dev/cometbft/blob/main/spec/light-client/verification/verification_002_draft.md#lcv-func-valid2