lufeの備忘録

学んだことをてきとーに。

Application Shimmingって何ぞや。

気になって夜しか眠れなかったので自分の備忘録として残しておく。

Application Shimとは

Microsoft Windows Application Compatibility Infrastructure/Framework (アプリケーションシム)は、コードを書き換えることなく、古いOSのアプリケーションに修正プログラムを適用させ、新しいOSで動作することができるようにできる。そのためアプリケーションの挙動をどのように行うかをOSに伝えることができるのがShimの特徴。
※例:WindowsXP用に開発されたアプリケーションをWindows10で動作させる。
シムがない状態の場合、以下の図のようにアプリケーションがWindowsと直接やり取りをする。 f:id:lufe:20211204022444p:plain

シムを用いると以下の図のようにアプリケーションはWindowsとの直接やり取りをやめ、間にはいり、シムに書かれているコードによってWindowsに対してリクエストを投げたり、レスポンスを得るといった挙動をする。 f:id:lufe:20211204022724p:plain

これはリンクの性質を利用してWindowsからAPIコールを代替コードであるShimにリダイレクトする。以下の図のように外部バイナリファイルへの呼び出しはImport Address Tableと呼ばれるAPIエンドポイントへのアドレスが記載されているルックアップテーブルを介して行う。 f:id:lufe:20211204025925p:plain

シムを用いることで以下の図のようにインポートテーブルで解決されたWindows関数のアドレスを修正し、それを代替シムコード内の関数へのポインタに置き換えることができる。 f:id:lufe:20211204030114p:plain

Import Tableからのリダイレクトはアプリケーションのロード時に静的にリンクされた.dllファイルに対して行う。GetProcAddress APIをフックすることで、動的にリンクされた.dllファイルをシム化することも可能。 実際にプログラムが実行されると、シムキャッシュが参照され、プログラムがシムデータベースを使用するか確認される。

以上のように簡単に言えばApllicationを実行する際に、Windowsのバージョンを関係なしにすることができるということである。

Application Shimming Attack

上記に説明したApplication ShimのAPIをフックする対象を変更することでマルウェアの永続化や任意コード実行、権限昇格等ができるようになる。
しかし、バイナリを読み込む際にシムエンジンを実行して適切な修正プログラムを適用するためにシムデータベースと呼ばれるものをチェックする。 マルウェアの攻撃の一般的なアプローチは単純にsdbinst.exeを実行して悪意あるsdbファイルを指定する方法がある。

通常はシムはユーザモードで実行するように設計されており、不正なシムを任意にインストールできないように管理者権限を必要とするが、特定のシムを利用するとアカウント制御のバイパスやDLL injection、Disable NX, SEHやメモリアドレスの閲覧が可能になる。

参考文献
https://attack.mitre.org/techniques/T1546/011/
https://techcommunity.microsoft.com/t5/ask-the-performance-team/demystifying-shims-or-using-the-app-compat-toolkit-to-make-your/ba-p/374947
https://www.elastic.co/jp/blog/ten-process-injection-techniques-technical-survey-common-and-trending-process