更新日: 2018年04月09日
2016年に入ってから、情報セキュリティ早期警戒パートナーシップに多くの「アプリケーションディレクトリ型」のDLL読み込み問題が報告されています。「アプリケーションディレクトリ型」のDLL読み込みとは、アプリケーション起動時に当該アプリケーションと同一のディレクトリに置かれたDLLファイルが、システムディレクトリにあるDLLファイルよりも優先して読み込まれる問題です。HIRT-PUB17011では、「アプリケーションディレクトリ型」のDLL読み込みの概要と対策について紹介します。
DLL読み込み問題とは、アプリケーションが本来読み込むべきではないDLL/EXEファイルを読み込んでしまう状況が発生することに起因します。カレントディレクトリ型とアプリケーションディレクトリ型の問題が報告されています(表 1)。
表 1: DLL読み込み問題の分類
分類 | 概要 | 対策 |
2010年に報告されたDLL問題・・・カレントディレクトリ型 | データファイルと同一のディレクトリに置かれた(偽の)DLLファイルを、システムディレクトリにある(正規の)DLLファイルよりも優先して読み込んでしまう問題 | カレントディレクトリに置かれた(偽の)DLLファイルを読み込まないように制御する。 |
2016年以降に報告されたDLL問題・・・アプリケーションディレクトリ型 | アプリケーション起動時にアプリケーションと同一のディレクトリに置かれた(偽の)DLLファイルを、システムディレクトリにある(正規の)DLLファイルよりも優先して読み込んでしまう問題 | アプリケーションと同一のディレクトリに置かれた(偽の)DLLファイルを読み込まないように制御する。ただし、アプリケーションだけで制御できない場合もあるため、ユーザ側での対応も必要となる。 |
ファイル共有ディレクトリなどに置かれた文書ファイル(文書.xxx)をクリックすることにより、拡張子xxxに関連付けられた実行ファイルが起動します。この際、文書.xxxと同一のディレクトリ(カレントディレクトリ)に置かれたDLLファイルを、システムディレクトリにある(正規の)DLLファイルよりも優先して読み込んでしまうというものです。
攻撃シナリオとしては、攻撃者はファイル共有ディレクトリなどに文書ファイル(文書.xxx)と(偽の)DLLファイルを置き、ユーザに文書ファイル(文書.xxx)をクリックさせるよう誘導するだけではなく(図 1上段)、文書ファイル(偽のDLLファイルを含む)のダウンロード操作後に同様な問題が発生する可能性があります(図 1下段)。
実行ファイルをクリックし、インストールを開始したり、実行ファイルが提供する機能そのものを開始したりする際に、アプリケーションと同一のディレクトリに置かれたDLLファイルを、システムディレクトリにある(正規の)DLLファイルよりも優先して読み込んでしまうものです。
攻撃シナリオとしては、ファイル共有ディレクトリなどに実行ファイルと(偽の)DLLファイルを置く形態(図 2上段)、実行ファイル(偽のDLLファイルを含む)のダウンロード操作後に同様な問題が発生する可能性があります(図 2下段)。後者の事例としては、zipファイルの中に実行ファイルと(偽の)DLLファイルが同梱されている場合や、ブラウザおよび利用者のダウンロードディレクトリに、(偽の)DLLファイルが混入してしまった場合(あるいは、混入されられてしまった場合)などの条件が整った後、ユーザに実行ファイルをクリックさせるよう誘導するという流れになります。
対策は、アプリケーションと同一のディレクトリに置かれた(偽の)DLLファイルを読み込まないように制御することです。HIRTでは、アプリケーションディレクトリ型DLL問題を7形態に分類して対策可否についての検討を実施しました。その結果、プリケーション側だけで制御できないDLL読み込み問題のあることがわかりました(表 1)。
表 2: アプリケーションディレクトリ型DLL問題対策の分類
分類 | 概要 | 対策1 | 対策2 | 対策3 | ||
アプリケーション側の対策 | ユーザ側の対策 | |||||
アプリケーション起動時にSetDefaultDllDirectories関数やLoadLibraryEx関数、DLL遅延読み込みなどを使用する。 | アプリケーション起動時に実行ファイルを新規に作成したフォルダにコピーしてから実行する。 | 実行ファイルについては、安全な形で実行する。例えば、ユーザ自身が、新規に作成したフォルダに実行ファイルを移動してから実行する。不審なDLLファイルなどがないことを確認した後、実行する。 | ||||
インストール型[*1] | 左記以外[*2] | インストール型[*1] | 左記以外[*2] | |||
#1 [*a] | 直接的に相対パスでリンクしているDLLの読み込み | 〇 | 〇[*3] | 〇 | N/A[**] | ◎ |
#2 [*a] | 間接的に相対パスでリンクしているDLLの読み込み | 〇 | 〇[*3] | 〇 | ||
#3 | DLLフォワーディングによるDLLの読み込み | △[*c] | ||||
#4 | 独自方式でのDLLの読み込み | ×[*b] | ||||
#5 [*a] | アプリケーション互換性機能によるDLLの読み込み | 〇[*d] | ||||
#6 | 動作監視ソフトによるDLLの読み込み | ×[*b] | ||||
#7 | OS互換性機能によるDLLの読み込み | ×[*b][*e] |
◎:ユーザ側で対策可
〇:アプリケーション側での対応可
△:アプリケーション側だけでは対応できない場合がある
×:アプリケーション側だけでは対応不可
N/A:該当しない
*1:インストーラなど、Windowsシステムへのインストール作業を行うアプリケーションが該当する。
*2:自己解凍形式(自己解凍ファイル)など、Windowsシステムへのインストール不要なアプリケーションが該当する。ポータブルアプリケーションなどと呼ばれる場合がある。
*3:資料配布などに利用されている自己解凍形式(自己解凍ファイル)の場合で、対策されていない配布済の自己解凍形式を除く。
*a:アプリケーション側での対策において、特に留意し対策すべき問題
*b:アプリケーション側だけで制御できないDLLの読み込みが発生する場合がある。
*c:OSのバージョンによっては、アプリケーションによっては制御あるいは対応できない場合がある。
*d:実行ファイルのファイル名を変更することで対応可能である。
*e:レジストリ設定でOS互換性機能を有効にした場合が該当する。
**:インストール不要なアプリケーションにおいて、アプリケーション起動時に「実行ファイルを新規に作成したフォルダにコピーしてから実行する。」ことが一般的なアプローチではないため、N/Aとした。
日立製品ならびに、日立が提供する他社品(*印)の対応状況は、次の通りです。
セキュリティ情報 HIRT-PUB17011 を公開しました。
秘文のDLL読み込み問題への対応について 重要度:AA
JP1/秘文で作成した自己復号型機密ファイルのDLL読み込みに関する脆弱性
HIRTでは、製品ベンダIRT(情報や制御システム関連製品を開発する側面でのIRT活動)として、アプリケーション側での対策を推進していきます。あわせて、SIベンダIRT(製品を用いたシステムを構築やサービスを提供する側面でのIRT活動)、社内ユーザIRT(インターネットユーザとして自身の企業情報システムを運用管理していく側面でのIRT活動)として、ユーザ側での対策を推進していきます。
ブラウザなどから、ファイルを[実行]したり(図 3の上段左)、[開く]をクリックしたりすると(図 3の上段右)、ダウンロードディレクトリ(図 3の下段右図)に、それらのファイルが置かれることになります。ここでは、test3.exeを、ブラウザのダイアログから直接[実行]する操作を考えてみます。
1回目の[実行]は、test3.exeをダウンロードディレクトリに置く操作です(図 3の操作1)。2回目の[実行]は、ダウンロードディレクトリに置かれたtest3.exeを起動する操作です(図 3の操作2)。このような状況下においては、test3.exeは、意識せずにダウンロードしていたDLLファイル(ここでは、事前にダミーで用意したbcrypt.dll)を読み込んでしまう、すなわち、意図しないDLLを読み込んでしまうことになります(図 4)。
図 3:ダウンロードディレクトリに(偽の)DLLファイルが混入してしまう状況とは
図 4:test3.exeが意図しないDLLを読み込んでしまう
ブラウザ操作で直接[実行][開く]をしていないユーザであっても、実行ファイルがインストール型か/否か、実行ファイルが対策済か/否かをユーザ側で判定することは難しいという状況は変わりません。ユーザ側での推奨対策は、次の通りです。
test3.exeが意図しないDLLを読み込んでしまう
ダウンロードディレクトリに置かれたtest3.exeが、同じダウンロードディレクトリに置かれたbcrypt.dllを読み込んでしまい、エラーのダイアログを表示するまでの流れを図 5に示します。
担当:寺田、大西
グローバルサイン:
重要な電子文書にデジタル署名。広報にも役立っています