Microsoft は、2014年10月の定例セキュリティ更新で、FAT32・ディスク・パーティション・ドライバに存在する脆弱性に対するセキュリティ更新プログラム「MS14-063」を公開しました。この問題の脆弱性「CVE-2014-4115」を利用した攻撃により、攻撃者は侵害した PC の権限を昇格させることが可能になります。尚、この脆弱性は特別に細工された USB ドライブを介してのみ利用されます。
■「CVE-2014-4115」の特異な点
トレンドマイクロは、ファイル・システム・ドライバに注目しました。なぜなら USBドライブを介して PC を攻撃するために利用される可能性があるからです。例えば、「STUXNET(スタクスネット)」を利用した攻撃では、まず Windowsのショートカットファイルに存在する脆弱性を利用して、Windows のシェルコードを簡単に実行できるようにしました。その後、管理者権限を取得するために別の脆弱性を利用することで感染を広げました。ファイル・システム・ドライバに存在する脆弱性は、通常は別々の 2つの手順を 1つで実行するために利用されます。
「CVE-2014-4115」は、Windows Vista および Server 2003、Server 2008 のファイル・システム・ドライバ “FASTFAT.SYS” に存在する脆弱性です。このドライバは、FAT32 といった FASTFATファイルシステムを扱います。FAT32形式のドライブ上で、特定の「BIOS Parameter Block(BPB)」を持つブートセクタを扱う際に、この脆弱性が利用される可能性があります。
FAT32 は、USBドライブで現在もまだ一般的に利用されています。そのため、この脆弱性を利用して標的型攻撃を実行することができます。例えば、企業の上級役員のノートパソコンや企業のイントラネット内の PC に特別に細工された USBドライブが挿入されたとします。その結果、外部の攻撃者がこれらの PC を制御し、標的型攻撃に利用することが可能になります。
システム管理者が適宜に更新プログラムを適用していた場合、この攻撃の犠牲となる危険性は軽減したでしょう。企業のシステム管理者はまた、企業のネットワーク内における USBドライブの利用に関して、現在の方針を再考するとよいでしょう。
■「CVE-2014-4115」とは? どこに存在する脆弱性か
上述したように、「CVE-2014-4115」は “FASTFAT.SYS” に存在する脆弱性です。この脆弱性を抱えるバージョンと更新プログラム適用済みのバージョンを比較すると、1つだけ違いがあります。それは関数「FatCommonWrite()」です。
図1:更新プログラム適用前と後の “FASTFAT.SYS”
2番目のパラメータ「NumberOfBytes」は、関数「ExAllocatePoolWithTag」が呼び出されると、修正済みバージョンでは 0x18 が乗算されます。
以下は、関数「ExAllocatePoolWithTag()」の例です。
PVOID ExAllocatePoolWithTag(
_In_ POOL_TYPE PoolType,
_In_ SIZE_T NumberOfBytes,
_In_ ULONG Tag
);
この脆弱性自体は極めて単純です。開発者は、割り当てに必要なメモリサイズの計算を誤りました。構造体の数に 1命令のサイズを掛け合わせるのを忘れたのです。このため、以下の命令でサービス運用妨害(予約済み領域の書き込み)につながる恐れがあります。
この脆弱性に関連する擬似コードは、以下のように書かれている可能性があります。
NTSTATUS FatCommonWrite (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
){
……
if (TypeOfOpen == VirtualVolumeFile)
{
….
ULONG Fat;
ULONG BytesPerFat;
IO_RUN StackIoRuns[2];
PIO_RUN IoRuns;
BytesPerFat = FatBytesPerFat( &Vcb->Bpb );
if ((ULONG)Vcb->Bpb.Fats > 2) {
IoRuns = FsRtlAllocatePoolWithTag(
PagedPool,
(ULONG)(Vcb->Bpb.Fats), //Actual vulnerability, missing ×sizeof(IO_RUN)
TAG_IO_RUNS );
} else
{
IoRuns = StackIoRuns;}
for (Fat = 0; Fat < (ULONG)Vcb->Bpb.Fats; Fat++)
{
IoRuns[Fat].Vbo = StartingDirtyVbo;
IoRuns[Fat].Lbo = Fat * BytesPerFat + StartingDirtyVbo;
IoRuns[Fat].Offset = StartingDirtyVbo – StartingVbo;
IoRuns[Fat].ByteCount = WriteLength;
}
……
}
……
}
「Bpb.Fats」が 3 以上の場合、「FsRtlAllocatePoolWithTag()」による「IoRuns」へのメモリの割り当ては、予想されるサイズより明らかに小さくなります。「IoRuns」が再度呼び出されると、通常クラッシュが生じます。例えば、「for」の命令文で開始された時などです。しかし、攻撃者はカーネルオブジェクトを故意に上書きするためにこれを利用し、任意のコード実行を行う準備を整えることができます。
■脆弱性の利用
ファイルタイプ「VirtualVolumeFile」を持つ FAT32 ファイルの書き込み要求はどんなものでも「FatCommonWrite」を呼び出すことができるため、脆弱性を利用する条件(condition (Vcb ->Bpb.Fats > 2)を満たすために、「Vcb->Bpb.Fats」をどう制御するかが重要な鍵となります。
FASTFAT の実装では、「ボリューム・コントロール・ブロック(VCB)」の記録は、ファイルシステムに実装された各ボリュームに一致します。「FatCommonWrite」では、VCBは「FileObject」で開始されます。「FileObject」は、この脆弱性の前にある FAT32ボリュームのパーティションのメモリ表現です。
図2 は、VCBのプロセスをさかのぼった詳細です。
図2:VCB のさかのぼったプロセス
「_USBSTOR」は、FAT32ファイルシステム上で弊社が試験用に使用した USBドライブのボリューム名です。
■「Bpb.Fats」とは何か
「マスター・ブート・レコード(MBR)」は通常、シリンダ0、ヘッド0、セクタ1に位置し、FAT32 の最初のパーティションのブートセクタは、シリンダ0、ヘッド1、セクタ1に位置します。
FATボリュームの最初の重要なデータ構造体は「BIOS Parameter Block(BPB)」と呼ばれ、予約済み領域のボリュームの第1セクタ(ブートセクタ)に位置します。
図3:ディスクフォーマット上の BPB
BPB の構造体の定義は、Microsoft の「Windows Driver Kit(WDK)」で以下のように確認することができます。
typedef struct BIOS_PARAMETER_BLOCK {
USHORT BytesPerSector;
UCHAR SectorsPerCluster;
USHORT ReservedSectors;
UCHAR Fats; //Number of FAT tables, default 2
USHORT RootEntries;
USHORT Sectors;
UCHAR Media;
USHORT SectorsPerFat;
USHORT SectorsPerTrack;
USHORT Heads;
ULONG32 HiddenSectors;
ULONG32 LargeSectors;
ULONG32 LargeSectorsPerFat;
union {
USHORT ExtendedFlags;
struct {
ULONG ActiveFat:4;
ULONG Reserved0:3;
ULONG MirrorDisabled:1;
ULONG Reserved1:8;
};
};
USHORT FsVersion;
ULONG32 RootDirFirstCluster;
USHORT FsInfoSector;
USHORT BackupBootSector;
} BIOS_PARAMETER_BLOCK, *PBIOS_PARAMETER_BLOCK;
■「Bpb.Fat」をどのように制御するか
「Bpb.Fat」は、ディスクドライブの固定バイトに位置し、セクタの読み書きツールによって直接変更できます。
今回の試験で、弊社は Bpb構造体(図4:BPB_FAT32構造体)とFatフィールド(図4:NumberOfFats)を確認するために、バイナリエディタの FAT32 のひな形を使用しました。
図4:BPB のデータ構造体における FATS
■「PoC」でクラッシュを再現
弊社は、FAT32 の USBドライブの BPB を単純に変更して「Proof-of-concept(PoC、概念実証型エクスプロイト。実際に有効な攻撃ができることを実証している攻撃コード)」を作成しました。弊社は、セクタの読み書きツールを使用して、「BPB_FAT32.NumberOfFATs」を 2 より大きい数字に変更しました。
以下のような手順の後、すぐにクラッシュが起こりました。
- 脆弱性を抱える「FASTFAT.SYS」のバージョンを搭載する PC に USBドライブを挿入する
- ディスク上にファイルをコピーするなどの書き込みを実行する
■結論
この脆弱性は、Windows の古いバージョンに存在します。つまり、Vista および Server 2003、Server 2008です。新しいバージョンである Windows 7、Windows 8、Server 2008 R2、Server 2012 は影響を受けません。
この脆弱性に対する更新プログラムを適用することで、その OS のコードは新しいバージョンの Windows と基本的に同等となります。弊社では、この脆弱性は、コーディングもしくはコードの統合中の人為的過誤によって引き起こされたと考えています。そのため、「FASTFAT.SYS」における Windows7 とその他の OS のバイナリを比較すると、脆弱性や不具合がさらに確認されるかもしれません。
この脆弱性を利用した攻撃は、2014年10月末時点でまだ一般には確認されていません。しかし、この脆弱性を利用した攻撃が確認される可能性は除外できません。弊社が行った解析が示すように、感染PC上ですぐにコード実行をしない脆弱性であっても危険をもたらす可能性があるため、企業側は更新プログラム管理を改善する必要があります。また、弊社のネットワーク監視ソリューション製品「Trend Micro Deep Discovery」は、こうした脆弱性を利用した攻撃からの危険性を軽減するのに役立つでしょう。
参考記事:
- 「 CVE-2014-4115 Analysis: Malicious USB Disks Allow For Possible Whole System Control」
by Moony Li (Threat Analyst)
翻訳:品川 暁子(Core Technology Marketing, TrendLabs)