Norton Internet Security 2003 に脆弱性を発見

softether2004-09-28

Norton Internet Security 2003 (Norton AntiVirus 2003 Professional に付属) の使用しているネットワークフィルタドライバ (SYMTDI.sys) に脆弱性のようなものを発見した。

Norton AntiVirus 2003 Professional をインストールすると、Norton Internet Security でも使われているシマンテック社製の SYMTDI.sys というカーネルモードデバイスドライバがシステムにインストールされ、Windows 2000 / XP の起動時に自動的にロードされるようになっている。
このデバイスドライバの内容は公開されていないが、自分が推定したところによると、Windowsカーネルモードのソケット通信ライブラリ (TDI と呼ぶ) と WinSock との間に入って各種フィルタリングやリアルタイム ウイルスチェックなどを行うドライバのようである。
Norton AntiVirus では、コンピュータが送受信するメールの内容を、POP3SMTP などのプロトコルの流れから抽出して、リアルタイムでウイルスチェックを行うという機能がある。このようなところにも、SYMTDI.sys が利用されているようである。

僕が発見したのは、SYMTDI.sys 内でスピンロックを確保していない箇所が存在する可能性があり、その結果 Windows カーネルがクラッシュしてブルースクリーンになってしまうという問題である。

SYMTDI.sys は Windowsカーネルモードドライバだが、複数 CPU が存在する場合に同期をとる必要がある箇所で同期をとっていない可能性がある。
その結果、 Norton Internet Security 2003 や Norton AntiVirus 2003 Professional がインストールされている Intel Hyper Threading または Dual CPU のコンピュータ上で、ユーザーモードで変なソケット プログラムを走らせるだけで、そのコンピュータのカーネルを停止させてしまうことができる。

この問題は、SoftEther VPN 2.0 を開発している途中で SoftEther 2.0 の仮想 LAN カードのストレステスト (大量にネットワークデータを流して、同期関係のバグなどが無いかどうかを検証するテスト) を行っている途中に発見した。大量のソケットを開き大容量のデータを送受信していると、SYMTDI.sys が原因でブルースクリーンが発生する。

最初は、開発中の SoftEther 2.0 が原因ではないかと思い、合計1週間弱に渡って SoftEther 2.0 カーネルモードドライバのコードを見直していたが、結局バグは見つからなかった。

その後、Intel Pentium 4 2.8GHZ Hyper Threading のマシンに Windows XP Professional をクリーンインストールし、SoftEther などを一切いれずに Norton AntiVirus 2004 のみをインストールしてから、ユーザーモードだけで動く Socket プログラムをコンパイルして実行してみた。するとやはり同じ部分のコードを実行して WinSock 2.0 を呼び出しただけで落ちた。

また、HT でない Single CPU の場合は何度やっても落ちないので、同期関係のバグの可能性が高いと思った。

この脆弱性の危険性

この脆弱性はスタックオーバーフローではなく、カーネル内で解放した非ページメモリ領域のアドレスにアクセスしようとして Norton Internet Security 2003 の TDI フィルタドライバがクラッシュするというものである。
再現率は 100% なのだが、大量に WinSock でデータ通信を行うなどの負荷の高いことをしないと、まず発見されない。このドライバが 2002 年くらいに開発されたものをそのまま使っているにもかかわらず、まだクラッシュするという話を聞いたことが無かったので、恐らく 偶然誰も発見しなかっただけ なのだろうと思う。

だが、Norton Internet Security 2003 などがインストールされたマシンがあれば、このようなプログラムを使うと、一般ユーザーだけでユーザーモードからカーネルを落とせるので、結構危険なのかもしれない。