
FatFs組み込みファイルシステムライブラリの文書化されたセキュリティ脆弱性。CVE詳細、ファジングハーネス、エクスプロイト用ディスクイメージジェネレーター、および数十のダウンストリームファームウェアプロジェクトにわたるサプライチェーン影響分析が含まれます。
このリポジトリは、FatFs における確認済みの6件のセキュリティ脆弱性と、テストハーネス、ファザー、およびスタンドアロンのエクスプロイトディスクイメージ生成ツールを文書化したものです。
元のFatFsソースコードは、FatFs-R0.16 ディレクトリにあります。
このプロジェクトは、2017年に実施したセキュリティ評価への回帰です。その当時、手動監査と数日間にわたるファジングによって、FatFsドライバの基本的ではあるが興味深くないバグがいくつか特定されました。9年後の2026年3月、私たちはVisual Studio Code、GitHub Copilotの「auto」モード、およびいくつかの基本的なプロンプトを使用して、特定のループ、ハーネス、スキルを一切使わずにこのプロジェクトを再訪しました。結果は驚くべきものでした。手動監査で見落とされていたバグが、LLMを使って新しい入力を伴うファザーを自動的に構築することで、簡単に見つかるようになったのです。この取り組みでは興味深いバグが見つかっただけでなく、さまざまな組み込み開発シナリオにわたって悪用可能性を検証するプロセスも自動化されました。
詳細なメモについては、以下のファイルを参照してください:
FatFsは、ChaN (elm-chan.org) によってCで書かれた、移植可能でロイヤリティフリーのFAT/exFATファイルシステムライブラリです。OSに依存せず、リソースが制約された組み込みシステム向けに設計されており、通常はファームウェアに直接コンパイルされます。FAT12、FAT16、FAT32、exFATに加え、オプションのLFN(長いファイル名)およびGPTパーティションサポートをサポートしています。
FatFsは小さく、自己完結型であり、寛容なライセンスであるため、マイクロコントローラファームウェアにおける事実上の標準FAT実装となっています。このライブラリは、公式SDK、RTOS、ブートローダー、アプリケーションフレームワークにそのままベンダリングされています。つまり、単一の上流の脆弱性が、ff.cをコピーしたすべての下流プロジェクトに伝播するということです。
以下のプロジェクトは、脆弱性のあるバージョンのFatFsを同梱していることが確認されています。完全な分析、プロジェクトごとの伝播経路、およびセキュリティ連絡先情報については、02_CRITICAL.md を参照してください。
| プロジェクト | スター数 | FatFsバージョン | 脆弱性 |
|---|---|---|---|
| espressif/esp-idf | 17,655 | R0.16 | CVE-2026-6682 |
| STMicroelectronics/stm32-mw-fatfs | すべてのSTM32Cube | R0.15 w/p2 | CVE-2026-6682, CVE-2026-6683, CVE-2026-6686, CVE-2026-6687 |
| zephyrproject-rtos/zephyr | 14,820 | R0.16 | CVE-2026-6683, CVE-2026-6687, CVE-2026-6688 |
| micropython/micropython | 21,583 | R0.13c (2019) | CVE-2026-6682, CVE-2026-6683, CVE-2026-6684, CVE-2026-6686, CVE-2026-6687 |
| ArduPilot/ardupilot | 14,743 | R0.14b | CVE-2026-6682, CVE-2026-6683, CVE-2026-6686, CVE-2026-6687 |
| RT-Thread/rt-thread | 11,862 | R0.16 | CVE-2026-6683, CVE-2026-6686 |
| nodemcu/nodemcu-firmware | 7,903 | 様々 | CVE-2026-6688 |
| RIOT-OS/RIOT | 5,701 | R0.15 | CVE-2026-6682, CVE-2026-6683, CVE-2026-6686, CVE-2026-6687 |
| ARMmbed/mbed-os | 4,837 | R0.14b | CVE-2026-6682, CVE-2026-6683, CVE-2026-6686 |
| sbabic/swupdate | 1,780 | R0.16 | CVE-2026-6683 |
| rsta2/circle | 2,222 | 未定 | CVE-2026-6684 |
| hugen79/NanoVNA-H | 695 | R0.15 | CVE-2026-6683 |
| ChibiOS/ChibiOS | 833 | 様々 | CVE-2026-6688 |
| Samsung/TizenRT | 643 | R0.16 | CVE-2026-6683, CVE-2026-6688 |
| adafruit/tinyuf2 | 447 | 未定 | CVE-2026-6684, CVE-2026-6686 |
| grblHAL/Plugin_SD_card | 475 | R0.16 | CVE-2026-6688 |
| JcZou/StarryPilot | 315 | R0.16 | CVE-2026-6688 |
| KeystoneHQ/keystone3-firmware | 199 | R0.16 | CVE-2026-6682 |
| flysight/flysight | 44 | 様々 | CVE-2026-6682, CVE-2026-6688 |
| eugene-tarassov/vivado-risc-v | 1,061 | 未定 | CVE-2026-6684 |
| CVE ID | 概要 | CWE |
|---|---|---|
| CVE-2026-6682 | FAT32ボリュームマウントにおける整数オーバーフロー | CWE-190: Integer Overflow or Wraparound |
| CVE-2026-6683 | exFAT同期におけるゼロ除算 | CWE-369: Divide By Zero |
| CVE-2026-6684 | GPTパーティションスキャンにおける無限ループ | CWE-835: Loop with Unreachable Exit Condition |
| CVE-2026-6686 | EOFを超えたシーク後に未初期化クラスタを使用 | CWE-908: Use of Uninitialized Resource |
| CVE-2026-6687 | 無制限のexFATラベル長によるスタックバッファオーバーフロー | CWE-121: Stack-based Buffer Overflow |
| CVE-2026-6688 | 無制限のLFNファイル名コピーによるバッファオーバーフロー | CWE-120: Buffer Copy without Checking Size of Input |
FatFsにはCVEの履歴がなく、セキュリティメーリングリストもなければ、パッチ通知の仕組みもありません。ff.cをベンダリングしているすべての下流プロジェクトは、通常は影響を受けていることを知らないまま、これらの脆弱性を独自に発見し、トリアージし、パッチを当てる必要があります。つまり、公表から広範な修正までの期間は、日単位ではなく年単位になるでしょう。したがって、実際の攻撃対象は1つのソフトウェアアプリケーションやサービスではなく、数十の独立したコードベースにわたる数千万台のデバイスであり、その多くは決してパッチを受け取ることはありません。
典型的な悪用シナリオは悪意のあるSDカードです。数秒の物理アクセスを持つ攻撃者が、民生用カメラからドローン、3Dプリンタ、その他数千もの製品ファミリーに至るデバイスのストレージメディアを交換します。この一連の脆弱性はすべて、細工されたFATイメージをマウントするだけでトリガーでき、それはほとんどの場合、ユーザーの操作を必要とせず挿入時に自動的に発生します。とはいえ、物理アクセスだけが経路ではありません。
FAT形式のアップデートパッケージをネットワークソースから取り込むデバイス(OTAアップデートフレームワークやドラッグアンドドロップのブートローダーアップデートなど)は、アップデートパイプラインに悪意のあるイメージを届けられるあらゆる攻撃者によって悪用可能です。サプライチェーンへの侵害、平文HTTPアップデートフィードへのAitMインジェクション、またはホビーファームウェア配布ポータルに投稿された悪意のあるイメージなどが該当します。OTA経路は、FatFsでマウントする前にアップデートコンテナのエンドツーエンドの認証付き完全性検証を行わないすべてのデバイスにおいて、完全にリモートで攻撃可能です。
CVE-2026-6682 - 攻撃者が制御する読み取り長につながる整数オーバーフロー
特定のフィールドをオーバーフローさせるように設定したFAT32ボリュームを細工することで、攻撃者は被害デバイスに対して、攻撃者が選択したバイト数を固定バッファに読み込ませることができます。これはコード実行への直接的な経路です。ベアメタルの組み込みターゲットでは、このエクスプロイトは決定的であり、ヒープスプレー、ブルートフォース、情報漏えいを前提条件として必要としません。
攻撃者は、ターゲットがマウントするFATボリュームを制御する必要があります。ほとんどのデバイスでは、SDカードを交換するための物理アクセスを意味します。ネットワーク経由でファームウェアアップデートを受け入れるデバイスや、FatFsが解析した後でのみアップデートパッケージの完全性を信頼するデバイスは、リモートで悪用可能です。
CVE-2026-6683 - exFAT同期におけるゼロ除算
R0.16より前のFatFsを実行しているデバイスに、細工されたexFATボリュームを届けられる攻撃者は、その後の任意の書き込みでクラッシュを保証できます。FatFs R0.16は、書き込みが発生する前に細工されたボリュームを拒否する可能性のある、マウント時の部分的なガードを追加しましたが、根本的な算術欠陥は完全には修正されていません。FAT形式のメディアへの書き込みによってOTAファームウェアアップデートを適用するデバイスに対しては、トリガーが成功すると一撃のリモート文鎮化になります。アップデートプロセスが書き込み途中でクラッシュし、ハードウェアデバッガへの物理アクセスなしにはデバイスを復旧できない可能性があります。
攻撃者は、標的のデバイスに自身が制御するexFATボリュームをマウントさせ、その後何らかの書き込みまたは同期操作を実行させる必要があります。悪意のあるSDカードのシナリオはほとんどの組み込みデバイスをカバーします。リモート悪用の場合、標的のOTAパイプラインが、完全性を最初に検証することなく、攻撃者が提供したイメージを受け入れてマウントする必要があります。
CVE-2026-6684 - GPTパーティションスキャンにおける無限ループ
単一のフィールドを最大値に設定したGPTディスクイメージを配信すると、標的は電源が切られるまでディスクセクタの読み取りをループし続けます。ウォッチドッグなしで動作するブートローダーやベアメタルファームウェアに対しては、これは恒久的な文鎮化です。デバイスは二度とブートを完了できません。この脆弱性はFatFs R0.16で修正されているため、影響を受けるのは古いリリースをベンダリングしているデバイスだけです。
攻撃者は、標的に自身が制御するGPTフォーマットのディスクをマウントさせる必要があり、標的は64ビットLBAサポートを有効にしたR0.16より前のFatFsビルドを実行している必要があります。ブートローダーがここで最も魅力的なターゲットとなるのは、まさにウォッチドッグや復旧経路を持たない傾向があるからです。
CVE-2026-6686 - EOFを超えたシーク後に古いクラスタデータが読み取り可能
ファイルの終端を超えてシークしてファイルを拡張しても、FatFsは新しく割り当てられたストレージをゼロで埋めません。削除されたファイルによって以前にそれらのセクタに書き込まれたデータは、拡張されたファイルを次に開いたプロセスによって読み取られます。OTAステージング領域でファームウェアイメージを循環させるデバイスや、ブートローダーとアプリケーションの間でSDカードを共有するデバイスでは、以前のファームウェアブロブ、キー、その他の機密コンテンツが、権限の低い読み取り側に露出する可能性があります。
攻撃者は、標的のFATボリューム上で、シーク操作によって拡張されたファイルへの読み取りアクセスが必要です。これは主にローカルまたは物理アクセスのシナリオです。
CVE-2026-6687 - exFATボリュームラベルによるスタックオーバーフロー
過大なラベルを持つexFATボリュームを供給すると、アプリケーションがf_getlabel()を呼び出したときに、FatFsが呼び出し元のラベルバッファをオーバーフローさせます。STのSTM32CubeMXコードジェネレータは、生成するすべてのFatFs対応プロジェクトで脆弱なバッファサイズを出力するため、この脆弱性は、膨大でほとんどカタログ化されていない商用STM32ファームウェア群に存在します。スタッククッキーやASLRがないベアメタルのCortex-Mデバイス(一般的なケース)では、これは一撃のコード実行プリミティブです。
攻撃者は、標的に自身が制御するexFATボリュームをマウントさせ、その後f_getlabel()を呼び出させる必要があります。FatFsライブラリはこれを内部的に呼び出しません。アプリケーションが明示的に呼び出す必要があります。ほとんどのプロジェクトは、独自のマウント時初期化の一部としてこれを行うため、実際にはそれらのプロジェクトでは攻撃者のさらなる操作は不要です。