dllとは
dllファイルはDynaminc Link Libraryの略で、単体で実行することはできず、exe等のプログラム実行時にリンクされ、メモリ上に展開されることで利用されます。
dllファイルには多くのプログラムが共通して必要とする機能が収められています。
dllファイルとセキュリティ
dllに関連した攻撃として「dllハイジャッキング」があります。
DLL乗っ取りとはOSのプログラム実行順序を不正に操作し、正規のDLLではなく不正なDLLを実行させる攻撃手法のことです。
WindowsのDLLとは、プログラムのコンパイル時にリンクするのではなく、プログラムの実行時に同時にロードされるライブラリです。
DLLをロードする場合、どのディレクトリに目的のDLLが存在するか検索します。
見つかったDLLをロードしますが、このDLLを検索する順序を不正に操作し不正なDLLをロードさせること攻撃を"DLLハイジャッキング"と呼びます。
dllに関しては、各セキュリティベンダでも注意が必要なファイルとされています。
トレンドマイクロのサイト
ショートカットファイル(.LNK)やスクリプトファイル(.VBS, .JS)などは「実ファイルタイプ | 実際のファイルタイプ」フィルタでは設定できませんが、添付ファイルの「名前または拡張子」フィルタを使用して、拡張子を検出することができます。不正プログラムでは次のような拡張子がよく使用されるため、「検索するファイル拡張子 (推奨) | ブロックが推奨されるファイル拡張子」リストの中でも特に検出を有効にすることを推奨します。
.BAT
.CHM
.CMD
.COM
.DLL
.EXE
.HTA
.JS or .JSE
.LNK
.PIF
.OCX
.SCR
.SYS
.VBS
.VBE
CISAによるEmotetに対する注意喚起
CISAでは、あわせて「Emotet」の影響を緩和する施策の実施を推奨。具体的には、実行ファイル「.exe」やライブラリファイル「.dll」のメール添付ファイルをブロックすることにくわえ、パスワードが設定されたzipファイルなど、セキュリティ対策ソフトでスキャンできないメールの添付ファイルについてもブロックすることをベストプラクティスに挙げた。
【セキュリティ ニュース】「Emotet」対策でパスワード付きzip添付ファイルのブロックを推奨 - 米政府(2ページ目 / 全3ページ):Security NEXT
ZScalerの資料
https://www.idaten.ne.jp/portal/page/out/dsf2/C1187_maker.pdf
参考:dllの読み込みの順番
プログラムがdllを参照する際の検索順序はMicrosoftのサイトに記載があります。
- アプリケーションのロード元となったディレクトリ
- カレントディレクトリ
- システムディレクトリ。通常はC:\Windows\System32\(このディレクトリは、GetSystemDirectory関数を呼び出して取得)
- 16ビットシステムディレクトリ(このディレクトリパスを取得する専用の関数はありませんが、検索は実行される)
- Windowsディレクトリ(GetWindowsDirector関数を呼び出して取得)
- PATH環境変数で指定されているディレクトリ
※プログラムがカレントディレクトリからdllをロードしようとする際にプログラムに脆弱性があると、dllハイジャッキングが可能となります。
実際にdllファイルを使ってみる
dllについてわかってきたところで、実際にdllを作成してほかのプログラムから使用するということをやってみます。
概要
今回はVisual Studioでdllを作成し、作成したdllをVBAで呼び出してみることをやります。
dllの内容は引数に渡された文字列を「Hello」というメッセージの後に連結するものです。
※dllの作成とVBAの実行は別のPCで行いました。
dllの作成(Visual Studio)
Visual Studioを起動し、新しいプロジェクトを作成します。
テンプレートは「クラスライブラリ(.Net Framework)」を選択します。
プロジェクトが作成された後、プロパティの画面より「COM相互運用機能の登録」にチェックを入れます。
コードは以下の内容を入力しました。
dllのコード
Imports System
Namespace MyClass1
Public Class MyClass1
Public Function Hello(ByVal sName As String) As String
Return "Hello!! " & sName
End Function
End Class
End Namespace
コードを入力後、「Release」を選択して実行します。
その後、作成されたdllファイルを別PCにコピーします。
VBAでdllを読み込む(別PCでの操作)
作成したdllをVBAより呼び出します。先ほどとは別のPCで操作を行います。
dllはCOMコンポーネント(Component Object Model)と呼ばれるものの一つで、dllを利用する場合はレジストリへの登録が必要な場合があります。
まずはレジストリへの登録を行います。RegAsm.exeというツールを使用して登録を行います。
コマンドの実行例
c:\Windows\Microsoft.NET\Framework\v4.0.30319>RegAsm.exe C:\test3.dll /tlb /codebase
Microsoft .NET Framework Assembly Registration Utility 4.8.4084.0
for Microsoft .NET Framework Version 4.8.4084.0
Copyright (C) Microsoft Corporation. All rights reserved.RegAsm : warning RA0000 : 署名されていないアセンブリを /codebase を使用して登録すると、同じコンピューターにインストール されるその他のアプリケーションとの競合が生じる可能性があります。/codebase スイッチは署名されたアセンブリのみに使用できます。アセンブリに厳密な名前を付けて、再登録してください。
型は正常に登録されました。
アセンブリは 'C:\test3.tlb' にエクスポートされ、タイプ ライブラリは正常に登録されました。
補足:追加したレジストリの削除について
以下のコマンドにより、レジストリの登録は解除できるという情報を見ました。
コマンドの実行例
c:\Windows\Microsoft.NET\Framework\v4.0.30319>RegAsm.exe /u c:\test3.dll
※自分の環境ではレジストリが削除されなかったので「regedit」より「test3」(作成したdllの名前)というキーワード検索で使用後に削除しました。
VBAを開き、「ツール」-「参照設定」より、作成したdllを選択します。
以下のコードを入力し、実行するとdllが読み込まれて実行されます。
VBAのコード
Option Explicit
Sub test()
Dim objMyClass As New test3.MyClass1
MsgBox objMyClass.Hello("iestudy")
End Sub
参考にさせていただいたサイト
archives2011-2018.fortinet.co.jp