You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

222 lines
11 KiB

  1. <!-- markdown-link-check-disable -->
  2. # Lightclient Attackers Isolation
  3. > Warning: This is the beginning of an unfinished draft. Don't continue reading!
  4. 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.
  5. 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
  6. - validators deviated from the protocol, and
  7. - these validators represent more than 1/3 of the voting power in that block.
  8. 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
  9. - to proof that there has been attack [[TMBC-LC-EVIDENCE-DATA.1]][TMBC-LC-EVIDENCE-DATA-link] and
  10. - as basis to find the actual nodes that deviated from the Tendermint protocol.
  11. 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
  12. - the set does not contain a correct validator
  13. - the set contains validators that represent more than 1/3 of the voting power of a block that is still within the unbonding period
  14. # Outline
  15. **TODO** when preparing a version for broader review.
  16. # Part I - Basics
  17. 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), cf. [Light Client Verification][verification].
  18. # Part II - Definition of the Problem
  19. The specification of the [detection mechanism][detection] describes
  20. - what is a light client attack,
  21. - conditions under which the detector will detect a light client attack,
  22. - and the format of the output data, called evidence, in the case an attack is detected. The format is defined in
  23. [[LC-DATA-EVIDENCE.1]][LC-DATA-EVIDENCE-link] and looks as follows
  24. ```go
  25. type LightClientAttackEvidence struct {
  26. ConflictingBlock LightBlock
  27. CommonHeight int64
  28. }
  29. ```
  30. The isolator is a function that gets as input evidence `ev`
  31. 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.
  32. We assume that the full node is synchronized with the blockchain and has reached the height `ev.ConflictingBlock.Header.Height + 1`.
  33. #### **[FN-INV-Output.1]**
  34. When an output is generated it satisfies the following properties:
  35. - If
  36. - `bc[CommonHeight].bfttime` is within the unbonding period w.r.t. the time at the full node,
  37. - `ev.ConflictingBlock.Header != bc[ev.ConflictingBlock.Header.Height]`
  38. - Validators in `ev.ConflictingBlock.Commit` represent more than 1/3 of the voting power in `bc[ev.CommonHeight].NextValidators`
  39. - Then: A set of validators in `bc[CommonHeight].NextValidators` that
  40. - represent more than 1/3 of the voting power in `bc[ev.commonHeight].NextValidators`
  41. - signed Tendermint consensus messages for height `ev.ConflictingBlock.Header.Height` by violating the Tendermint consensus protocol.
  42. - Else: the empty set.
  43. # Part IV - Protocol
  44. 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 V](#part-v---Completeness), we discuss why the solution is complete based on result from analysis with automated tools.
  45. ## Isolation
  46. ### Outline
  47. > Describe solution (in English), decomposition into functions, where communication to other components happens.
  48. #### **[LCAI-FUNC-MAIN.1]**
  49. ```go
  50. func isolateMisbehavingProcesses(ev LightClientAttackEvidence, bc Blockchain) []ValidatorAddress {
  51. reference := bc[ev.conflictingBlock.Header.Height].Header
  52. ev_header := ev.conflictingBlock.Header
  53. ref_commit := bc[ev.conflictingBlock.Header.Height + 1].Header.LastCommit // + 1 !!
  54. ev_commit := ev.conflictingBlock.Commit
  55. if violatesTMValidity(reference, ev_header) {
  56. // lunatic light client attack
  57. signatories := Signers(ev.ConflictingBlock.Commit)
  58. bonded_vals := Addresses(bc[ev.CommonHeight].NextValidators)
  59. return intersection(signatories,bonded_vals)
  60. }
  61. // If this point is reached the validator sets in reference and ev_header are identical
  62. else if RoundOf(ref_commit) == RoundOf(ev_commit) {
  63. // equivocation light client attack
  64. return intersection(Signers(ref_commit), Signers(ev_commit))
  65. }
  66. else {
  67. // amnesia light client attack
  68. return IsolateAmnesiaAttacker(ev, bc)
  69. }
  70. }
  71. ```
  72. - Implementation comment
  73. - 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)`.)
  74. - 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.
  75. - Expected precondition
  76. - `length(bc) >= ev.conflictingBlock.Header.Height`
  77. - `ValidAndVerifiedUnbonding(bc[ev.CommonHeight], ev.ConflictingBlock) == SUCCESS`
  78. - `ev.ConflictingBlock.Header != bc[ev.ConflictingBlock.Header.Height]`
  79. - TODO: input light blocks pass basic validation
  80. - Expected postcondition
  81. - [[FN-INV-Output.1]](#FN-INV-Output1) holds
  82. - Error condition
  83. - returns an error if precondition is violated.
  84. ### Details of the Functions
  85. #### **[LCAI-FUNC-VVU.1]**
  86. ```go
  87. func ValidAndVerifiedUnbonding(trusted LightBlock, untrusted LightBlock) Result
  88. ```
  89. - Conditions are identical to [[LCV-FUNC-VALID.2]][LCV-FUNC-VALID.link] except the precondition "*trusted.Header.Time > now - trustingPeriod*" is substituted with
  90. - `trusted.Header.Time > now - UnbondingPeriod`
  91. #### **[LCAI-FUNC-NONVALID.1]**
  92. ```go
  93. func violatesTMValidity(ref Header, ev Header) boolean
  94. ```
  95. - Implementation remarks
  96. - checks whether the evidence header `ev` violates the validity property of Tendermint Consensus, by checking agains a reference header
  97. - Expected precondition
  98. - `ref.Height == ev.Height`
  99. - Expected postcondition
  100. - returns evaluation of the following disjunction
  101. **[[LCAI-NONVALID-OUTPUT.1]]** ==
  102. `ref.ValidatorsHash != ev.ValidatorsHash` or
  103. `ref.NextValidatorsHash != ev.NextValidatorsHash` or
  104. `ref.ConsensusHash != ev.ConsensusHash` or
  105. `ref.AppHash != ev.AppHash` or
  106. `ref.LastResultsHash != ev.LastResultsHash`
  107. ```go
  108. func IsolateAmnesiaAttacker(ev LightClientAttackEvidence, bc Blockchain) []ValidatorAddress
  109. ```
  110. - Implementation remarks
  111. **TODO:** What should we do here? Refer to the accountability doc?
  112. - Expected postcondition
  113. **TODO:** What should we do here? Refer to the accountability doc?
  114. ```go
  115. func RoundOf(commit Commit) []ValidatorAddress
  116. ```
  117. - Expected precondition
  118. - `commit` is well-formed. In particular all votes are from the same round `r`.
  119. - Expected postcondition
  120. - returns round `r` that is encoded in all the votes of the commit
  121. ```go
  122. func Signers(commit Commit) []ValidatorAddress
  123. ```
  124. - Expected postcondition
  125. - returns all validator addresses in `commit`
  126. ```go
  127. func Addresses(vals Validator[]) ValidatorAddress[]
  128. ```
  129. - Expected postcondition
  130. - returns all validator addresses in `vals`
  131. # Part V - Completeness
  132. 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.
  133. The main function `isolateMisbehavingProcesses` distinguishes three kinds of wrongly signing messages, namely,
  134. - lunatic: signing invalid blocks
  135. - equivocation: double-signing valid blocks in the same consensus round
  136. - amnesia: signing conflicting blocks in different consensus rounds, without having seen a quorum of messages that would have allowed to do so.
  137. The question is whether this captures all attacks.
  138. First observe that the first checking in `isolateMisbehavingProcesses` is `violatesTMValidity`. It takes care of lunatic attacks. If this check passes, that is, if `violatesTMValidity` returns `FALSE` this means that [FN-NONVALID-OUTPUT] 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 it is sufficient to consider two different valid consensus values, that is, binary consensus.
  139. **TODO** we have analyzed Tendermint consensus with TLA+ and have accompanied Galois in an independent study of the protocol based on [Ivy proofs](https://github.com/tendermint/spec/tree/master/ivy-proofs).
  140. # References
  141. [[supervisor]] The specification of the light client supervisor.
  142. [[verification]] The specification of the light client verification protocol
  143. [[detection]] The specification of the light client attack detection mechanism.
  144. [supervisor]:
  145. https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/supervisor/supervisor_001_draft.md
  146. [verification]: https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/verification/verification_002_draft.md
  147. [detection]:
  148. https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/detection/detection_003_reviewed.md
  149. [LC-DATA-EVIDENCE-link]:
  150. https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/detection/detection_003_reviewed.md#lc-data-evidence1
  151. [TMBC-LC-EVIDENCE-DATA-link]:
  152. https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/detection/detection_003_reviewed.md#tmbc-lc-evidence-data1
  153. [node-based-attack-characterization]:
  154. https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/detection/detection_003_reviewed.md#node-based-characterization-of-attacks
  155. [TMBC-FM-2THIRDS-link]: https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/verification/verification_002_draft.md#tmbc-fm-2thirds1
  156. [LCV-FUNC-VALID.link]: https://github.com/tendermint/spec/blob/master/rust-spec/lightclient/verification/verification_002_draft.md#lcv-func-valid2