特定の拡張子を非表示にする Windows のデフォルト設定を狙った多重拡張子等の古典的なトラップは比較的簡単に見破れるが、ここやここの記事にあるように、Unicode 制御文字の RLO (Right-to-Left-Override) を利用した手法はヤバい。結構前から悪用されていたようだが、つい先日まで知らなかった。いつからこんなことができたんだろうか? それっぽいリソースを埋め込んでアイコンまで偽装されている場合は、深刻な脅威になりそうだ。
ファイルタイプを確認すれば見破ることができるとは言え、普段からエクスプローラーを 「詳細」 表示にしていて 「属性」 や 「所有者」 はよく確認する僕も、ファイルタイプを示す 「種類」 に注目する頻度はそれほど多くない。普通にしていてこの手の偽装ファイルに遭遇する可能性はあまり高くはないと思うが、知ってしまったからには看過できない問題だ。
ファイル名に含まれる全ての "." から 5文字程度を逆に読み、exe や各種スクリプト等、一般的に危ないとされる拡張子をひっくり返した文字列が含まれる場合は疑ってかかる生活を送るのは相当にメンドくせーなーと憂鬱な気分に浸っていたところ、(ある程度) システム的に回避する方法があった。
当然のことながら、Windows 自身はファイル名に Unicode 制御文字が含まれることと、真の拡張子を把握している。そこでこのサイトで紹介されているように、「ローカル セキュリティ ポリシー」 で、RLO を含むパスをソフトウェア制限として定義してしまえば、危険な実行ファイルをうっかり走らせてしまうことを防げる。
ただ、この方法で exe、scr、vbs 等の誤実行を防げることは確認できたが、zip や jpg 等の 「基本的に無害」 な拡張子は関連付けられたアプリケーションが起動するし (内容を正しく表示できるかどうかは、ファイル名の扱い等に絡む個々のアプリケーションの実装に依存する)、同様にアプリケーションが反応した doc や xls 等、悪意のマクロを含む可能性のあるデータも危ない。あくまでも実行可能なファイルの実行を防ぐだけで完全ではないので、注意深く行動することの重要性は変わらない。
さて、RLO で偽装されたファイル名が Linux 上でどう見えるのかは、気になるところ。人畜無害な実行ファイル (自己解凍形式の ZIP) のファイル名に RLO を挿入し、CentOS 上の Samba 共有フォルダーにコピーしてみると、以下のようになった。
- 本来のファイル名: hogegpj.exe ← 実際には exe
- "gpj" の直前に RLO を挿入した "1.": hogeexe.jpg ← jpg に見える
- CentOS 5.3 上で見た "2.": hoge?gpj.exe ← 文字化け
問題のファイルを CentOS 5.3 で確認すると、RLO 挿入箇所に謎の文字が 1発入った状態に見える。よかった、単に Unicode 制御文字に未対応なだけだが、今のところコイツは、「左 → 右」 と 「右 → 左」 が混在するような紛らわしい表示をしない。