更新日: 2018年04月09日
2016年に入ってから、情報セキュリティ早期警戒パートナーシップに多くの「アプリケーションディレクトリ型」のDLL読み込み問題が報告されています。「アプリケーションディレクトリ型」のDLL読み込みとは、アプリケーション起動時に当該アプリケーションと同一のディレクトリに置かれたDLLファイルが、システムディレクトリにあるDLLファイルよりも優先して読み込まれる問題です。HIRT-PUB17011では、「アプリケーションディレクトリ型」のDLL読み込みの概要と対策について紹介します。
1. DLL読み込み問題とは
DLL読み込み問題とは、アプリケーションが本来読み込むべきではないDLL/EXEファイルを読み込んでしまう状況が発生することに起因します。カレントディレクトリ型とアプリケーションディレクトリ型の問題が報告されています(表 1)。
表 1: DLL読み込み問題の分類
| 分類 | 概要 | 対策 |
| 2010年に報告されたDLL問題・・・カレントディレクトリ型 | データファイルと同一のディレクトリに置かれた(偽の)DLLファイルを、システムディレクトリにある(正規の)DLLファイルよりも優先して読み込んでしまう問題 | カレントディレクトリに置かれた(偽の)DLLファイルを読み込まないように制御する。 |
| 2016年以降に報告されたDLL問題・・・アプリケーションディレクトリ型 | アプリケーション起動時にアプリケーションと同一のディレクトリに置かれた(偽の)DLLファイルを、システムディレクトリにある(正規の)DLLファイルよりも優先して読み込んでしまう問題 | アプリケーションと同一のディレクトリに置かれた(偽の)DLLファイルを読み込まないように制御する。ただし、アプリケーションだけで制御できない場合もあるため、ユーザ側での対応も必要となる。 |
1.1 カレントディレクトリ型
ファイル共有ディレクトリなどに置かれた文書ファイル(文書.xxx)をクリックすることにより、拡張子xxxに関連付けられた実行ファイルが起動します。この際、文書.xxxと同一のディレクトリ(カレントディレクトリ)に置かれたDLLファイルを、システムディレクトリにある(正規の)DLLファイルよりも優先して読み込んでしまうというものです。
攻撃シナリオとしては、攻撃者はファイル共有ディレクトリなどに文書ファイル(文書.xxx)と(偽の)DLLファイルを置き、ユーザに文書ファイル(文書.xxx)をクリックさせるよう誘導するだけではなく(図 1上段)、文書ファイル(偽のDLLファイルを含む)のダウンロード操作後に同様な問題が発生する可能性があります(図 1下段)。
図 1:カレントディレクトリ型
1.2 アプリケーションディレクトリ型
実行ファイルをクリックし、インストールを開始したり、実行ファイルが提供する機能そのものを開始したりする際に、アプリケーションと同一のディレクトリに置かれたDLLファイルを、システムディレクトリにある(正規の)DLLファイルよりも優先して読み込んでしまうものです。
攻撃シナリオとしては、ファイル共有ディレクトリなどに実行ファイルと(偽の)DLLファイルを置く形態(図 2上段)、実行ファイル(偽のDLLファイルを含む)のダウンロード操作後に同様な問題が発生する可能性があります(図 2下段)。後者の事例としては、zipファイルの中に実行ファイルと(偽の)DLLファイルが同梱されている場合や、ブラウザおよび利用者のダウンロードディレクトリに、(偽の)DLLファイルが混入してしまった場合(あるいは、混入されられてしまった場合)などの条件が整った後、ユーザに実行ファイルをクリックさせるよう誘導するという流れになります。
図 2:アプリケーションディレクトリ型
2. アプリケーションディレクトリ型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:該当しない
3. 製品対応状況
日立製品ならびに、日立が提供する他社品(*印)の対応状況は、次の通りです。
2017年09月29日
セキュリティ情報 HIRT-PUB17011 を公開しました。
秘文のDLL読み込み問題への対応について 重要度:AA
JP1/秘文で作成した自己復号型機密ファイルのDLL読み込みに関する脆弱性
4. ユーザが行うべき対策
HIRTでは、製品ベンダIRT(情報や制御システム関連製品を開発する側面でのIRT活動)として、アプリケーション側での対策を推進していきます。あわせて、SIベンダIRT(製品を用いたシステムを構築やサービスを提供する側面でのIRT活動)、社内ユーザIRT(インターネットユーザとして自身の企業情報システムを運用管理していく側面でのIRT活動)として、ユーザ側での対策を推進していきます。
4.1 ブラウザから直接[実行][開く]をしていませんか?
ブラウザなどから、ファイルを[実行]したり(図 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を読み込んでしまう
4.2 ユーザ側での対策
ブラウザ操作で直接[実行][開く]をしていないユーザであっても、実行ファイルがインストール型か/否か、実行ファイルが対策済か/否かをユーザ側で判定することは難しいという状況は変わりません。ユーザ側での推奨対策は、次の通りです。
5. 参考情報
5.1 カレントディレクトリ型
JVNVU#707943: WindowsプログラムのDLL読み込みに脆弱性 (2010年08月26日)
https://jvn.jp/vu/JVNVU707943/
制御されていない検索パス問題(CWE-427): CWE-427: Uncontrolled Search Path Element
https://cwe.mitre.org/data/definitions/427.html
IPA
任意のDLL/実行ファイル読み込みに関する脆弱性の注意喚起 (2010年11月11日)
https://www.ipa.go.jp/about/press/20101111.html
5.2 アプリケーションディレクトリ型
JVNTA#91240916: WindowsアプリケーションによるDLL読み込みやコマンド実行に関する問題 (2017年05月25日)
https://jvn.jp/ta/JVNTA91240916/
セキュアなソフトウェアをつくるために......DLL読み込みの問題を読み解く (2017年08月05日)
https://www.slideshare.net/jpcert_securecoding/dll-78581339
IPA
【注意喚起】Windowsアプリケーションの利用における注意 (2017年09月28日)
https://www.ipa.go.jp/security/ciadr/vul/20170928_dll.html
JVN#94056834: 秘文 機密ファイルビューアのインストーラにおける DLL 読み込みおよび実行ファイル呼び出しに関する脆弱性 (2017年10月11日)
JVN#55516206: 秘文 機密ファイル復号プログラムにおける DLL 読み込みに関する脆弱性 (2017年10月11日)
JVN#58909026: 秘文 機密ファイル復号プログラムにおける DLL 読み込みに関する脆弱性 (2017年10月11日)
test3.exeが意図しないDLLを読み込んでしまう
ダウンロードディレクトリに置かれたtest3.exeが、同じダウンロードディレクトリに置かれたbcrypt.dllを読み込んでしまい、エラーのダイアログを表示するまでの流れを図 5に示します。
図 5:test3.exeが意図しないDLLを読み込んでしまう
6. 更新履歴
2018年04月09日
2017年10月12日
2017年09月29日
2017年09月27日
担当:寺田、大西