バイナリプランティングをプログラム側から防ぐには、
- リンクするDLLや起動する実行ファイルは可能な限り完全修飾パス名を使用する。
- SetDllDirectoryで""(空文字列)を指定してDLLの検索パスからカレントディレクトリを削除する(Windows XP以降)。
- DLL/実行ファイルを検索するのにSearchPath (ja)はなるべく使用しない。使用するときはSetSearchPathModeでBASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODEを設定する(Windows Vista以降)。
- Windowsの特定のバージョン以降で"Known DLLs"に追加されたDLLをLoadLibraryするときはWindowsのバージョンチェックを行うか、完全修飾パス名を使用する。
ということでSetDllDirectoryを使用してDLLの検索パスからカレントディレクトリを削除するサンプルです。なるべく早い時点で設定するのが望ましいので、プロジェクトファイルの先頭で行います。またSetDllDirectoryはWindows XP SP1以降にしか存在しないので、エントリの存在を確認して呼び出すようにしています。
program Project1; uses Windows, Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} type TSetDllDirectoryFunc = function (lpPathName: PChar): BOOL; stdcall; const {$IFDEF Unicode} CSetDllDirectory = 'SetDllDirectoryW'; {$ELSE} CSetDllDirectory = 'SetDllDirectoryA'; {$ENDIF} var S: String; SetDllDirectory: TSetDllDirectoryFunc; begin @SetDllDirectory := GetProcAddress(GetModuleHandle(kernel32), CSetDllDirectory); if Assigned(SetDllDirectory) = True then begin S := '#0'; SetDllDirectory(PChar(S)); end; Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm1, Form1); Application.Run; end.
なおコンソールアプリケーションでグラスエフェクトを有効にするのサンプルコードもDwmapi.dllがWindows 2000/XPには存在しないことを利用したバイナリプランティングの影響を受けるため、修正してあります。
元ねたは以下の通り。
情報処理推進機構(IPA)マイクロソフト
- マイクロソフト セキュリティ アドバイザリ (2269637): 安全でないライブラリのロードにより、リモートでコードが実行される
- Dynamic-Link Library セキュリティ (Windows)
- Dynamic-Link Library Search Order (Windows)
- WindowsのDLLだけが危ないのか? DLL hijacking vulnerability概説(前編)(1/2)
- WindowsのDLLだけが危ないのか? DLL hijacking vulnerability概説(後編)(1/3)
0 件のコメント:
コメントを投稿