AeyeScan blog 第6回「ブラウザの内蔵AIでXSSを検出してみた」

(イメージ画像)

AI活用はますます進んでおり、Google Chrome にも AI が搭載される時代になりました。これをうまく活用すれば、ブラウザ上で動作する脆弱性であるクロスサイトスクリプティングも検出できるのではないか。そんなことを考えて、検証を行ってみました。

NEC、クッキー等の第三者提供の情報公開

Google Chrome のバージョン126 から、ローカルで動作する AI がブラウザに統合されます。AIモデルは、Google が提供する最軽量のモデルである Gemini Nano で、ブラウザに直接組み込まれているため、ネットワーク接続を必要としません。完全にローカルで動作することから、データが外部に送信されないというセキュリティ上の利点があります。

利用方法は極めてシンプルで、JavaScript から window.aiコンポーネントの関数を呼び出すだけで、Gemini Nano の機能を活用できます。

●インストール手順

早速インストールして動作を確認してみましょう。動作確認は Mac で実施しています。

1. Google Chrome Dev をインストールします。
2. インストールした Google Chrome Dev を起動し、chrome://flags/ にアクセスします。
3. 以下のフラグを設定します:
○Enables optimization guide on device: Enabled BypassPerfRequirement
○Prompt API for Gemini Nano: Enabled

4. Google Chrome Dev を再起動します。
5. chrome://components/ にアクセスします。
6. Optimization Guide On Device Model の「アップデートを確認」ボタンを押下します(存在しない場合は、他の項目の「アップデートを確認」ボタンを押下、再起動してみる、後述のコードを実行してみる、などを試してみると出現します)。

●利用手順

Gemini Nano を実際に使用してみましょう。以下のコードを Developerコンソールに貼り付けて実行します。

\---
const canCreate = await window.ai.canCreateTextSession();
if (canCreate === "no") {
console.log("Gemini Nanoがインストールされていません");
} else {
const session = await window.ai.createTextSession();
const result = await session.prompt("日本の首都は?");
console.log(result);
}
\---

数秒待つと「東京都」が出力されました。ブラウザ上で AI が動作しています!この手順により、Gemini Nano の機能をローカルで利用できることが確認できました。

●DOM Based XSS を検出してみる

ここからが本題です。クライアントサイドで完結する脆弱性の一つに DOM Based XSS があります。性能調査のために、この脆弱性を AI で検出可能か試してみたいと思います。

・脆弱サイト

脆弱サイトは、OWASP の Example をベースに作成しました。信頼できない値を document.write で出力する脆弱なコードです。

dombasedxss_vuln.html
\---
<html><body>
Select your language:
<select><script>
document.write("<OPTION value=1>"+decodeURIComponent(document.location.href.substring(document.location.href.indexOf("default=")+8))+"</OPTION>");
document.write("<OPTION value=2>English</OPTION>");
</script></select>
</body></html>
\---

Google Chrome Dev上でこのHTMLを開いた後、以下の脆弱性検出コードを Developerコンソールに貼り付けて実行します。Gemini Nano は日本語の扱いに難があるため、プロンプトは英語で作成しています。(2024 年 6 月 18 日時点)

\---
const canCreate = await window.ai.canCreateTextSession();
if (canCreate === "no") {
console.log("Gemini Nanoがインストールされていません");
} else {
const session = await window.ai.createTextSession();
const htmlContent = document.documentElement.outerHTML;
const prompt = 'Please analyze this HTML code for DOM-based XSS vulnerabilities and report the result as either "Exists," "Does Not Exist," or "Unknown." : ' + htmlContent
const result = await session.prompt(prompt);
console.log(result);
}
\---

結果
**Result:**
***Exists***

“Exists”と出力され、脆弱性を検出することができました。

次は、脆弱性のないサイトを作成して同様の手順を試してみます。静的にタグを出力しているため安全なコードです。

dombasedxss_safe1.html
\---
<html><body>
Select your language:
<select>
<OPTION value=1>Japanese</OPTION>
<OPTION value=2>English</OPTION>
</select>
</body></html>
\---

結果
**Does Not Exist**

“Does Not Exist”と出力され、脆弱性が無いことも判別することができました。

最後に、少し複雑なコードで試してみます。document.write を使用していますが、引数は静的文字列のため安全なコードです。

dombasedxss_safe2.html
\---
<html><body>
Select your language:
<select><script>
document.write("<OPTION value=1>Japanese</OPTION>");
document.write("<OPTION value=2>English</OPTION>");
</script></select>
</body></html>
\---

結果
毎回変わる

残念ながら、少し複雑なコードになると結果が安定しませんでした。実際の Webサイトは複雑度が更に高いため、Gemini Nano を活用した脆弱性検出はすぐに実用化とはならないと思われます。ただし、プロンプトエンジニアリングで精度を向上させる余地はあるのではないかと期待しています。

●まとめ

今回は、ブラウザの内蔵AI で XSS を検出する試みを実施しました。検出精度を上げるには、入力データの加工やプロンプトの精度向上が必要になりそうですが、試行錯誤してみる価値はありそうです。プロンプトエンジニアリングはハマるととても楽しいので、是非試してみてください。

また、弊社が提供するクラウド型Webアプリケーション脆弱性診断ツールAeyeScan は、生成AI を活用した高度な診断も実施可能です。AeyeScan は無料でトライアルできますので、ご興味ありましたらぜひお問い合わせください。AeyeScan のトライアル、脆弱性診断の自動化のご相談はこちら

●参考記事

\- https://zenn.dev/the_exile/articles/chrome-gemini-nano
\- https://azukiazusa.dev/blog/try-chrome-internal-ai-gemini-nano/

© 株式会社イード