WindowsのDLL読み込みに脆弱性

 特定Windowsアプリの脆弱性と言っていいのか、Windowsそのものの脆弱性というべきなのか微妙なところだが影響の範囲がきわめて広いWindows DLLの脆弱性が公表された。

WindowsのDLL読み込みに脆弱性--コード実行の危険性:JVN発表(CNET Japan)
Windows プログラムの DLL 読み込みに脆弱性(JVN)

 JVN(Japan Vulnerability Notes)の発表によれば、脆弱性のしくみは下記のようになっているという。Windowsアプリを実行するときダイナミックリンクライブラリが、特に指定がなければ存在する可能性のあるさまざまなフォルダを探しまわる。そのとき攻撃者が操作可能になっているカレントのフォルダに同名のDLLファイルがあれば、そのプログラムが実行されてしまう可能性があるということのようだ。


詳細情報
ダイナミックリンク ライブラリ (DLL) は、プログラムのコンパイル時ではなく、実行時に読み込まれるソフトウエアコンポーネントです。プログラムは LoadLibrary() や LoadLibraryEx() を利用して DLL を読み込みます。読み込まれる DLL のパスが指定されていない場合、特定のディレクトリ群が順番に探索され、最初に見つかった DLL が読み込まれます。

このディレクトリ群の中には、プロセスのカレントディレクトリが含まれているため、攻撃者が操作できるディレクトリをカレントディレクトリとして LoadLibrary() が呼び出されている場合、攻撃コードが実行される可能性があります。

この問題は、攻撃者が操作できるディレクトリ内に置かれたファイルを閲覧した際に起こる可能性があります。読み込まれる DLL 名はプログラムによって異なります。


 UNIXではユーザのカレントディレクトリではシェルスクリプトはデフォルトでは実行できないようになっている。たとえばカレントにあるhelloというシェルスクリプトを実行するには、

$ hello
ではなく、
$ ./hello


のように、意識的にスクリプトを探すディレクトリにカレントを含めるようにしなければならない。同名のパスの通った外部スクリプトとの実行との混乱を避けるためだろう。


 そもそもWebを介してローカルのプログラムが実行できてしまうことからして問題だが、LANの中では管理のためにしばしば使う手段ではある。ところがもともと攻撃者に操作可能になってしまっているローカルフォルダが存在すれば、そこに不正なDLLファイルを置いて、そこを起点にLAN内部のプログラムになりすまして攻撃可能になるというわけである。


 WIndowsの場合、ウイルス対策上も最もチェックされるのはDLLファイルである。クイックスキャンの時はほとんどウイルスが潜伏したDLLファイルがないかが主にチェックされている。DLLはWindowsの根幹をなす仕組みだけに、深刻な脆弱性があるとすれば、これはWindowsそのものの脆弱性ということになってしまう。少なくてもネットを利用するためのベースにするOSには不向きということになってしまう。


 対策としてはメジャーなWindowsアプリケーションならば、カレントからDLLを読み出さずに必ず指定されたパスから読む出すように修正したパッチを出すか、Windows側が何らかの修正を行って対応してWindowsUpdateくらいで済むようになるかである。ただし対策をし過ぎるとこれまで動いていたDLLがエラーとなり、アプリケーションが動かなくなる事態にもなりかねない。ただでさえ、以前は何かとDLLに関するアプリケーションのトラブルは多く「DLL Hell」といわれていたくらいでもある。Windowsを使い込んでアップデートを繰り返すうちに、起動時に原因不明のDLLエラーが起きたりすることもあった。


 当面はこの脆弱性Microsoftが単にアプリケーション側の問題とするか、Windowsそのものの深刻な脆弱性と受け留めるのかどうかである。