
TLS-Attacker v7.8.0
Javaベースのフレームワークで、TLSライブラリの体系的なファジングと解析を可能にします。任意のプロトコルメッセージの作成、変更、および脆弱性発見のためのTLSクライアント/サーバーのテストを可能にします。
TLS-Attacker
TLS-Attackerは、TLSライブラリを分析するためのJavaベースのフレームワークです。任意の順序で任意のプロトコルメッセージをTLSピアに送信し、提供されたインターフェースを使用してその変更を定義できます。これにより、開発者はカスタムTLSプロトコルフローを簡単に定義し、自身のTLSライブラリに対してテストすることができます。
注意: TLS-AttackerはTLS開発者やペネトレーションテスター向けの研究ツールです。GUIや成功/失敗を示す表示はありません。
コンパイルと実行
TLS-Attackerをコンパイルして使用するには、JavaとMavenがインストールされている必要があります。Ubuntuでは、以下のコマンドでMavenをインストールできます。
$ sudo apt-get install maven
TLS-Attackerは現在、実行にJava JDK 21が必要です。
適切なJavaバージョンがあれば、TLS-Attackerディレクトリからmavenコマンドを実行できます。
$ git clone https://github.com/tls-attacker/TLS-Attacker.git
$ cd TLS-Attacker
$ mvn clean install
または、急いでいる場合は、以下のようにテストをスキップできます。
$ mvn clean install -DskipTests=true
生成されたjarファイルは 'apps' フォルダに配置されます。
このプロジェクトを依存関係として使用する場合、自分でコンパイルする必要はなく、以下のようにpom.xmlに含めることができます。
<dependency>
<groupId>de.rub.nds.tls.attacker</groupId>
<artifactId>tls-attacker</artifactId>
<version>7.0.0</version>
<type>pom</type>
</dependency>
TLS-Attackerには、TLS-Attackerの機能に簡単にアクセスできるデモアプリケーションが付属しています。
以下のコマンドでTLS-Attackerをクライアントとして実行できます。
$ cd apps
$ java -jar TLS-Client.jar -connect [host:port]
またはサーバーとして:
$ java -jar TLS-Server.jar -port [port]
これらのサンプルアプリケーションはそれ自体非常に強力ですが、TLS-Attackerはプログラミングライブラリとして使用されたときにその真価を発揮します。
コード構造
TLS-Attackerはいくつかの(Maven)プロジェクトで構成されています:
- TLS-Client: クライアントのサンプルアプリケーション
- TLS-Core: プロトコルスタックおよびTLS-Attackerの中核
- TLS-Mitm: MitMワークフローのプロトタイプ
- TLS-Server: サーバーのサンプルアプリケーション
- TLS-Proxy: SSLSocketsにTLS-Attackerを使用
- TraceTool: TLS-Attackerワークフロートレースの検査と修正
- Transport: 下位層のトランスポートユーティリティ
- Utils: ユーティリティクラスのコレクション

これらのモジュールの詳細についてはWikiを参照してください。
機能
現在、以下の機能がサポートされています:
- SSL 3、TLSバージョン1.0(RFC-2246)、1.1(RFC-4346)、1.2(RFC-5246)、1.3(RFC-8446)
- SSL 2(部分サポート)
- (EC)DH(E)、RSA、PSK、SRP、GOST、ANON鍵交換アルゴリズム
- CBC、AEAD、ストリーム暗号(AES、CAMELLIA、DES、3DES、IDEA、RC2、ARIA、GOST_28147_CNT_IMIT、RC4、SEED、NULL)
- 約300の暗号スイート、約30の拡張
- クライアントとサーバー
- HTTPS
- 3者以上のワークフロー
- 多数の拡張
- Tokenbinding (EC) およびTokenbinding over HTTP
- ソケット
- TLS 1.3 0-RTT
- STARTTLS
- ...
使用法
ここでは、TLS-Attackerの使用に関する非常に簡単な例を示します。
まず、TLSサーバーを起動する必要があります(パブリックサーバーは使用しないでください)。まだ実行していない場合は、keygen.shスクリプトを実行してください。例えば、OpenSSLテストサーバーを使用できます:
$ cd TLS-Attacker/resources
$ openssl s_server -key rsa1024key.pem -cert rsa1024cert.pem
このコマンドはポート4433でTLSサーバーを起動します。
サーバーに接続するには、次のコマンドを使用できます:
$ cd TLS-Attacker/apps
$ java -jar TLS-Client.jar -connect localhost:4433
注:このハンドシェイクが失敗した場合、具体的な暗号スイートを指定していないことが原因である可能性があります。TLS-Attackerはサーバーが選択した暗号スイートを完全には尊重しません。
以下のパラメータを使用して、異なる暗号スイート、TLSバージョン、または別のポートに接続できます:
$ java -jar TLS-Client.jar -connect localhost:4433 -cipher TLS_RSA_WITH_AES_256_CBC_SHA -version TLS11
より経験豊富な開発者であれば、Javaコードを書いて独自のTLSメッセージフローを作成できます。例えば:
Config config = Config.createConfig();
WorkflowTrace trace = new WorkflowTrace();
trace.addTlsAction(new SendAction(new ClientHelloMessage()));
trace.addTlsAction(new ReceiveAction(new ServerHelloMessage()));
State state = new State(config, trace);
DefaultWorkflowExecutor executor = new DefaultWorkflowExecutor(state);
executor.executeWorkflow();
TLS-AttackerはWorkflowTraceの概念を使用して「TLSメッセージフロー」を定義します。WorkflowTraceは一連のアクションのリストで構成され、それらが順に実行されます。典型的な「TLSメッセージフロー」ではSendActionとReceiveActionのみが必要ですが、フレームワークはこれに留まらず、さらに任意のメッセージフローを実行するためのさまざまな他のアクションを実装しています。現在実装されているアクションのリストと説明はWikiにあります。
多くの方がJavaを嫌っていることは承知しています。そのため、XML構造を使用して、カスタマイズしたTLSプロトコルをXMLから実行することもできます:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workflowTrace>
<!-- Send ClientHello -->
<Send>
<configuredMessages>
<ClientHello>
<extensions>
<ECPointFormat/>
<EllipticCurves/>
<SignatureAndHashAlgorithmsExtension/>
<RenegotiationInfoExtension/>
</extensions>
</ClientHello>
</configuredMessages>
<configuredRecords>
<record/>
</configuredRecords>
</Send>
<!-- Receive server response -->
<Receive>
<expectedMessages>
<ServerHello>
<extensions>
<ECPointFormat/>
<RenegotiationInfoExtension/>
</extensions>
</ServerHello>
<Certificate/>
<ServerHelloDone/>
</expectedMessages>
</Receive>
<!-- Send client key exchange and finish -->
<Send>
<configuredMessages>
<RSAClientKeyExchange/>
<ChangeCipherSpec/>
<Finished/>
</configuredMessages>
<configuredRecords>
<record/>
<record/>
<record/>
</configuredRecords>
</Send>
<!-- Receive server finish -->
<Receive>
<expectedMessages>
<ChangeCipherSpec/>
<Finished/>
</expectedMessages>
</Receive>
</workflowTrace>
このXML構造がTLS-Attacker/apps/workflow.xmlに配置されている場合、以下のコマンドを実行するだけです:
$ java -jar TLS-Client.jar -connect [host]:[port] -workflow_input workflow.xml
Protocol-Attacker/レイヤーシステム
もともとはTLSプロトコルを攻撃するために設計されましたが、TLS-Attackerは任意のプロトコルをサポートできます。そのために、TLS-Attackerは各接続にレイヤースタックを割り当てます。このレイヤースタックは、ユーザーが利用したいさまざまなプロトコルレイヤーで構成されます。レイヤースタックを使用すると、ユーザーはDTLSやHTTP(他は作業中)などのレイヤーを任意の順序で追加できます。
レイヤースタックを使用して任意のメッセージを送受信するために、ユーザーは各レイヤーの設定を定義できます。これらの設定は、送信または受信するメッセージを指定します。これにより、ユーザーは各レイヤーに固有のメッセージ/データコンテナを指定することもできます。例えば、TLS-Attackerが送信するTLSメッセージとレコードを指定できます。TLS-Attackerは指定されたTLSメッセージを自動的にレコードにカプセル化します。
変更可能変数
TLS-Attackerは変更可能変数(Modifiable Variables)の概念を使用して、事前定義されたワークフローに対する実行時の変更を可能にします。変更可能変数を使用すると、値が実際に設定された後または前に、基本型への変更を設定できます。実際の値が決定され、ゲッターを介して値にアクセスしようとすると、元の値がそれに応じて変更された形式で返されます。この概念の詳細は https://github.com/tls-attacker/ModifiableVariable にあります。
ModifiableInteger i = new ModifiableInteger();
i.setOriginalValue(30);
i.setModification(new AddModification(20));
System.out.println(i.getValue()); // 50
この例では、新しいModifiableIntegerを定義し、その値を30に設定しました。次に、2つの整数の合計を返すAddModificationという新しい変更を定義し、その値を20に設定しました。上記のプログラムを実行すると、結果として50が出力されます。
もちろん、この概念をTLSワークフローを構築して使用することもできます。サーバーにHeartbleed脆弱性がないかテストしたいとします。そのためには、Heartbeatリクエストのペイロード長を増やす必要があります。TLS-Attackerでは、次のように行うことができます: