📝

『プロフェッショナルSSL/TLS』読書会メモ(第1章)

2021/05/16に公開

次:第2章

『プロフェッショナルSSL/TLS』読書会

@kdnaktさんが主催してくだっている、社内の読書会/勉強会。
この記事は、その読書会での内容を簡単に箇条書きにした自分用のメモです。

@kdnaktさんが書かれている同読書会のスクラップ記事のほうが詳しくかつ分かりやすいので、そちらも読むことをお薦めします。

全てを1つの記事にすると長くなりすぎるので、章ごとに分けます。

読む本について

第1章 SSL/TLSと暗号技術

  • TCP/IPを支える下層レイヤプロトコル(BGPなど)について
  • 共通鍵暗号方式について
  • TLS1.0/1.1はdeprecatedになった
  • ブロック暗号化のデファクトスタンダードはAES
  • AESは仕様の名前、具体的なアルゴリズムはRijndaelなど
  • 128bitごとに暗号化する。足らなかったらパディングする
  • ハッシュ関数はSHA2やSHA3など。SHA1やMD5は非推奨。
  • ECBモードは単純にブロックを暗号化するが、暗号文に平文に従ったパターンができてしまう。
  • 実際に利用されたのがTLSに対するBEAST攻撃。
  • ランダムな初期化ベクタで最初のブロックと排他論理和を取り、その結果を次のブロックに、としてパターン化を防ぐのがCBCモード。
  • 公開鍵暗号:公開鍵と秘密鍵という2種類の鍵を使う(非対称暗号化方式)
  • 公開鍵で暗号化したものを秘密鍵で復号する
  • もしくは、秘密鍵で暗号化したものを公開鍵で複合する→デジタル署名
    • これはRSAの暗号化と復号両方ができる性質を利用している。
    • DSAやECDSAといった他の公開鍵暗号では、必ずしもこの方法でデジタル署名をしていない。
  • 乱数発生器:乱数は暗号化にとって重要。プログラムで実現されるのは疑似乱数。不規則性や予測されにくさを確保するためにランダムに動かされたマウスの位置等を取得することでなるべくエントロピーを増大させる必要がある。
    • JDBCドライバが内部的に乱数発生関数を使用していたために、「マウスが存在しないサーバで速度が著しく低下する」「マウスを動かすと高速化する」という嘘みたいな不具合が存在したことがある

暗号強度

  • 一般的にはビット安全性≒暗号を破るのに必要な操作数で測る
  • e.g. 128ビットの鍵であれば2^{128}の操作が必要
    • =1ビット増やせば2倍強力になる
  • 現状では128ビットあれば充分。長期間セキュリティを保ちたい場合や安全側に倒す必要がある場合は256ビットを使うといい。
  • セキュリティについて考えるときは、現在のセキュリティだけでなく、長期間のセキュリティも考慮すべし。
  • 攻撃者が掛けることができる時間も長くなるし、時間がたつにつれてコンピュータは高速・廉価になる。

MITM攻撃 (man-in-the-middle attack:中間者攻撃)

  • 通信の当事者である2者の間に悪意の第3者が介在する攻撃
  • トランスポート層に対する攻撃の大半を占める
  • 受動的ネットワーク攻撃と能動的ネットワーク攻撃に分けられる
    • 受動的~:第3者はただ通信内容を聞いているだけ
    • 能動的~:通信内容を操作したり、当事者間の会話に影響を与える
  • 攻撃を仕掛けるには?
  • 一番簡単な方法は、犠牲者が使用するネットワークに入り込み、攻撃者のノードを利用するよう仕向けること
    • e.g. 認証のないWi-Fiを利用する
  • 国家組織レベルであれば、
    • 通信会社と結託する(実際にあった事例としてアメリカ国家安全保障局とAT&Tの結託)
    • 通信機器の乗っ取り(実際にあった事例としてイギリス政府通信本部による光ファイバケーブル盗聴)など
  • それ以外であれば、ドメイン名解決やIPアドレス経路解決に対する制御が必要
    • ARPスプーフィング
      • ARP: ローカルネットワークにおける、IPアドレスとMACアドレスの紐づけのためのプロトコル。
      • 攻撃者は任意のIPアドレスが正規のMACアドレスに紐づけられるよりも先に応答することで、自分のMACアドレスに紐づけてしまう。
    • WPADハイジャック
      • ブラウザのWebプロキシ自動発見機能を利用して、そのプロキシを探しているクライアントが自分のプロキシを経由するようにする
      • 2007年にIEの脆弱性が見つかった
    • DNSハイジャック
      • ドメインを乗っ取ってしまう。
      • レジストラと共謀したりDNSの設定を変更したりする。
    • DNSキャッシュポイズニング
      • DNSサーバの脆弱性を利用し、DNSキャッシュに対して不正な情報を流し込む。
      • 具体的には、権威サーバに対するDNS問い合わせで、32ビットのIDベースでのリクエストに対してランダムで不正なレスポンスを送り込む。偶然該当するIDがあればドメイン名に対する偽のIPをキャッシュさせられる。
      • その他にもカミンスキー攻撃などが知られる。
      • 対策としてはソースポートのランダム化など。
    • BGP経路ハイジャック
      • ISP間の相互接続などで利用するルーティングプロトコルであるBGPで、不正な経路を広告することで攻撃者のノードを経由するようにさせる。
        • e.g. 2018年に中国政府がアメリカの通信を傍受する際に使用していた事例。
  • 受動的攻撃
    • トラフィックが暗号化されていない場合に最も有効
    • RFC7258: Pervasive Monitoring Is an Attack 「蔓延する監視は攻撃である」
    • 暗号化されているトラフィックであっても有効になりえる
      • e.g. 暗号が破れるようになるまで保存しておく
    • PFS:前方秘匿性 (perfect forward secrecy)
      • 長期的な鍵(TLSではサーバの秘密鍵)からセッションキーを生成して通信を行う場合に、長期的な鍵が流出してもセッションキーの安全性が保たれる性質のこと。
      • RSAをベースとしたTLSの鍵交換アルゴリズムではこのPFSを書いており、RSA鍵を手に入れれば以前の通信が復号可能。
      • 2014年にはHeartbleed脆弱性により、秘密鍵の流出が問題になった。

次:第2章

GitHubで編集を提案

Discussion