Delphi RTLからExternal句で静的リンクしているDLLの脆弱性
問題
DelphiのRTLでは、External句を使用してWindowsのsystemのdllを読み込んでいる箇所があります。
例えば、Winapi.Nb30.pasでは以下のコードのように、netapi32.dllをロードしています。
unit Winapi.Nb30;
..
..
implementation
function Netbios; external 'netapi32.dll' name 'Netbios';
end.
external句ではファイルパスを指定していないため、そのコンポーネントを使用したプログラムは配置したフォルダ上にsystemのdllと同名のdllを配置されると、以下の事例のような脆弱性が考えられます。
https://jvndb.jvn.jp/ja/contents/2010/JVNDB-2010-001999.html
Delphi RTLから静的リンクされているDLLに関して上記の脆弱性に該当するのでしょうか?
もし該当する場合は、どのような方法で回避すべきでしょうか?
解説
Delphi RTLのソース(例えば、Winapi.Nb30ユニット)のexternal句で、絶対パスを指定せずにnetapi32.dllを参照していますが、これはWindows OSの仕様です。
そのためDelphi/C++BuilderのRTL側で、従来のコードの修正は基本的に行いません。
なお、Windows10以降、マイクロソフトではWindowsシステムにいくつかの保護機能を導入しています。
- DLLホワイトリスト ( KnownDLLs ) いくつかの重要なカーネルDLLはSystem32からしかロードできません。
- Windows 1703以降、マイクロソフトは最初にSystem32からDLLを強制的にロードするPreferSystem32ポリシーを導入しました。 DLLをKnownDLLsレジストリに追加するためには、ユーザーはUACを回避しなければなりません。エンドユーザーにはお勧めできません。
そのため基本的に上記の2つ目の項目、つまりPreferSystem32を使うのがベストな選択となります。
管理者権限でPowerShellを起動し、
> Set-ProcessMitigation -Name <アプリケーション名> -Enable PreferSystem32
※<アプリケーション名>は、フルパス名(c\test\ GUI.exeなど)または実行可能ファイルの本体名(Project123.exeなど)
と指定すれば、指定したプロセスに対し、全ての DLL 読み込み順序を System32 を最優先にすることができます。
また、次のコマンドは、再起動後にシステム全体の動作を変更します。
> Set-ProcessMitigation -System -Enable PreferSystem32
次にマイクロソフトは、Windows 10以前のOSに存在する「アプリケーションディレクトリへのDLL植え込み(プランティング)」の脆弱性を修正しないことを決定しました。
https://jvn.jp/jp/JVN69181574/を参照してください。
そのため、すべてのWindows OSで問題を修正することはできません。
そしてWindows 10 (バージョン 1703)以降、マイクロソフトはDLLの読み込み順序に新しい緩和ポリシーを導入しました。
ほとんどの「DLLプランティング」の脆弱性は、実行時のLoadLibraryAPIによる動的ロードに関連しています。
通常、悪意のあるアプリケーションが現在のディレクトリを移動する可能性があり、ターゲットアプリケーションが予期しないディレクトリからDLLをロードする可能性があります。
アプリケーションバイナリのインポートセクションは、NTカーネル内のWindowsプロセスローダーによって使用されます。 この場合、現在のディレクトリはアプリケーションのディレクトリから移動しません。
インストーラーがアプリケーションをインストールする場合、通常、アプリケーションフォルダーは標準ユーザーが変更することはできません。
したがって、この「DLLプランティング」の脆弱性は、アプリケーションに静的にリンクされているDLLにとって実際の脅威ではありません。
詳しくは、以下のドキュメントを参照ください。
マイクロソフトの公式ブログ
https://msrc-blog.microsoft.com/2018/04/04/triaging-a-dll-planting-vulnerability/
併せてこちらも参照ください。
https://jvn.jp/jp/JVN69181574/
https://msrc-blog.microsoft.com/2018/04/10/triaging-a-dll-planting-vulnerability-2/
以上のように、本件はプログラム側で対処できない場合は、Windowsの設定や起動パラメーターの変更などが必要です。