jwt_tool

当ページでは、「jwt_tool」というJson Web Token(JWT)の検証ツールの使い方について詳しく解説しています。
JWTを使ったシステムを運用している方は、セキュリティ上問題がないかを検証するために当ページの情報をお役立てください。
 
 

jwt_toolとは

jwt_toolとは、Json Web Token(JWT)を検証するためのPython製のツール。
JWTのPayload部(データ部)の内容を確認したり署名鍵をブルートフォースで探したり、既知の脆弱性が存在するか確認したりすることができる。
https://github.com/ticarpi/jwt_tool」よりソースコードを取得できる。
 
JWTの概要・構成などの詳細についてはこちらの記事で解説!
 

セットアップ手順

ツールのコマンドを実行できるようになるまでの手順は以下の通り。
 

セキュリティ検査項目

以降では、jwt_toolを利用してJWTに関連するセキュリティテストを実施する方法を解説する。

コマンド実行前の設定(任意)

以降の説明にあるコマンドでは、JWTを環境変数に代入して利用している。

Linux, macOSの場合

環境変数「$jwt」にJWTデータを代入した状態で実行している。
 

Windowsの場合

WindowsのPowershellを利用している場合は以下のように環境変数を登録し、以降のコマンドに記載の「$jwt」は「$env:jwt」に書き換える事で実行可能。
 

JWTに含まれるデータを確認する

JWTの各要素をデコードして表示するコマンド。
 
実行結果は以下の通り。
 

既知の脆弱性の有無を検証

オプションで既知の脆弱性の有無を検証できる。
詳しいセキュリティ検査方法や脆弱性の詳細は以降の各項目で説明。
設定値概要CVE番号
--exploit a alg:noneCVE-2015-9235
--exploit nnull signature attackCVE-2020-28042
--exploit bblank password accepted in signature
--exploit sJWKS Spoofing
--exploit k RS256 to HS256 Key Confusion Attack CVE-2016-5431
--exploit iinject inline JWKSCVE-2018-0114
 

「alg:none」に変更して署名検証が回避できるか確認

CVE番号:CVE-2015-9235
オプション「--exploit a」を利用することで、Header部の「alg」の値を「none」に変更し、署名の検証プロセスを回避できるかを確認できる。
 
実行結果は以下の通り。「alg」の値をそれぞれ「none」「None」「NONE」「nOnE」に変更したJWTが出力される。
 

Null Signature Attack

CVE番号:CVE-2020-28042
オプション「--exploit n」を利用することで、Signature部のサイズが0のJWTを生成する。
Signature部のサイズが0の場合に署名検証が行われない脆弱性があるライブラリがあるため、検証を実施する。
 
 
実行結果は以下の通り。Signature部がnull(空)のJWTが生成される。
 

blank password accepted in signature

オプション「--exploit b」を利用することで、署名に使われるパスワードを無し(空)でJWTを作成できる。
 
実行結果は以下の通り。

JWKS Spoofing

オプション「--exploit s」を利用することで、JSON Web Key Set (JWKS)を指定できる。
 
JSON Web Key Set (JWKS)とは? JWTを検証するために使用される公開鍵を含む鍵のセットのこと。
 
オプション「-ju」にJWKS URLを指定する。(設定ファイル「jwtconf.ini 」を利用してもOK)
 

RS256 to HS256 Key Confusion Attack

CVE番号:CVE-2016-5431
オプション「--exploit k」を利用することで、
key confusion (specify public key with -pk)
オプション「-pk」に署名に使われている公開鍵を指定する。
 

Key Injection Attack

CVE番号:CVE-2018-0114
JWTの中に公開鍵を含めることで、攻撃者の新しい秘密鍵で署名・検証されてしまう脆弱性。
オプション「--exploit i」を利用することで、JWTを生成できる。
 
実行結果は以下の通り。
 

署名鍵の総当たり攻撃

「HS256」を利用している場合、共通鍵のため総当たり攻撃が可能。
オプション「-d」にパスワードリストを指定することで、総当たりする。
 

データを改変する

ターミナルの案内に従ってJWTのデータを改変し、エンコード済みのJWTを出力する。
 
実行結果は以下の通り。例としてPayload部の「login」クレームの値を「test」に変更したJWTを作成する手順を示す。

見つけた鍵でJWTを改竄する

総当たり攻撃などで共通鍵が分かっている場合は、その鍵を利用して署名を実行することも可能。

"kid" Injection