MENU

ファイル名にRLOが使われていたらRecentのLNKファイルもRLO表記になるの?

目次

はじめに

Microsoft Defender for Endpoint(MDE)でRLOに関連する検知が発生した際、RecentのLNKファイルにもRLOを含むファイル名がログ上で確認された事例があると聞き、今回の検証を実施。

検証の目的

セキュリティ製品上のログ分析において、RLOを含むファイル名やLNKファイル名がどのように表示される可能性があるのか確認したい。

セキュリティ製品上でのログ分析における懸念事項

セキュリティ製品によって収集するログや表示するフィールドが異なるため、アラート上に表示されるファイル名がWindows上のどの情報を基にしているのか判断しにくい。

懸念事項を解消するために検証をする

複数の条件で検証し、エクスプローラー上の表示、実際のUnicode文字列、LNKのメタデータがそれぞれどのように見えるか確認する。

実行環境と使用ツール

実行環境

エディション:Windows 11 Home
バージョン:25H2
OSビルド:26200.9168

使用ツール

LECmd

Windowsのショートカットファイルを解析するための無料のコマンドラインツール。

前提知識

RLO(Right-to-Left Override)とは

Unicode制御文字の一種で、RLOを挿入した位置から文字の表示方向を右から左へ強制的に変更するために使用される。本来はアラビア語など右から左へ読む言語を含む双方向テキストを扱うための仕組みの一つだが、ファイル名の表示順を変化させることで拡張子偽装などに悪用されることがある。
対になる制御文字として、左から右方向に上書きするLRO(Left-to-Right Override / U+202D)がある。

例.)
通常の表示例
sample.txt
RLOによって表示順が反転した場合の例
txt.elpmas

RLOがどのように悪用されるのか

文字列そのものを書き換えるのではなく、表示時の文字方向を上書きできるため、ファイル名の視覚的な偽装に悪用されることがある。

例. batファイルをPDFに偽装

  1. サンプルファイルを用意
@echo off
echo ==============================
echo WARNING: TEST FILE EXECUTED
echo ==============================
echo.
echo This is an RLO test file.
echo.
pause

2. サンプルファイル名をRLOで「fdp.bat」とする

 F2(名前を変更)→ 右クリック → Unicode制御文字の挿入 → RLOを選択

batファイルをPDFに偽装.png

 → ファイル名「fdp.bat」と入力すると「tab.pdf」と表示される

「fdp.bat」

3. 「tab.pdf」を実行すると、batファイルが起動する

実行結果

4. 項番2の手順で簡単な偽装は完成。今回のサンプルではアイコンや種類を見ればbatファイルと気づけるが、実際の攻撃では他の手法と組み合わせて高度な偽装がされることがある。

5. おまけ

今回の検証では、少し時間差があったもののMicrosoft Defenderによってサンプルファイルが検知・検疫された。検証を行う際は、セキュリティ製品によって検知される可能性がある点にも注意。

Defender検知画面

RecentのLNKファイル

Recentフォルダとは

ユーザーが最近開いたファイルやフォルダのショートカットを自動的に保存するシステムフォルダ。
フォルダパス:C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Recent
※C: は環境依存。

LNKファイルとは

Windowsで使用されるショートカットファイル。リンク先のファイル本体を格納するのではなく、リンク先を特定・参照するための情報や各種メタデータを保持している。

RecentのLNKファイル

ユーザーが最近開いたファイルやフォルダのショートカット。Windowsが自動的に作成し、「最近使った項目」や「クイックアクセス」などに表示させるための履歴として使われる。

検証

ファイル名にRLOが含まれている場合のLNKファイル情報確認

1. テストファイル「xslx.tset」(RLO適用後の表示)を作成し、開いておく。

        2. Recentフォルダへ移動し、テストエクセルのショートカットが作成されていることを確認。エクスプローラー上ではRLOによる表示順の変化がLNKファイル名にも引き継がれている。

        xslx.tset

        3. PowerShellでLNKファイル名にRLOのコードポイントが入っているか確認。U+202E(RLOのコードポイント)が含まれているので、LNKファイル名のUnicode文字列にRLOが含まれていることをコマンド上からも確認できた。

        > $file = Get-ChildItem | Where-Object { $_.Extension -eq ".lnk" -and $_.Name -like "*test.xlsx*" } | Select-Object -First 1
        > $file.Name.ToCharArray() | ForEach-Object {
        >>     "U+{0:X4}  {1}" -f [int]$_, $_
        >> }
        U+202E  ‮
        U+0074  t
        U+0065  e
        U+0073  s
        U+0074  t
        U+002E  .
        U+0078  x
        U+006C  l
        U+0073  s
        U+0078  x
        U+002E  .
        U+006C  l
        U+006E  n
        U+006B  k

        4. LECmdでメタ情報確認。

        実行コード

        LECmd.exe -f "E:\test.xlsx.lnk"

        結果(一部抜粋)

            --------- Block 0 (Beef0004) ---------
            Long name: ?test.xlsx
            Created:     2026-08-15 09:34:06
            Last access: 2026-08-15 09:34:08
            MFT entry/sequence #: 463271/4 (0x711A7/0x4)

        5. 項番4の結果から以下の情報が分かる。

        ①Long name: ?test.xlsx について

        ・「?」の部分がRLOに相当する位置と思われる。ただし、LECmdによる解析またはコンソールへの出力過程で「?」と表示されている可能性もあるため、この結果のみからLNK内部でU+202Eが「?」に置換されて保存されているとは判断できない。

        ・RLOを挿入した位置は「?」と表示され、それ以降のファイル名は 「test.xlsx」 と論理順で確認できた。エクスプローラー上のRLOによる視覚的な表示とは異なる結果となった。

        ②MFT entry/sequence #: 463271/4 (0x711A7/0x4)

        ・今回は検証しないが、LECmdの解析結果からMFTエントリ番号とシーケンス番号を取得できているため、MFTECmdなどを用いて $MFT を解析し、対象ファイルのMFTレコードと照合することで、さらに調査を深掘りできそう。

        本文にRLOが含まれている場合のLNKファイル情報確認

        1. テストファイル「test2.xlsx」を作成し、ファイル内にRLOを含む文字を入力。

          テストファイル「test2.xlsx」

          2. Recentフォルダへ移動し、テストエクセルのショートカットが作成されていることを確認。エクスプローラー上では通常の左から右の順序で表示されている。

          test2.xlsx

          3. PowerShellでLNKファイル名にRLOのコードポイントが入っていないことを確認。U+202E(RLOのコードポイント)が含まれていないので、LNKファイル名のUnicode文字列にRLOが含まれていないことをコマンド上からも確認できた。

          > $file = Get-ChildItem | Where-Object {
          >>     $_.Extension -eq ".lnk" -and $_.Name -like "*test2.xlsx*"
          >> } | Select-Object -First 1
          > $file.Name.ToCharArray() | ForEach-Object {
          >>       "U+{0:X4}  {1}" -f [int]$_, $_
          >>   }
          U+0074  t
          U+0065  e
          U+0073  s
          U+0074  t
          U+0032  2
          U+002E  .
          U+0078  x
          U+006C  l
          U+0073  s
          U+0078  x
          U+002E  .
          U+006C  l
          U+006E  n
          U+006B  k

          4. ファイル内の文字列にRLOが含まれていることを確認。

          4-1. test2.xlsx の拡張子を変更し、test2.zip とする。

          zipへ変更

          4-2. zipファイルを展開し、test2\xl\sharedStrings.xml のコードを確認。ブログ上の表示では分かりにくいが、このコードの線を引いた部分にはRLOが含まれており、エディタ上でカーソルを移動させると文字方向の変化も確認できた。

          <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="1" uniqueCount="1">
          <si>
          <r>
          <rPr>
          <sz val="11"/>
          <color theme="1"/>
          <rFont val="Arial"/>
          <family val="2"/>
          <charset val="178"/>
          </rPr>
          <t>‮</t>
          </r>
          <r>
          <rPr>
          <sz val="11"/>
          <color theme="1"/>
          <rFont val="Calibri"/>
          <family val="2"/>
          <charset val="178"/>
          </rPr>
          <t>test.xlsx</t>
          </r>
          <phoneticPr fontId="1"/>
          </si>
          </sst>

          4-3. PowerShellでも確認。Trueが返ってくるので、RLOが含まれている。

          > Get-ChildItem sharedStrings.xml
          > $text = Get-Content ".\sharedStrings.xml" -Raw -Encoding UTF8
          > $text.Contains([char]0x202E)
          True

          5. LECmdでメタ情報確認。

          実行コード

          LECmd.exe -f "E:\test2.xlsx.lnk"

          結果(一部抜粋)

              --------- Block 0 (Beef0004) ---------
              Long name: test2.xlsx
              Created:     2026-08-15 12:41:26
              Last access: 2026-08-15 12:41:26
              MFT entry/sequence #: 463313/4 (0x711D1/0x4)

          6. 本文にRLOが含まれていても、Recentに生成されたLNKファイル名への影響は確認できなかった。また、LECmdのLong nameにもRLOに相当する表示は確認されなかった。

          ファイル名にRLOを含むファイルをコピー後、RLOを削除してリネームした場合のLNKファイル情報確認

          1. ファイル名にRLOを含むファイル「xslx.tset」(RLO適用後の表示)をコピーし、「test3.xlsx」にリネーム後開いておく。

          2. Recentフォルダへ移動し、テストエクセルのショートカットが作成されていることを確認。エクスプローラー上では通常の左から右の順序で表示されている。

          test3.xlsx

          3. PowerShellでLNKファイル名にRLOのコードポイントが入っていないことを確認。U+202E(RLOのコードポイント)が含まれていないので、LNKファイル名のUnicode文字列にRLOが含まれていないことをコマンド上からも確認できた。

          > $file = Get-ChildItem | Where-Object {
          >>      $_.Extension -eq ".lnk" -and $_.Name -like "*test3.xlsx*"
          >>  } | Select-Object -First 1
          >  $file.Name.ToCharArray() | ForEach-Object {
          >>        "U+{0:X4}  {1}" -f [int]$_, $_
          >>    }
          U+0074  t
          U+0065  e
          U+0073  s
          U+0074  t
          U+0033  3
          U+002E  .
          U+0078  x
          U+006C  l
          U+0073  s
          U+0078  x
          U+002E  .
          U+006C  l
          U+006E  n
          U+006B  k

          4. LECmdでメタ情報確認。

          実行コード

          LECmd.exe -f "E:\test3.xlsx.lnk"

          結果(一部抜粋)

              --------- Block 0 (Beef0004) ---------
              Long name: test3.xlsx
              Created:     2026-08-16 04:01:58
              Last access: 2026-08-16 04:03:00
              MFT entry/sequence #: 463356/5 (0x711FC/0x5)

          5. 項番3、4の結果から、RLOを含むファイルをコピーした後、ファイル名からRLOを削除してリネームした場合、今回生成されたLNKファイル名およびLECmdで確認したLong nameにはRLOの痕跡は確認できなかった。

          その他

          ファイル名にRLOが含まれている場合、Windowsのショートカットエラーに表示されるファイル名にもRLOによる表示順の変化が反映されることを確認できた。

          ショートカットエラー

          検証結果

          今回の検証では、「ファイル名にRLOを含めた場合」「Excelファイルの本文にのみRLOを含めた場合」「RLOを含むファイルをコピー後、ファイル名からRLOを削除した場合」の3パターンについて、Recentフォルダに生成されるLNKファイルを比較した。

          検証内容ファイル名のRLO本文のRLOLNKファイル名のRLOLECmdのLong name
          ファイル名にRLOを設定ありなしあり?test.xlsx
          本文にRLOを設定なしありなしtest2.xlsx
          ファイル名にRLOを含むファイルをコピー後、RLOを削除してリネームした場合なし(コピー元はあり)なしなしtest3.xlsx

          ファイル名にRLO(U+202E)が含まれている場合、Recentフォルダに生成されたLNKファイル名にもU+202Eが含まれていることを確認できた。一方、本文にのみRLOを含めた場合や、RLOを含むファイルをコピーした後にRLOを削除してリネームしてから開いた場合には、生成されたLNKファイル名からU+202Eは確認されなかった。
          以上から、今回の検証環境および検証した条件ではRecentに生成されたLNKファイル名のRLOは文書本文やコピー元の過去のファイル名に由来する挙動は確認されず、対象ファイルを開いた時点のファイル名が反映されている可能性が高いと考えられる。

          最後に

          アラート分析の際にRLOを含むLNKファイル名が確認された場合や、?test.xlsx のようにファイル名に通常とは異なる記号が表示されている場合は、RLOなどのUnicode制御文字を利用したファイル名偽装の可能性も考慮して調査するのがよさそう。
          MDEのログ上では、LNKファイル名にもRLOが含まれているように表示された事例があったようだが、セキュリティ製品によって取得するログや表示するフィールド、文字の表現方法などが異なる可能性があるため、アラート上の表示だけで判断せず、可能であれば実ファイル名のUnicodeコードポイントやLNKファイルの情報もあわせて確認したい。

          よかったらシェアしてね!
          • URLをコピーしました!
          • URLをコピーしました!

          この記事を書いた人

          勉強中のセキュリティエンジニアです。
          初心者の目線で学んだことをまとめています。

          コメント

          コメントする

          CAPTCHA


          目次