「画像ファイルなら大丈夫だろう」と油断していませんか?
実はそのSVGファイル、あなたのWebサイトを乗っ取ろうとする「トロイの木馬」かもしれません。こんにちは。セキュリティの現場で長年、泥臭い攻防を繰り広げてきた者です。
今日は、開発現場でつい見落とされがちな「SVGファイル経由のXSS(クロスサイトスクリプティング)」という、少し恐ろしいけれど面白いテーマについて、身近な例えを交えてお話ししますね。
—
1. なぜSVGは「画像」なのに危険なのか?
普通、JPEGやPNGといった画像ファイルは「色の情報の集まり」です。でも、SVGは全く別物。SVGは「画像を描くための命令書(テキストファイル)」なんです。
家の防犯に例えてみましょう。
JPEGやPNGは、完成した「絵画」です。泥棒がその絵画を盗んでも、絵の中に隠し通路はありませんよね。
一方でSVGは、「この線をここに引いて、この色を塗って」という「設計図」なんです。
もしその設計図の中に、こっそりと「この絵が表示されたら、隣の家の鍵を開けろ」という指令(スクリプト)が書き込まれていたらどうでしょう?
ブラウザは律儀なので、SVGを読み込むときにその指令まで実行してしまうことがあります。これがSVGによるXSSの正体です。
—
2. 攻撃はどうやって行われるのか?
攻撃者は、SVGファイルの中にこんなコードを埋め込みます。
ユーザーがこの画像をブラウザで開いた瞬間、あなたのサイトのドメイン上でこのスクリプトが動きます。すると、ユーザーのログイン情報(セッションクッキー)が盗まれたり、勝手にパスワードを変更されたりといった被害に繋がってしまうのです。
—
3. どうやって防げばいい?(泥臭い対策の第一歩)
「じゃあSVGを使うのをやめればいいの?」と思うかもしれませんが、アイコンやロゴにSVGは欠かせませんよね。現場では、以下のような「多重の鍵」をかけるのが鉄則です。
対策①:アップロード時に「無害化(サニタイズ)」する
一番確実なのは、アップロードされたSVGからタグやonmouseoverのような「動く命令」を削除することです。PHPならDOMDocumentなどを使って、危険なタグを片っ端から取り除きましょう。
対策②:Content-Security-Policy (CSP) で縛り上げる
これが現代の最強の防犯カメラです。Webサーバーの設定で、「このサイトではスクリプトを許可しないぞ!」と宣言します。
HTTPレスポンスヘッダーに以下を設定してください。
スクリプトの実行を一切禁止する設定
Content-Security-Policy: default-src 'self'; script-src 'none';
これをしておくだけで、仮に攻撃者が悪意あるSVGをアップロードしても、ブラウザが「このサイトでスクリプトは動かしちゃダメだよ」と実行をブロックしてくれます。
対策③:SVGを「画像」として扱う(imgタグの強制)
SVGを直接HTMLに埋め込むのではなく、タグ経由で読み込ませましょう。
ブラウザの多くは、タグ経由のSVGに対してはスクリプト実行を禁止する仕様になっています。これだけでも、防御力は格段に上がります。
---
まとめ:セキュリティは「疑うこと」から始まる
「画像ファイルだから安全」という思い込みこそが、攻撃者が一番狙っている盲点です。
1. SVGはただの画像ではなく「プログラムのソースコード」だと思え
2. アップロードされたファイルは信用せず、中身を検査(サニタイズ)せよ
3. CSPヘッダーで、万が一の時のための「実行禁止ルール」を作っておけ
セキュリティ対策は、一度やって終わりではありません。家の鍵を毎日確認するように、少しずつ、でも確実に仕組みを整えていきましょう。
皆さんのサイトが、今日も安全であることを願っています。分からないことがあれば、またいつでも聞きに来てくださいね!
コメント