画像にコードを隠せ!「Exif Smuggling」による新たな攻撃手法の脅威
Exif Smuggling
Exif Smuggling
Exif Smugglingとは、画像ファイルのメタデータ(Exif)領域に悪意のあるコードを埋め込み、特定の条件下で実行させる攻撃手法です。セキュリティを考えるエンジニアなら知っておくべき、ファイルアップロードや画像処理系の脆弱性につながる興味深いトピックです。
何年も前にマルバタイザー(広告を使ったマルウェア配布)が、広告用画像のなかに悪意のあるコードを隠して検知を回避する手法を使ってなかったっけ?(ステガノグラフィに近いものだったかもしれないけど)
最近はセキュリティ対策を理由に、ほぼすべてのサービスがEXIFデータを削除しちゃうのがちょっと鬱陶しいんだよね。おかげで写真の撮影に使ったカメラやレンズ、設定がわからなくて困る。
自分も、おもちゃのバイブを制御するサイトのコードをロゴのアルファチャンネルに隠したことあるよ。https://dogself.com (https://dogself.com )
たぶん、コードをミニファイ(圧縮)しておくべきだったな……
おっ、これは賢いな。単にExifにペイロードを隠すだけじゃなくて、ブラウザのキャッシュから読み込むことで「ネットワークからペイロードが取得された」という事実そのものを隠蔽してるのか。(たぶん、ユーザーが閲覧したページに画像を埋め込んでからキャッシュさせてるんだろうね)
つまり、パッケージ自体には(直接的には)悪意のあるコードが含まれておらず、ネットワーク通信も発生しないのに、ネットワーク経由で悪意のあるコードを実行できるわけだ。これ、単なる難読化よりずっとタチが悪い。コマンド&コントロール(C&C)サーバーみたいに、ペイロードを自由に入れ替えられるからね。
なんでこれ、本家へのリンクじゃなくてコミットが一つもない適当なフォークへのリンクになってるの?
画像にデータを埋め込むのにわざわざExifを使う必要はないよ。PNGの追加チャンクとか、JFIFのアプリマーカーとか、単純にファイルの末尾にデータを追記するだけでもいいわけだし。
それより、画像からメタデータがすべて削除されたり再エンコードされたりしても生き残るような手法を考えるほうが面白そう。あえて意図的にピクセルデータをランダム化しない決定論的なエンコーダーを利用するとか。
要するに、画像データストリームそのものをポリグロット(複数の形式として認識されるファイル)にするってことだね。
かなり昔のことだけど、ファイル名じゃなくてMIMEタイプだけをチェックする画像ホスティングサイトを使ってた人を見たことがあるよ。結局のところ、重要なのはそこだよね?image.phpとして画像をアップロードするとそれがそのまま機能しちゃって、ExifコメントにPHPコードが埋め込まれていれば、それが実行されるっていう。
これって単なるステガノグラフィのエンコーディングやパッカーの一種なの?それとも自己実行機能があるのかな?エンコードしようと思えば何だってできるからね。シグネチャベースの検知を欺くためのちょっと面白いツールって程度の認識でいいのか、それとも外部デコーダーで変なマシンを動かすようなものなのか、どっちなんだろう。