CVE情報

CVE information

CVE-2026-85769
: : libtpmsのTPM 2.0状態復元処理における境界外読み取りの脆弱性

報告者

株式会社CyberCrew Isuka Sanuj ※本脆弱性と同一の原因について、Leyao(ICT CAS)氏からも独立して報告されています。

概要

libtpmsにおいて、TPM 2.0の状態データを復元する処理に不備があり、ヒープ領域の境界外を読み取る可能性がある「境界外読み取り(Out-of-Bounds Read)」の脆弱性が確認されました。

本脆弱性は、TPM 2.0の揮発性状態データ(volatile-state)をデシリアライズする際、オプションブロックをスキップする処理において、指定されたブロックサイズが入力バッファーの残りサイズを超えていないか適切に検証されていないことに起因します。

細工された状態データによって内部の残りサイズを示すカウンターが負の値になると、その後の境界チェックにおいて符号付き整数から符号なし整数への変換が行われます。

この結果、本来はエラーとして処理されるべき状態であっても境界チェックを通過し、確保されたヒープバッファーの範囲外が読み取られる可能性があります。

本脆弱性が悪用された場合、libtpmsを利用しているプロセスが異常終了し、swtpmを使用した仮想TPM環境では、仮想TPMやそれに依存する仮想マシンの可用性に影響を与える可能性があります。

本脆弱性は CWE-125:Out-of-bounds Read に分類されます。

根本原因には、整数アンダーフローおよび符号付き整数から符号なし整数への変換も関係しています。

基本スコア(Base Score)

6.5 (Medium)
CVSS Vector: CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

攻撃元区分(Attack Vector)

ネットワーク(Network)
隣接ネットワーク(Adjacent)
ローカル環境(Local)
物理アクセス(Physical)

攻撃の複雑さ(Attack Complexity)

(Low)
(High)

必要な権限(Privileges Required)

不要(None)
(Low)
(High)

ユーザー関与(User Interaction)

不要(None)
必要(Required)

スコープ(Scope)

変更なし(Unchanged)
変更あり(Changed)

機密性(Confidentiality)

影響なし(None)
(Low)
(High)

完全性(Integrity)

影響なし(None)
(Low)
(High)

可用性(Availability)

影響なし(None)
(Low)
(High)

脆弱性の概要

項目内容
CVECVE-2026-85769
影響を受ける製品libtpms
対象TPM 2.0
脆弱性の種類ヒープ境界外読み取り(Heap Out-of-Bounds Read)
CWECWE-125
関連する問題CWE-191:Integer Underflow / CWE-195:Signed to Unsigned Conversion Error
主な関連ファイルsrc/tpm2/NVMarshal.csrc/tpm2/Unmarshal.c
CVSS v3.16.5(Medium)
Red Hat評価Moderate
主な影響libtpmsを利用するプロセスの異常終了、サービス拒否(DoS)
修正残りサイズが負値でないことを確認する境界チェックを追加

libtpmsとは

libtpmsは、ソフトウェア上でTPM(Trusted Platform Module)の機能を提供するオープンソースライブラリです。

TPMは、暗号鍵の保護、システムの完全性確認、ディスク暗号化、セキュアブートなど、さまざまなセキュリティ機能で利用される仕組みです。

libtpmsはTPM 1.2およびTPM 2.0の機能をソフトウェアとして実装しており、swtpmなどのソフトウェアTPMエミュレーターから利用されます。

仮想化環境では、swtpmとlibtpmsを組み合わせることで、仮想マシンに仮想TPM(vTPM)を提供することができます。

このため、libtpmsの状態復元処理に問題が発生した場合、仮想TPMだけでなく、それを利用する仮想マシンの動作にも影響する可能性があります。

脆弱性の詳細

本脆弱性は、libtpmsがTPM 2.0の揮発性状態データを復元する際のデシリアライズ処理に存在します。

問題となる処理の一つが、オプションのバージョン付きブロックを読み飛ばす block_skip_read() です。

この処理では、状態データ内から取得したブロックサイズに従って読み取り位置を進めるとともに、入力データの残りサイズを減算します。

概念的には以下のような処理が行われます。

*buffer += blocksize;
*size   -= blocksize;

blocksize は状態データから取得される値ですが、脆弱な処理では、この値が実際の入力バッファーの残りサイズを超えていないか十分に確認されていませんでした。

そのため、残りデータより大きい blocksize が指定されると、*size が負の値になる可能性があります。

符号付き整数から符号なし整数への変換

本脆弱性を成立させる重要な要因が、その後の境界チェックです。

後続処理では、概念的に以下のようなチェックが行われます。

if ((UINT32)*size < sizeof(UINT16)) {
    return TPM_RC_INSUFFICIENT;
}

ここで *size は符号付き整数ですが、比較時には UINT32、つまり符号なし32ビット整数へ変換されています。

例えば、残りサイズが -8000 になった場合、符号なし整数へ変換すると非常に大きな正の値として解釈されます。

(UINT32)(-8000)
= 4294959296

この状態では、

4294959296 < 2

という比較になるため、境界チェックが失敗せず、そのまま後続処理へ進んでしまいます。

その結果、実際には入力バッファーを使い切っているにもかかわらず、まだ大量のデータが残っているかのように処理されます。

境界外読み取りの発生

不正なブロックサイズによって読み取り位置がバッファーの終端を超えた後、libtpmsは次のTPM状態構造を読み取ろうとします。

この際、確保されているヒープ領域の外側からデータを読み取ることで、ヒープバッファーの境界外読み取りが発生します。

検証では、AddressSanitizer(ASan)によって heap-buffer-overflow が検出されています。

境界外読み取りは、block_skip_read() 自体ではなく、その後のTPM状態データを解析する処理で発生します。

これは block_skip_read() が読み取り位置を移動するだけで、実際のメモリアクセスは後続処理によって行われるためです。

攻撃対象となる処理

本脆弱性は、以下のAPIを通じてTPM 2.0の状態データを復元する際に到達可能です。

TPMLIB_SetState(TPMLIB_STATE_VOLATILE, ...)

また、TPM起動時の状態復元処理においても、概ね以下の経路から脆弱な処理へ到達します。

TPMLIB_MainInit
↓
_TPM_Init
↓
VolatileLoad

そのため、外部から細工されたTPM 2.0状態データを読み込ませることが可能な環境では、本脆弱性が悪用される可能性があります。

仮想マシン移行時のリスク

swtpmを利用する仮想化環境では、仮想マシンのライブマイグレーションが重要な攻撃経路となる可能性があります。

仮想マシンを別のハイパーバイザーホストへ移行する際には、仮想マシン本体の状態だけでなく、仮想TPMの状態も移行先へ転送する必要があります。

swtpmでは、TPM状態データを取得・設定するための仕組みが利用されます。

移行先ホストでは、移行元から受け取ったTPM状態データをlibtpmsが解析します。

そのため、侵害された移行元ホストなどから不正なTPM状態データが生成された場合、移行先ホスト側のswtpmプロセスで本脆弱性が発生する可能性があります。

migration-keyについて

swtpmでは、移行時のTPM状態データを保護するために --migration-key を設定することができます。

ただし、migration-keyを使用していることだけでは、本脆弱性への完全な対策とはなりません。

ライブマイグレーションを実施するホスト間では同じ移行鍵を共有する必要があります。

そのため、移行元ホスト自体が侵害されている場合、攻撃者は正しい鍵を使用して、暗号学的には有効な細工済み状態データを作成できる可能性があります。

migration-keyは通信経路上の第三者による改ざんなどへの対策としては有効ですが、信頼された移行元ホストそのものが侵害されたケースを防ぐものではありません。

検証

本脆弱性について、CyberCrew所属のセキュリティリサーチャーによる検証では、libtpmsのTPM 2.0状態データを意図的に変更し、脆弱なデシリアライズ処理へ入力することで問題が確認されています。

検証では、正規のTPM状態データを取得した後、特定のオプションブロックのサイズを変更し、状態データ全体として必要な整合性情報を再計算しています。

この状態データを TPMLIB_SetState() へ入力すると、AddressSanitizerによってヒープ境界外読み取りが検出されました。

修正後のバージョンに同じ異常データを入力した場合には、

TPM_RC_INSUFFICIENT

が返され、境界外アクセスが発生しないことも確認されています。

正常な状態データについては、修正後も従来どおり正常に復元できることが確認されています。

なお、脆弱性の再現や検証は、自身が管理するシステムまたは明示的な許可を得た環境でのみ実施してください。第三者が管理するシステムに対する無断の検証は行わないでください。

想定される影響

本脆弱性が悪用された場合、主に以下の影響が発生する可能性があります。

libtpmsを利用するプロセスの異常終了

ヒープ領域の境界外を読み取ることで、libtpmsを利用するプロセスが異常終了する可能性があります。

swtpm環境では、swtpmプロセスがクラッシュする可能性があります。

仮想TPMの停止

swtpmプロセスが異常終了した場合、そのプロセスによって提供されている仮想TPMが利用できなくなる可能性があります。

TPM機能を必要とする仮想マシンでは、正常な動作を継続できない可能性があります。

仮想マシンの可用性への影響

仮想TPMに依存している仮想マシンでは、TPM機能の停止によって起動や状態復元などに影響する可能性があります。

そのため、Red HatのCVSS評価では可用性への影響が「High」とされています。

情報漏えいについて

境界外読み取りの脆弱性では一般に、隣接するメモリ領域の情報が漏えいする可能性も検討する必要があります。

しかし、本脆弱性について行われた検証では、情報漏えいにつながる経路は確認されていません。

境界外読み取り後に解析される構造体では、特定の固定値が正しいかどうかを確認する処理があり、無関係なヒープメモリが偶然その値と一致する可能性は極めて低いと考えられます。

一致しない場合、解析処理はエラーとなり、状態データは破棄されます。

Red Hatによる独立した評価でも、情報漏えいやコード実行につながる経路は確認されていません。

そのため、CVSSでは以下のように評価されています。

  • Confidentiality:None
  • Integrity:None
  • Availability:High

本脆弱性の主要なリスクはサービス拒否(DoS)です。

影響を受ける環境

本脆弱性は、TPM 2.0サポートを有効にしてビルドされたlibtpmsに影響します。

TPM 2.0は通常のlibtpmsビルドで利用される構成の一つです。

一方、TPM 1.2のみをサポートする構成では、今回問題となったTPM 2.0状態デシリアライズ処理は含まれないため、本脆弱性の影響を受けません。

実際の製品への影響については、各Linuxディストリビューションや製品ベンダーが提供するCVE情報を確認してください。

修正内容

本脆弱性は、TPM 2.0状態データを解析する際のサイズ検証処理を強化することで修正されています。

修正版では、符号付きの残りサイズを符号なし整数へ変換する前に、

*size < 0

であるかを確認する処理が追加されています。

これにより、細工されたブロックサイズによって残りサイズが負値となった場合、その時点で解析処理を停止できます。

修正コミットでは、TPM 2.0デシリアライズ処理に対して、この負値チェックが追加されています。

本脆弱性の修正はアップストリームへ取り込まれており、修正後のコードでは不正な状態データに対して TPM_RC_INSUFFICIENT を返すことが確認されています。

推奨される対策

libtpms、swtpm、またはこれらを利用する仮想化環境を運用している場合、以下の対応を推奨します。

1. セキュリティアップデートを適用する

利用しているLinuxディストリビューションまたは製品ベンダーが、本脆弱性に対応した更新パッケージを提供しているか確認してください。

提供されている場合は、影響を確認したうえで速やかに適用してください。

Linuxディストリビューションでは、修正を既存のパッケージバージョンへバックポートする場合があります。

そのため、単純にlibtpmsのバージョン番号だけで判断せず、利用しているディストリビューションのセキュリティ情報を確認することが重要です。

2. 仮想マシン移行元ホストを信頼境界として管理する

ライブマイグレーションを利用している場合、移行元ホストから送信されるTPM状態データが移行先で解析されることを考慮する必要があります。

移行元ハイパーバイザーホストの侵害は、移行先ホスト上で動作するswtpmなどにも影響を及ぼす可能性があります。

そのため、仮想化ホスト間の信頼関係や管理権限を適切に分離してください。

3. 不要なライブマイグレーション経路を制限する

仮想マシンの移行を許可するホストを必要最小限に制限し、信頼されていないホストからの状態データを受け入れない構成とすることが重要です。

4. swtpmの異常終了を監視する

swtpmプロセスの予期しない終了や、TPM状態復元時のエラーを監視してください。

ライブマイグレーションや仮想マシン起動時にswtpmが繰り返し異常終了している場合は、原因調査を行うことを推奨します。

Red Hat製品への影響

Red HatはCVE-2026-85769を Moderate と評価しています。

CVSS v3.1の基本スコアは以下です。

6.5(Medium)

CVSS Vector:

CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

Red Hatは、本脆弱性について成功した悪用による主な影響を、libtpmsをホストするプロセスのクラッシュおよび仮想TPMのサービス拒否としています。

現時点で、データ改ざん、情報漏えい、コード実行につながる経路は確認されていません。

また、Red Hatの公式CVE情報では、株式会社CyberCrewの Isuka Sanuj および Leyao(ICT CAS) が本脆弱性の報告者としてAcknowledgementsに掲載されています。

Red Hat製品を利用している場合は、各製品の影響状況および提供されるセキュリティアップデートを確認してください。

報告・修正までの経緯

本脆弱性について、CyberCrew所属のIsuka Sanujは2026年9月1日にlibtpmsのメンテナーへ非公開で報告しました。

その後、2026年9月4日にLeyao(ICT CAS)氏から、同一の根本原因に関する問題が独立して公開報告されています。

同日、修正がアップストリームへ取り込まれ、Red Hat Product Securityへの報告およびCVE-2026-85769の割り当てが行われました。

両研究者は、Red HatのCVE情報に報告者として掲載されています。

まとめ

CVE-2026-85769は、libtpmsのTPM 2.0状態データを復元する処理に存在する、ヒープ境界外読み取りの脆弱性です。

オプションブロックのサイズが入力バッファーの残りサイズを超えていないか十分に検証されていないことにより、内部のサイズカウンターが負値となる可能性があります。

さらに、その負値が符号なし整数へ変換されることで後続の境界チェックを回避し、ヒープ領域外への読み取りにつながります。

本脆弱性が悪用された場合、libtpmsを利用しているプロセスがクラッシュし、swtpmを利用する仮想化環境では、仮想TPMや関連する仮想マシンの可用性に影響を与える可能性があります。

Red Hatは本脆弱性を CVSS 6.5(Medium)/Moderate Impact と評価しています。

現時点では、情報漏えいやコード実行につながる経路は確認されておらず、主要なリスクはサービス拒否(DoS)です。

libtpmsまたはswtpmを利用している環境では、使用している製品やLinuxディストリビューションのセキュリティ情報を確認し、本脆弱性に対応した更新プログラムを適用することが重要です。

参考情報

■ CVE
CVE-2026-85769

■ 脆弱性種別
CWE-125:Out-of-Bounds Read

■ Red Hat
https://access.redhat.com/security/cve/cve-2026-85769

■ NVD
https://nvd.nist.gov/vuln/detail/CVE-2026-85769

■ CyberCrew Research / Technical Advisory
https://github.com/isukasanuj/CVE-2026-85769

■ libtpms
https://github.com/stefanberger/libtpms

■ Upstream Issue
https://github.com/stefanberger/libtpms/issues/614


Page Top