初めに
こんにちは、新卒二年目のセキュリティエンジニアです。
普段は Qiita で主にHackTheBox の WriteUp などを投稿しています。
大学時代は非情報系の専攻だったこともあり、今まであまり暗号系の勉強はしてこなかったのですが、セキュリティを生業にしている以上は流石に知っておかねばという危機感を募らせています。
そこで今回は、 SSL/TLS の歴史と代表的な脆弱性についてまとめていこうと思います。
自分の学びメモの側面が強いですが、少しでも参考になれば幸いです。
SSL/TLS とは
そもそも、SSL(Secure Sockets Layer)/TLS(Transport Layer Security)とは、インターネットで通信を行う際に、データを暗号化して送受信するプロトコルのことを指します。
これにより、インターネット上でのデータの盗聴や改竄、なりすましなどを防いでいます。
代表的な利用例としては HTTPS (HTTP over SSL/TLS) があります。
これは、Web サーバとの通信を SSL/TLS を利用して暗号化したプロトコルであり、現在ほとんどの Web サイトで利用されています。
そんな重要なプロトコルである SSL/TLS ですが、古いバージョンには有名で深刻な脆弱性が既に発見されており、現在では TLS1.2 または TLS 1.3 の利用が推奨されています。
以下では SSL/TLS の歴史をさかのぼりながら、代表的な脆弱性について取り上げていきます。
SSL/TLSのバージョンと代表的な脆弱性
初めに、SSL/TLS の変遷について紹介します。
バージョン | 発表年 | 概要・特徴 | 現在の扱い |
---|---|---|---|
SSL 1.0 | 非公開 | セキュリティ問題により公開されず | 廃止(未公開) |
SSL 2.0 | 1994年 | 初の公開版。セキュリティ不備あり | 廃止 |
SSL 3.0 | 1995年 | 多くの改善が加えられたが、後にPOODLE脆弱性発見 | 廃止 |
TLS 1.0 | 1999年 | SSL 3.0の後継。標準化されたTLSの初版 | 廃止 |
TLS 1.1 | 2006年 | 初期化ベクトルの扱い改善など | 廃止 |
TLS 1.2 | 2008年 | 現在も広く使われる。高度な暗号方式が利用可能 | 一部で使用中 |
TLS 1.3 | 2018年 | 最新。高速・安全性向上。不要機能の削除 | 推奨 |
TLS 1.1 までには既に深刻な脆弱性が報告されており、公式には廃止(非推奨)となっています。
しかし、組み込み機器や医療・製造機器などのレガシーシステムや、システム更新に時間と費用が掛かる金融・公共機関のシステム、古いブラウザや OS との互換性を維持しているシステムなどでは依然として脆弱なプロトコルが利用されていることがあります。
SSL 3.0
SSL 3.0 は Netscope によって1995年に考案されたプロトコルであり、暗号化・改竄検出・相互認証などの機能を提供しています。
SSL 3.0 に存在する有名な脆弱性としては POODLE 攻撃が挙げられます。
POODLE (Padding Oracle On Downgraded Legacy Encryption) 攻撃
POODLE は SSL 3.0 の CBC モードの暗号を利用した通信から、秘密情報を復元する攻撃です。
CBC (と EBC)に関しては以下の記事で概要が掴めるかと思います。
CBC モードでは平文をブロック単位に分割し、対象の平文ブロックと直前の暗号ブロックとの排他的論理和を取りながら暗号ブロックを生成していきます。
その際、規定のブロック長に足りない箇所はパディングと呼ばれるもので埋めながら、決まった長さの暗号ブロックに整えていきます。このパディングは復号時に検証されるのですが、SSL 3.0 ではこのパディングの形式が曖昧です。
この仕様を利用し、暗号文の最後のブロックを改竄して送信して、返ってくる詳細なパディングエラーをオラクル(外部からのヒント)として平文を一文字ずつ特定する試行が POODLE 攻撃となります。
TLS 1.0
TLS 1.0 では、SSL 3.0 から安全性や拡張性が向上しました。主な特徴として、可変のハッシュアルゴリズムや HMAC の利用が挙げられます。
この TLS 1.0 にも CBC モードが存在し、以下で紹介する BEAST 攻撃の脆弱性が発見されています。
BEAST (Browser Exploit Against SSL/TLS) 攻撃
BEAST攻撃では CBC モードの初期化ベクトル IV が前の暗号ブロックの最後のブロックになっている仕様を悪用します。
IV をランダムにすることで同じ平文でも暗号ブロックが変化し、それが安全性の確保につながるわけですが、IV に前の暗号ブロックの最後を利用すると、攻撃者がある程度 IV を操作可能になってしまいます。
BEAST攻撃では、以下の手順で平文を復元していきます。
-
攻撃者はJavaScriptなどを使って、被害者のブラウザで任意のリクエストを何度も送信させる(XSS 等を利用する)。
-
各リクエストに少しずつ変更を加えて送り、CBCモードの構造を解析する。
-
暗号文と平文の関係から、セッションCookieや認証トークンなどを1バイトずつ推測する。
-
数百〜数千回の繰り返しで平文を完全に復元。
その他
その他有名な脆弱性についていくつか紹介します。
Heartbleed 攻撃
Heartbleed 攻撃とは、2014年4月に公開された、OpenSSLライブラリの致命的な脆弱性です。これにより、攻撃者はサーバやクライアントのメモリ内部情報(最大64KB)を読み取ることが可能となり、情報漏洩の危険があります。
脆弱性があったのは、クライアントとサーバの間で定期的にハートビートを送ることによって、接続中であることを確認する Hearbeat 拡張です。
この通信においてクライアントは、メッセージ(xバイト)
とその長さ(x)
をサーバに送信し、受け取ったサーバはそれと同じ長さのデータを返送します。
脆弱な Heartbeat 拡張では以下のような作りとなっていました。
// 擬似コード
payload = malloc(payload_length);
memcpy(payload, received_data, payload_length);
これによりクライアントは、実際に送るデータの長さとは異なる長さ情報をサーバに送ることができ、サーバはそれを信じて余計なデータをメモリから読みだして送信してしまいます。
この Heartbleed には Exploit があります。
また、この脆弱性を悪用する HackTheBox のマシンに「Valentain」がありますので、興味のある方はぜひトライしてみてください(盛大にネタバレしてしまってたらすみません)。
TLS 圧縮攻撃
TLS 圧縮攻撃とは、TLS 通信におけるデータ圧縮機能を悪用して機密情報を漏洩させる攻撃です。
-
攻撃者は、被害者のブラウザ上で任意のリクエストを繰り返し送信(JavaScriptなどで)
-
リクエストに機密情報に似た文字列を含めて送信
-
サーバはTLS圧縮をかけてレスポンスを返す
-
攻撃者はレスポンスのサイズの違いから、どの文字が一致しているかを推測
-
1バイトずつ推測し、最終的にCookieやセッショントークンを復元
SSLScanによる調査
上で SSL/TLS の脆弱性をいくつか紹介してきましたが、最後に HTTPS で利用されている SSL/TLS の調査ができる SSLScan
を紹介します。
これは kali
にデフォルトで入っているツールになります。
一例として、HackTheBox の Monitored のマシンに対して回してみます。
┌──(kali㉿kali)-[~]
└─$ sslscan 10.10.11.248
Version: 2.1.5
OpenSSL 3.5.1 1 Jul 2025
Connected to 10.10.11.248
Testing SSL server 10.10.11.248 on port 443 using SNI name 10.10.11.248
SSL/TLS Protocols:
SSLv2 disabled
SSLv3 disabled
TLSv1.0 enabled
TLSv1.1 enabled
TLSv1.2 enabled
TLSv1.3 disabled
TLS Fallback SCSV:
Server supports TLS Fallback SCSV
TLS renegotiation:
Secure session renegotiation supported
TLS Compression:
Compression disabled
Heartbleed:
TLSv1.2 not vulnerable to heartbleed
TLSv1.1 not vulnerable to heartbleed
TLSv1.0 not vulnerable to heartbleed
Supported Server Cipher(s):
Preferred TLSv1.2 256 bits ECDHE-RSA-AES256-GCM-SHA384 Curve 25519 DHE 253
Accepted TLSv1.2 256 bits DHE-RSA-AES256-GCM-SHA384 DHE 2048 bits
Accepted TLSv1.2 256 bits ECDHE-RSA-CHACHA20-POLY1305 Curve 25519 DHE 253
Accepted TLSv1.2 256 bits DHE-RSA-CHACHA20-POLY1305 DHE 2048 bits
Accepted TLSv1.2 256 bits DHE-RSA-AES256-CCM DHE 2048 bits
...
Accepted TLSv1.0 128 bits CAMELLIA128-SHA
Server Key Exchange Group(s):
TLSv1.2 128 bits secp256r1 (NIST P-256)
TLSv1.2 192 bits secp384r1 (NIST P-384)
TLSv1.2 260 bits secp521r1 (NIST P-521)
TLSv1.2 128 bits x25519
TLSv1.2 224 bits x448
SSL Certificate:
Signature Algorithm: sha256WithRSAEncryption
RSA Key Strength: 2048
Subject: nagios.monitored.htb
Issuer: nagios.monitored.htb
Not valid before: Nov 11 21:46:55 2023 GMT
Not valid after: Aug 25 21:46:55 2297 GMT
スキャン結果を分析してみます。
-
SSL/TLS Protocols
では、利用できるプロトコルのバージョンが表示されます。今回はTLS1.0
・TLS1.1
・TLS1.2
が利用可能となっており、ダウングレード攻撃を受けると脆弱なバージョン1.0、1.1での通信を強要される危険があります。 -
TLS Compression
は disable とあります。これにより TLS の圧縮は無効化されており、TLS 圧縮攻撃のリスクはないと判断できます。 -
Heartbleed
もnot vulnerable
になっており、Heartbleed 攻撃のリスクも低いと判断できます。 -
Subject
とIssuer
が一致しており、自己署名証明書を利用しているので信用の低い証明書を利用していることが分かります。ついでにこのマシンの仮想ホスト名も分かりました。
あとがき
今回は SSL/TLS についてまとめていきました。今後は暗号まわりの記事(PQC とか?)もどんどん書いていけたらよいなと考えています。