24 KiB
ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝するまたはHackTricksをPDFでダウンロードする場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksスワッグを入手する
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つける
- 💬 Discordグループに参加するか、Telegramグループに参加するか、Twitterでフォローする🐦 @hacktricks_live。
- ハッキングトリックを共有するためにPRを提出して HackTricks と HackTricks Cloud のGitHubリポジトリに。
基本用語
- スマートコントラクト: スマートコントラクトは、特定の条件が満たされたときに実行されるブロックチェーン上のプログラムです。通常、合意の実行を自動化するために使用され、すべての参加者が中間業者の関与や時間の損失なしに即座に結果を確認できます(ここから)。
- 基本的に、スマートコントラクトは、人々が契約にアクセスして受け入れるときに実行されるコードです。スマートコントラクトはブロックチェーンで実行され(その結果は不変に保存され)、人々がそれを受け入れる前に読むことができます。
- dApps: 分散型アプリケーションは、スマートコントラクトの上に実装されます。通常、ユーザーがアプリとやり取りできるフロントエンドがあり、バックエンドは公開されています(したがって監査可能)し、スマートコントラクトとして実装されています。場合によっては、データベースの使用が必要ですが、Ethereumブロックチェーンは各アカウントに一定のストレージを割り当てます。
- トークン&コイン: コインはデジタル通貨として機能し、トークンは何らかの価値を表すものですが、コインではありません。
- ユーティリティトークン: これらのトークンは、ユーザーが後で特定のサービスにアクセスできるようにします(特定の環境で価値を持つものです)。
- セキュリティトークン: これらは所有権またはある資産を表します。
- DeFi: 分散型ファイナンス。
- DEX: 分散型取引所プラットフォーム。
- DAOs: 分散型自治組織。
コンセンサスメカニズム
ブロックチェーントランザクションが認識されるためには、それがブロックチェーンに追加される必要があります。検証者(マイナー)がこれを行います。ほとんどのプロトコルでは、これを行うと報酬を受け取ります。ブロックチェーンが安全であるためには、悪意のあるユーザーやグループが検証の大部分を占有するのを防ぐメカニズムが必要です。
Proof of workは、よく使われるコンセンサスメカニズムで、トランザクションを検証するために計算能力の検証を使用し、潜在的な攻撃者が検証者ネットワークの計算能力の大部分を取得する必要があります。
Proof Of Work(PoW)
これは、トランザクションを検証するために計算能力の検証を使用し、潜在的な攻撃者が検証者ネットワークの計算能力の大部分を取得する必要があるメカニズムです。
マイナーはいくつかのトランザクションを選択し、その後Proof Of Workの計算を開始します。最も多くの計算リソースを持つマイナーがProof of Workを早く完了し、すべてのトランザクションの手数料を受け取る可能性が高くなります。
Proof Of Stake(PoS)
PoSは、検証者が一定量のブロックチェーントークンを持っていることを要求することで、潜在的な攻撃者が攻撃を行うためにはブロックチェーン上のトークンの大部分を取得する必要があるようにします。
この種のコンセンサスでは、マイナーが持っているトークンが多いほど、そのマイナーが次のブロックを作成する可能性が高くなります。
PoWと比較して、これによりマイナーが消費するエネルギーが大幅に削減されます。
Bitcoin
トランザクション
単純なトランザクションは、アドレスから別のアドレスへの資金移動です。
Bitcoinのアドレスは公開鍵のハッシュであり、したがって、アドレスからトランザクションを行うためには、その公開鍵(アドレス)に関連付けられた秘密鍵を知っている必要があります。
その後、トランザクションが実行されると、そのトランザクションはアドレスの秘密鍵で署名され、トランザクションが正当であることを示します。
Bitcoinでデジタル署名を生成する最初の部分は、次のように数学的に表現できます:
Sig = Fsig(Fhash(m),dA)
ここで:
- _d_Aは署名秘密鍵です
- _m_はトランザクションです
- Fhashはハッシュ関数
- Fsigは署名アルゴリズム
- Sigは生成された署名
署名関数(Fsig)は、RとSの2つの値からなる署名(Sig)を生成します。
RとSが計算されたら、それらはDER(Distinguished Encoding Rules)として知られる国際標準エンコーディングスキームを使用してエンコードされたバイトストリームに直列化されます。署名が有効であることを検証するには、署名検証アルゴリズムが使用されます。デジタル署名の検証には、次のものが必要です:
- 署名(RとS)
- トランザクションハッシュ
- 署名を作成するために使用された秘密鍵に対応する公開鍵
署名の検証は、トランザクションの所有者であるのは秘密鍵の所有者だけであり、トランザクションに対して署名を生成できるのはその秘密鍵の所有者だけであることを効果的に意味します。署名検証アルゴリズムは、署名が実際に有効である場合に「TRUE」を返します。
マルチシグネチャトランザクション
マルチシグネチャアドレスは、複数のECDSA秘密鍵に関連付けられたアドレスです。最も単純なタイプはm-of-nアドレスで、n個の秘密鍵に関連付けられており、このアドレスからビットコインを送信するには、少なくともm個の鍵からの署名が必要です。マルチシグネチャトランザクションは、マルチシグネチャアドレスから資金を送信するトランザクションです。
トランザクションフィールド
各ビットコイントランザクションにはいくつかのフィールドがあります:
- Inputs: ビットコインが送信元の金額とアドレス
- Outputs: 各出力に転送されるアドレスと金額
- Fee: トランザクションのマイナーに支払われる金額
- Script_sig: トランザクションのスクリプト署名
- Script_type: トランザクションのタイプ
2つの主要なタイプのトランザクションがあります:
- P2PKH: "公開鍵ハッシュへ支払う": これがトランザクションが行われる方法です。送信者に、有効な署名(秘密鍵から)と公開鍵を提供することを要求します。トランザクションの出力スクリプトは、署名と公開鍵を使用し、いくつかの暗号関数を介して公開鍵ハッシュと一致するかを確認し、一致する場合は資金が使えるようになります。この方法は、追加のセキュリティのために公開鍵をハッシュ形式で隠します。
- P2SH: "スクリプトハッシュへ支払う": トランザクションの出力は、単にスクリプト(つまり、このお金を送りたい人がスクリプトを送信する)であり、特定のパラメータで実行されると
true
またはfalse
のブール値が結果として得られます。マイナーが提供されたパラメータで出力スクリプトを実行し、true
になると、お金は希望の出力に送信されます。P2SH
はマルチシグネチャウォレットに使用され、トランザクションを受け入れる前に複数の署名をチェックするロジックを出力スクリプトに作成します。P2SH
は、誰でも、または誰もが資金を使えるようにするためにも使用できます。 P2SHトランザクションの出力スクリプトが単にtrue
の場合、パラメータを提供せずに出力を使おうとすると、結果が1
になり、誰でもが使えるようになります。これは、0
を返すスクリプトにも適用され、出力が誰にも使えないようになります。
Lightning Network
このプロトコルは、チャネルに複数のトランザクションを実行し、最終状態をブロックチェーンに保存するだけで送信します。
これにより、Bitcoinブロックチェーンのスピードが向上し(1秒あたり7回の支払いしか許可されない)、Bitcoinブロックチェーンのノードを介してチャネルが作成されるため、追跡が難しいトランザクションを作成できます:
Lightning Networkの通常の使用方法は、関連するベースブロックチェーン(レイヤー1)に資金トランザクションをコミットすることによって支払いチャネルを開設し、その後、ブロックチェーンにブロードキャストせずにチャネルの資金の仮分配を更新する任意の数のLightning Network トランザクションを行い、最終的な決済トランザクションの最終バージョンをブロードキャストしてチャネルの資金を分配することによって支払いチャネルを閉じることです。
チャネルの両方のメンバーは、いつでも停止してチャネルの最終状態をブロックチェーンに送信できます。
Bitcoinプライバシー攻撃
共通の入力
理論的には、1つのトランザクションの入力は異なるユーザーに属する可能性がありますが、実際には追加の手順が必要です。したがって、非常に頻繁に同じトランザクション内の2つの入力アドレスは同じ所有者に属すると仮定されることがあります。
UTXOのおつりア
2 btc --> 4 btc
3 btc 1 btc
仮定されるのは、出力の1つがおつりであり、もう1つの出力が支払いであるとします。2つの解釈があります: 支払い出力は4 BTC出力または1 BTC出力のいずれかです。しかし、1 BTC出力が支払い金額である場合、3 BTC入力は不要です。なぜなら、ウォレットは2 BTC入力のみを使って支払いを行い、より低いマイナー手数料を支払うことができたからです。これは、実際の支払い出力が4 BTCであり、1 BTCがおつり出力であることを示しています。
これは、複数の入力を持つトランザクションに対する問題です。このリークを修正する方法の1つは、おつり出力がどの入力よりも高い値になるように、より多くの入力を追加することです。例えば:
2 btc --> 4 btc
3 btc 6 btc
5 btc
強制アドレス再利用
強制アドレス再利用またはインセンティブ付きアドレス再利用は、敵対者がビットコインの少額を支払って、すでにブロックチェーンで使用されたアドレスに支払うことです。敵対者は、ユーザーまたは彼らのウォレットソフトウェアがこれらの支払いを大きな取引の入力として使用し、共通の入力所有ヒューリスティックを介して他のアドレスを明らかにすることを期待しています。これらの支払いは、アドレス所有者を意図しないアドレス再利用に強制する手段として理解できます。
この攻撃は、時々ダスト攻撃と誤って呼ばれます。
ウォレットの正しい振る舞いは、すでに使用された空のアドレスに着地したコインを使わないことです。
その他のブロックチェーン分析
- 正確な支払額: おつりのない取引を避けるためには、支払いはUTXOと等しくなければなりません(これは非常に予期しないことです)。したがって、おつりのないアドレス間の取引はおそらく同じユーザーの2つのアドレス間の転送である可能性が高いです。
- 丸められた数値: 取引で、出力の1つが「丸められた数値」である場合、これはおそらくその「丸められた数値」の価格を設定した人への支払いであるため、もう一方は残りの部分である可能性が高いです。
- ウォレットのフィンガープリント: 慎重な分析者は、異なるウォレットソフトウェアが常にまったく同じ方法で取引を作成しないため、特定の取引を作成したソフトウェアを推測することがあります。ウォレットのフィンガープリントは、おつりの出力を検出するために使用できます。おつりの出力は、同じウォレットのフィンガープリントで使われるものです。
- 金額とタイミングの相関: 取引を行った人が取引の時間や金額を開示すると、それは簡単に発見される可能性があります。
トラフィック分析
いくつかの組織があなたのトラフィックをスニッフィングしていると、ビットコインネットワークで通信しているのを見ることができます。
敵対者が、以前に入力されていなかったトランザクションやブロックがあなたのノードから出てくるのを見ると、そのトランザクションがあなたによって行われたか、ブロックがあなたによって採掘されたことをほぼ確実に知ることができます。インターネット接続が関係しているため、敵対者はIPアドレスを発見したビットコイン情報と関連付けることができます。
インターネットトラフィックをすべてスニッフィングすることができない攻撃者でも、多くのビットコインノードを持っていることでソースに近づくことができ、トランザクションやブロックを発表しているIPアドレスを知ることができるかもしれません。
また、一部のウォレットは、未確認のトランザクションを定期的に再放送するため、ネットワーク全体に広まりやすくなり、採掘されやすくなります。
アドレス所有者の情報を見つけるためのその他の攻撃
より多くの攻撃については、https://en.bitcoin.it/wiki/Privacyを参照してください。
匿名ビットコイン
匿名でビットコインを入手する
- 現金取引: 現金を使ってビットコインを購入します。
- 現金代替: ギフトカードなどを購入し、オンラインでビットコインと交換します。
- マイニング: マイニングはビットコインを入手する最も匿名性の高い方法です。これは、マイニングプールが一般的にハッシャーのIPアドレスを知っているため、ソロマイニングにも当てはまります。
- 窃盗: 理論的には、匿名ビットコインを入手する別の方法は窃盗することです。
ミキサー
ユーザーはビットコインをミキシングサービスに送信し、サービスは異なるビットコインをユーザーに返送します(手数料を差し引いた状態)。理論的には、ブロックチェーンを観察している敵対者は、着信と送信のトランザクションをリンクすることができません。
ただし、ユーザーはミキシングサービスがビットコインを返送し、また受け取ったお金と送金の関係についてのログを保存していないことを信頼する必要があります。
Bitcoinカジノなど、他のサービスもミキサーとして使用できます。
CoinJoin
CoinJoinは、異なるユーザーの複数の取引を1つに混合して、外部の観察者がどの入力がどの出力に関連しているかを見つけにくくするためのものです。
これは新しいプライバシーレベルを提供しますが、一部の取引では、一部の入力と出力の金額が相関しているか、他の入力と出力と非常に異なる場合は、外部の観察者によって依然として相関付けられる可能性があります。
ビットコインのブロックチェーン上で(おそらく)CoinJoinトランザクションIDの例は、402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a
と85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238
です。
https://coinjoin.io/en
CoinJoinに類似したもので、イーサリアム向けには Tornado Cash (お金はマイナーから提供されるため、ウォレットに表示されるだけです)。
PayJoin
前のセクションで議論されたCoinJoinのタイプは、同じ値を持つ複数の出力をチェックすることで簡単に特定できます。
PayJoin(または支払先エンドポイントまたはP2EPとも呼ばれる)は、2つの当事者間で行われる特別なCoinJoinであり、一方の当事者が他方に支払います。そのトランザクションには、同じ値を持つ複数の出力がないため、平等な出力のCoinJoinとして明らかに見えません。このトランザクションを考慮してください。
2 btc --> 3 btc
5 btc 4 btc
Bitcoinプライバシーの良い実践方法
ウォレットの同期
Bitcoinウォレットは、自分の残高や履歴に関する情報をどこかから取得する必要があります。2018年末時点で、最も実用的でプライバシーが保護された既存の解決策は、フルノードウォレット(最大限にプライベート)とクライアントサイドブロックフィルタリング(非常に優れている)を使用することです。
- フルノード: フルノードは、ビットコインでこれまでに行われたすべてのオンチェーントランザクションを含むブロックチェーン全体をダウンロードします。したがって、ユーザーのインターネット接続を監視している敵対者は、ユーザーが関心を持っているトランザクションやアドレスを知ることができません。
- クライアントサイドブロックフィルタリング: クライアントサイドブロックフィルタリングは、ブロック内のすべてのトランザクションのアドレスを含むフィルターを作成することで機能します。フィルターは、要素がセット内にあるかどうかをテストできます。誤検知は可能ですが、誤検出はありません。軽量ウォレットは、ブロックチェーン内のすべてのブロックのフィルターをダウンロードし、自分自身のアドレスと一致するかどうかを確認します。一致するブロックはピアツーピアネットワークから完全にダウンロードされ、これらのブロックはウォレットの履歴と現在の残高を取得するために使用されます。
Tor
Bitcoinネットワークはピアツーピアネットワークを使用しているため、他のピアはあなたのIPアドレスを知ることができます。これが、ビットコインネットワークとやり取りする際に毎回Torを介して接続することをお勧めする理由です。
アドレス再利用の回避
アドレスを複数回使用することは、プライバシーに非常に損害を与えます。なぜなら、それにより同じエンティティによって作成されたことの証拠とともに、より多くのブロックチェーントランザクションがリンクされるからです。Bitcoinを最もプライベートで安全に使用する方法は、支払いを行うたびに支払いを行う相手に新しいアドレスを送信することです。受け取ったコインを使った後は、そのアドレスを二度と使用しないでください。また、Bitcoinを送信する際には新しいBitcoinアドレスを要求するべきです。すべての優れたBitcoinウォレットには、アドレス再利用を des discourages するユーザーインターフェースがあります。
複数のトランザクション
1つのチェーン上のトランザクションを複数回行うことは、金額に基づくプライバシー攻撃(金額の相関や丸められた数値など)の影響を大幅に軽減することができます。たとえば、ユーザーが誰かに5 BTCを支払いたいが、5 BTCの価値が簡単に検索されたくない場合、2 BTCと3 BTCの2つのトランザクションを送信して、合計5 BTCにすることができます。
おつりの回避
おつりの回避とは、トランザクションのインプットとアウトプットが慎重に選択され、全くおつりが必要ないようにすることです。おつりのアウトプットがないことは、プライバシーにとって優れています。これはおつりの検出ヒューリスティックを破るためです。
複数のおつりのアウトプット
おつりの回避が選択肢でない場合、1つ以上のおつりのアウトプットを作成することでプライバシーを向上させることができます。これは通常のより多くのブロックスペースを使用するため、おつりの回避が望ましいです。