Delphi RTLからExternal句で静的リンクしているDLLの脆弱性

提供: Support
移動先: 案内検索

問題

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システムにいくつかの保護機能を導入しています。

  1. DLLホワイトリスト ( KnownDLLs ) いくつかの重要なカーネルDLLはSystem32からしかロードできません。
  2. Windows 1703以降、マイクロソフトは最初にSystem32からDLLを強制的にロードするPreferSystem32ポリシーを導入しました。 DLLをKnownDLLsレジストリに追加するためには、ユーザーはUACを回避しなければなりません。エンドユーザーにはお勧めできません。


そのため基本的に上記の2つ目の項目、つまりPreferSystem32を使うのがベストな選択となります。 管理者権限でPowerShellを起動し、

> Set-ProcessMitigation -Name <アプリケーション名> -Enable PreferSystem32

※<アプリケーション名>は、フルパス名(c\test\ GUI.exeなど)または実行可能ファイルの本体名(Project123.exeなど)


と指定すれば、指定したプロセスに対し、全ての DLL 読み込み順序を System32 を最優先にすることができます。

https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-process_mitigation_image_load_policy


また、次のコマンドは、再起動後にシステム全体の動作を変更します。

> 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の設定や起動パラメーターの変更などが必要です。