JSONPとCallbackパラメータって何?
昔々、WebサイトAがWebサイトBから情報を取得したい時、セキュリティ上の制限で直接データをやり取りするのが難しい時代がありました。(今でもその制限はありますが、より安全な方法があります。)
そこで考えられたのが「JSONP (JSON with Padding)」という方法です。これは、WebサイトBが提供する情報を、WebサイトAが「プログラム(スクリプト)の一部」として読み込む方法です。
情報を読み込む際、「この情報を読み込んだら、次は〇〇という処理をしてね」と指示を出す必要があります。この「〇〇という処理」の名前を指定するのが Callback (コールバック) パラメータ です。URLの後ろに `?callback=処理の名前` のような形でくっつけて使います。
例えるなら、友達に「この手紙を読んだら、〇〇さんに電話してね」とお願いするようなものです。この「〇〇さんに電話してね」がCallbackパラメータに相当します。
どうやって悪用されるの?
問題は、この「Callbackパラメータ」に、処理の名前ではなく、悪意のある命令(スクリプト) を指定できてしまう場合があることです。
攻撃者は、罠を仕掛けたWebサイトやメールを用意します。そして、利用者がその罠にかかり、JSONPを使っている正規のWebサイト(例:あなたがログインしているSNSや銀行サイト)に対して、悪意のあるCallbackパラメータを含んだリクエストを送るように仕向けます。
正規のWebサイト側で、「Callbackパラメータには変な文字や命令を入れられないようにしよう」というチェック(検証)が甘いと、攻撃者の仕込んだ悪意のある命令が、あたかも正規の処理の一部であるかのように、あなたのブラウザ上で実行されてしまうのです。
先ほどの例えで言うと、友達に渡す手紙に「〇〇さんに電話してね」ではなく、「金庫の番号を大声で叫んでね!」と書かれていて、友達がそれを疑わずに実行してしまうような状況です。
どんな被害があるの?
この脆弱性が悪用されると、主に次のような被害が発生する可能性があります。
- 個人情報の漏洩: あなたがそのWebサイト上で見ることができる情報(名前、メールアドレス、住所、登録情報など)が、攻撃者に盗み取られる可能性があります。
- セッション情報の窃取: ログイン状態を維持するための情報(セッションIDやトークンなど)が盗まれ、あなたになりすまして不正な操作をされる可能性があります。(アカウント乗っ取り)
- 意図しない操作の実行: あなたのアカウントで、勝手に投稿されたり、設定を変更されたりする可能性があります。
重要なのは、攻撃者はあなたが見ることのできる情報しか盗めないということです。しかし、ログインしている状態であれば、多くの重要な情報にアクセスできてしまう可能性があります。
実際にあった事例は?
JSONPやCallbackパラメータに関連する脆弱性は、過去に様々なWebサイトで見つかっています。
- 有名なWebサービスやフレームワーク(ソフトウェアの骨組み)でも、過去にJSONPのデフォルト設定が原因で脆弱性が存在した事例があります (例: Spring Framework CVE-2018-11040、2018年頃)。
- 特定の条件下で、Flash(古いWeb技術)と組み合わせて悪用されるケースも報告されていました。
- 現在では、より安全な技術(CORS)の普及やブラウザのセキュリティ強化により、JSONP自体が使われる場面は減っていますが、古いシステムや設定ミスにより、依然としてリスクが残っている場合があります。
※ 特定の企業名を挙げることは控えますが、多くのサービスで対策が講じられています。
開発者はどう対策すればいいの?
Webサイトやアプリケーションを開発する側は、次のような対策を行うことが推奨されます。
対策 | 簡単な説明 |
---|---|
Callbackパラメータの厳格な検証 | Callbackパラメータとして受け付ける文字の種類(例: 英数字とアンダースコアのみ)や長さを制限し、不正なコードが紛れ込まないようにします。 |
可能であればJSONPを使用しない | 現在では、より安全で標準的な「CORS (Cross-Origin Resource Sharing)」という仕組みを使うことが推奨されます。JSONPは、特別な理由がない限り避けるべき技術とされています。 |
適切なContent-Typeを設定する | レスポンスのタイプを正しく設定する(例: JSONPでもJavaScriptとして扱わせる `application/javascript`)ことで、意図しない解釈を防ぎます。単なるJSONを返す場合は `application/json` を使用します。 |
RefererヘッダーやOriginヘッダーの確認 | 信頼できるドメインからのリクエストかを確認します (ただし、偽装される可能性もあるため、これだけで万全ではありません)。 |
CSRF対策 | 意図しないリクエストを防ぐための一般的な対策(トークンなど)も有効です。 |
最も重要なのは、安易にJSONPを使わず、使う場合でもCallbackパラメータを厳格に検証することです。
まとめ
JSONP/Callbackパラメータの悪用は、Webサイト間のデータ連携に使われる古い技術の隙をついた攻撃です。Callbackパラメータの検証が不十分だと、利用者のブラウザで悪意のあるコードが実行され、情報が盗まれる危険があります。
開発者はJSONPの使用を避け、より安全なCORSを利用するか、JSONPを使う場合はCallbackパラメータを厳格に検証する必要があります。利用者としては、不審なリンクをクリックしない、ソフトウェアを最新の状態に保つといった基本的な対策が重要です。