「JpnIHDS.dat」ファイルフォーマットの解析及びパーサの紹介
.header
最近行ったペネトレーションテストで、侵入したマシンから可能な限り多くの情報を取得すべく時間をかけて調査しました。そこで、ユーザのキーボード入力履歴を大量に保存したシステムファイルを発見しました。この挙動はコンピュータ使用者に対して隠匿されたものではありません(GUIで無効にするオプションがあります)し、履歴が利用者のコンピュータ外に漏洩しているということでもありませんが、プライバシー観点でリスクがある仕様と考えられることがあるかもしれません。また、ペネトレーションテスターにとっては注目すべきファイルと言えます。
本稿では対象ファイルのパーサを紹介するとともに、利用者自身が記録を無効化する方法を紹介します。
.text
日本語環境のWindows PCを使用している場合、デフォルトの日本語入力システムはMicrosoft IMEです。
漢字の入力方法は複数ありますが、一般的にはローマ字入力が主流と思います。アルファベットで日本語の読みを入力すると、どの漢字に変換するかシステムが推測します(図1の例)。
図 1. IMEの候補例
IMEは過去にどのような漢字を選択したかを記憶しており、最も選択頻度の高い候補がリストの一番上に表示されるようになります。これは仕様として想定される動作であり、これを制御するための設定があります。
図 2. 予測入力の設定
[StackOverflow] に、この入力履歴をプログラムで消去する方法についての質問と回答が既にありました。しかし、このファイルの内容についての記載がなかなか見当たらず、自分で見てみました。
入力履歴ファイルのパス:
%UserProfile%\AppData\Roaming\Microsoft\InputMethod\Shared\JpnIHDS.dat |
このファイルにMS-IMEの最近の変換履歴に関する情報が含まれています。
読み方(ひらがな、カタカナ、ローマ字)から漢字への一般的なマッピングが含まれていると予測していたのですが、ユーザが日本語入力モードで入力した全てのテキストがタイムスタンプ付きで記録されていました。そのため、もし外部からの攻撃者がマルウェア等で対象 OS へユーザとしてアクセスできるようになった場合、このファイルを閲覧することによって、重要情報が取得される可能性があります。
ただし繰り返しになりますが、何らかの理由でコンピュータに侵入されない限りは入力履歴が外部に漏洩している訳ではなく、予測変換のためのデータをコンピュータ内に保持していることは現在ではスマートフォンなども含めて多くのOSでの一般的な挙動と言え、Windowsに特有の問題点が存在するという意図ではありません。
このファイルのフォーマットは非常にシンプルで、タイムスタンプに変換マッピングのブロックが紐付いています。
これは以下のようにパースすることができます。
図3. マッピングの表示
マッピングに興味がなければ、可読性の高い文に変換できます。
図4. チャットログのような表示
IMEを使ってテキストを入力するたびに、システムはタイムスタンプ、入力されたテキスト、ユーザーが選択した変換をセットで記録しているようです。
興味深いことに、ユーザが漢字に変換した部分だけでなく日本語入力モードで入力した文章全体を記憶するため、このログを極めて価値のあるログにしています。ほぼチャットログを見ているような内容です。
このファイルの内容を他のコンピュータでも確認したところ、数年前の入力履歴を抽出できた端末もありました。ただし、ファイルサイズの上限が512KBに制限されているようで、変換が多いコンピュータでは古い履歴が削除され最近入力したテキストしか残っていないことを確認しました。なお日本語入力だけでなく、「日本語入力モード(ひらがな・カタカナ)」(図5)で入力された英文も記録されています。※例:Shiftキーを押しながら英文を入力する場合など
図5. 日本語入力モード(上の場合、保管される)、英語入力(下の場合、保管されない)
このファイルの構造はとてもシンプルです。ファイルの最終更新時のタイムスタンプと文のレコード数(変換を始める前に入力したテキストと考えてください)を持つヘッダから始まります。
それぞれの文は、ユーザが入力した単語と変換結果の単語のペアに分かれています。
ファイルの最後には、より多くのレコードが入っているように見えるスペースがあります。単純なロジックで抽出することができます(Timestampフィールドのタイムスパンを想定するため無効なレコードはフィルタリングされていますが、UTF-16leデコード後のパースされていないスペースも表示しているため、データが欠落することはありません)。
このファイルの作成・更新に関連するコードに興味がある方は、以下のライブラリをチェックしてみてください。
C:\Windows\System32\IME\IMEJP\IMJPPRED.DLL |
.file_structures
書式が非常にシンプルなので、コードをリバースするのではなく、見た内容を元に整理しました。以下にまとめます。
図6. ファイルフォーマット図
.bof_module
MS-IMEとこの機能(予測変換と履歴保持)は日本語版Windowsではデフォルトで有効になっています。ペンテスターがこのファイルからユーザの最後の入力内容をすぐに確認できるように「Cobalt Strike」フレームワーク用のシンプルなBOF方式パーサを書きました。
※本パーサを許可なく他者のコンピュータ上のファイルに対して使用することは、そのための侵入行為等を含めて、不正アクセス禁止法に触れる犯罪行為となる可能性があります。絶対に行わないでください。
パーサの引数として JpnIHDS.dat ファイルのパスを指定できます。デフォルトでは、BOFはユーザのカレントディレクトリからファイルを読み込もうとします。
このBOFを以下のようにコンパイルしてください。
VisualStudio: cl.exe /c /GS- /TP BOF_read_jpn_pred.c /Foread_jpn_pred.o
MinGW: x86_64-w64-mingw32-gcc -c BOF_read_jpn_pred.cpp -o read_jpn_pred.o |
図7. パーサの実行結果
.mitigation
前述の通り、ユーザは予測変換機能を無効化することができます。GUIによる設定はレジストリキーに保存されています。
必要に応じて強制的に無効にすることもできますが、予測変換できなくなるため、利便性とのトレードオフになります。
[HKEY_CURRENT_USER\Software\Microsoft\IME\15.0\IMEJP\MSIME]
"PredictionUseInputHistory"=dword:00000000 |