背景
先日たまたまPolyglotについて知る機会があったので、その復習も兼ねて概要についてまとめる。
Polyglotの意味
もとの言葉の意味としては、複数の言語を話せる人のことを指す。
そのとき自分が扱ったのはPolyglotファイルといわれるもので、1つのファイルが複数のファイル形式で正しく解釈されるファイルのことを指す。
ファイルの解釈?
###解釈 → 形式の判定
もう少し詳しく。
画像であればjpg, png, bmp, gif, 音声ならwov, mp3といったようにファイルには形式が存在する。この形式の判定を行うことをここでファイルの解釈という。
imghdrにおける判定
具体的な例として、pythonの画像の形式を判定するライブラリにimghdrというものがある。
このimghdrは画像の形式判定を、ファイルのバイナリデータを読み出して特定の文字列を抽出することで行なっている。
jpeg形式の画像の場合、ファイルヘッダの7~10バイト目にJFIFの文字が入っている。
hexdump -C example.jpeg |head
のコマンドで確認が可能。結果は以下の画像。
imghdrはファイル内のJFIF, Exifなどの文字列を抽出することでファイル形式の判断を行なっており、逆にいえばこの文字列が特定の位置にさえ入っていれば実際は異なる形式のファイルでも画像として判断される。
改ざん例
試しに手元でrtf(リッチテキストファイル)ファイルのバイナリを編集した。内容については以下の画像。
このファイルをimghdrに判定させるとjpegとして判定される。
危険性と対策
以上のように複数の形式で解釈可能なファイルをPolyglotという。上記のrtfのように別段害のないものばかりではなく、無害なファイルのふりをして実行可能なスクリプトが含まれている場合などもある。
こちらは画像内にjavascriptが仕込まれているケースが挙げられている。
実行可能なスクリプトの注入された画像などがサーバでのファイルチェックをバイパスしアップロードされることで、異なるオリジンからのスクリプトの読み込みを許可しないアプリケーションにおいて、同一オリジンのスクリプトとして画像が読み込まれる可能性がある。
図の赤字で示すように、攻撃を成り立たせるためにはアップロードしたPolyglotをスクリプトとして読み込むためのスクリプトタグが必要になる。
ファイルそのものに対するチェックには限界があるため、悪質なPolyglotがアップロードされてもスクリプトが実行されないようにXSSなどの脆弱性を残さない必要がある。
感想
ファイル自体の作りはすごいと思ったが、攻撃を行う手段としては回りくどいようにも感じる。ここからさらに発展を遂げる(どんな?)ことも考慮すると一応知っておく必要はあるかもしれない。というか単純にPolyglot単体でもキメラのようで十分面白い。