多くの一般的なマルウェアトリック(例えば、資格情報窃取の難読化手法、ステガノグラフィー、Base64ペイロード、zipトリック、リモートコード実行、ポリグロットトリック、メタデータトリック)をチェックし、アナリストにどこでより深い分析が必要かについての情報を提供することを目的とした包括的なブラウザ拡張機能(.xpi)マルウェアスキャナーです。
Firefox拡張機能ファイル(.xpi)を解析し、マルウェア、難読化、隠しペイロード、ステガノグラフィ、および拡張機能レビューチームをすり抜ける悪意のあるコードを仕込むその他の手法の兆候を検出するコマンドラインツールです。
extension-scanner.py はFirefox拡張機能を開き、内部のすべてのファイルに対して一連のセキュリティチェックを実行します。そして、重要度順にランク付けされた結果を色分けしたレポートとして出力します。
| カテゴリ | 検出対象 |
|---|---|
| 権限 | 危険または過度に広範な権限(nativeMessaging、<all_urls>、debugger、desktopCapture など) |
| コンテンツセキュリティポリシー | CSPにおける unsafe-inline、unsafe-eval、リモートスクリプトソース |
| JavaScript難読化 | eval()、atob()、Function() コンストラクタの悪用、16進エスケープシーケンス、split/join/reverse による再構築、エンコードされた文字列リテラル、文字列引数を持つ setTimeout |
| 不審なURL | ハードコードされた外部ドメインを 既知の悪意(ブロックリストヒット → HIGH)、未知(許可リストなし → MEDIUM)、既知の安全(許可リスト → 非表示)に分類。--update-blocklist を実行してURLhausとPeter Loweのリストからドメインブロックリストを更新可能。 |
| 認証情報とシークレット | ハードコードされたAPIキー、トークン(AWS、GitHub、Slack、Google)、パスワード、秘密鍵、IPアドレス |
| Base64ペイロード | 埋め込まれたbase64ブロブをデコードし、実行可能ファイル、スクリプト、ネットワークコードをスキャン |
| PNGステガノグラフィ | PNGのIEND後に追加されたデータを検出し、トレーラを自動デコード(base64、zlib、gzip、およびその組み合わせ)。デコードされたペイロードは再帰的にJS難読化、認証情報、不審なURLをスキャン。未知のチャンクタイプ、LSBチャネルの異常、異常に高いピクセルエントロピーも検出。 |
| ファイルメタデータ | マジックバイトによる実行可能ファイル(.exe、.elf、.dylib)の検出、二重拡張子(例:photo.png.js)、不審なファイル名(keylog、miner、wallet) |
| ポリグロットファイル | 2つの形式(例:HTML+ZIP)として同時に有効なファイル |
| ZIPのトリック | パストラバーサルエントリ、ファイル名内のNULLバイト、パーサーを欺く重複エントリ、ペイロードを含むZIPコメント |
| リモートコード | リモートURLから読み込まれるバックグラウンドページまたはサービスワーカー |
| 高エントロピー | 不審に高いエントロピーを持つファイルまたは文字列リテラル(暗号化または圧縮されたペイロードの可能性) |
| API悪用 | データ窃取または外部送信を示すブラウザ拡張機能API呼び出し:cookies.getAll({})、tabs.query({})、history.search、キーボードリスナー、クリップボード読み取り、動的関数を使用した scripting.executeScript。データ収集呼び出しと同一ファイル内の送信ネットワーク呼び出しがペアになるとCRITICALに escalation。 |
CRITICAL — ほぼ確実に悪意あり;即時調査が必要HIGH — 強く疑わしい;注意深いレビューが必要MEDIUM — 潜在的にリスクあり;文脈に応じてレビューLOW — 軽微な懸念;情報提供INFO — メタデータ(ハッシュ、ファイルサイズなど)python3.11、python3.12、python3.13**python3-venv** - 仮想環境を使用する場合に必要仮想環境を使用する場合:
sudo apt install python3 python3-venv
git clone https://github.com/ernos/extension-scanner.git
cd extension-scanner
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
**python3-numpy** - ステガノグラフィに推奨、システム全体にインストール(または pip install -r requirements.txt)pip install pillow numpy
#Ubuntuでのシステム全体インストール:
sudo apt install python3-pillow python3-numpy
git clone https://github.com/ernos/extension-scanner.git
cd extension-scanner
chmod +x extension-scanner.py
mkdir -p ~/.local/share/bin
ln -s $PWD/extension-scanner.py ~/.local/share/bin/extension-scanner
# LSBステガノグラフィ解析に必要(推奨、オプション)
pip install pillow numpy
# オプション1. 現在のユーザーのみ:
# 簡単な使用のためのbash補完を有効にする(TABキーでコマンドの自動補完)
mkdir -p ~/.local/share/bash-completion/completions
cp extension-scanner-completions ~/.local/share/bash-completion/completions
echo "source ~/.local/share/bash-completion/completions/extension-scanner-completions" >> ~/.bashrc
# オプション2. 全ユーザーに対してグローバルに補完を有効にする(.bashrcから自動的に読み込まれます)
cp extension-scanner-completions /usr/share/bash-completion/completions
Pillow/NumPyがインストールされていない場合でもツールは動作します。LSBおよびピクセルエントロピーチェックは単にスキップされ、警告が表示されます。
usage: xpiscanner [-h] [--update-blocklist] [--min-severity {CRITICAL,HIGH,MEDIUM,LOW,INFO}] [--json] [--compact] [-v] [-m] [--scans CHECK [CHECK ...]]
[targets ...]
Firefox Extension Scanner - XPIファイルをスキャンしてセキュリティリスクとマルウェアの兆候を検出します
positional arguments:
targets 解析する1つ以上のXPIファイルまたはXPIを含むディレクトリ
options:
-h, --help このヘルプメッセージを表示して終了
--update-blocklist, --update, -u
URLhausとPeter Loweのリストから最新のドメインブロックリストを取得し、バンドルされたスナップショットとマージして
/home/peb/projects/Firefox-Extensions/extension-scanner/blocklist.json に保存します。更新後に終了します。
--min-severity {CRITICAL,HIGH,MEDIUM,LOW,INFO}
表示する最小重要度(CRITICAL、HIGH、MEDIUM、LOW、INFO;デフォルト: INFO)
--json 結果をフォーマットテキストではなくJSONとして出力
--compact, -c 各発見事項をデフォルトの3行形式ではなく1〜2行で出力
-v, --verbose 詳細出力を有効にする:発見事項に関する追加コンテキストを表示
-m, --manifest 各ターゲットの拡張機能マニフェスト全体を表示
--scans, -s CHECK [CHECK ...]
特定のチェックタイプに分析を制限。選択肢: anti-analysis, api-abuse, credentials, cross-file,
file-meta, hidden-elements, obfuscation, payloads, permissions, polyglot, remote-code,
signatures, steganography, time-bomb, zip-tricks。省略するとすべてのチェックを実行(デフォルト)。
extension-scanner.py — Firefox(およびその他のブラウザ)拡張機能XPIファイルを解析し、セキュリティリスクとマルウェアの兆候を検出します。
結果の解釈、制限事項、および使用上のベストプラクティスについてはREADME.mdを参照してください。
このツールは、ブラウザ拡張機能の包括的な静的解析を実行したいセキュリティ研究者、アナリスト、上級ユーザーを対象としています。
他のブラウザでも動作するはずですが、Firefoxでのみテストされています。
使用方法:
python3 extension-scanner.py [オプション] ターゲット...
ターゲットは個々の.xpiファイルまたは.xpiファイルを含むディレクトリです。便利なようにグロブパターン(例: *.xpi)を使用できます。
利用可能なチェックタイプ:
permissions 危険/広範なマニフェスト権限とCSPの問題
remote-code リモートURLから読み込まれるバックグラウンドページまたはサービスワーカー
obfuscation eval/atob/エンコーディングのトリック、不審なURL、高エントロピー文字列
payloads Base64エンコードされたブロブをデコードし、実行可能ファイル/スクリプトをスキャン
steganography PNGに追加されたデータ(base64/zlib/gzipで自動デコード)、未知のチャンク、LSBチャネル解析
credentials ハードコードされたAPIキー、トークン、パスワード、秘密鍵、IPアドレス
file-meta マジックバイト、二重拡張子、不審なファイル名、ファイルエントロピー
polyglot 2つの形式で同時に有効なファイル(例: HTML+ZIP)
zip-tricks パストラバーサル、NULLバイト、重複エントリ、ZIPコメント
cross-file HTMLクラストークンをJS localStorageキーと相互参照
signatures 確認済み悪意のある拡張機能ファミリー(qingcaila、YTMP4など)からの既知の文字列
api-abuse データ窃取または外部送信を示すブラウザAPI呼び出し(cookies、tabs、history、keylogger、clipboard、executeScript)
hidden-elements 非表示iframe、ゼロ次元要素の注入、トラッキングピクセル(new Image().src)
time-bomb 長時間遅延のsetTimeout、Date.now()ゲート、localStorageインストール日付チェック、Math.random()ゲート
anti-analysis navigator.webdriver、ゼロサイズウィンドウ、ベアdebuggerステートメント、performance.now()タイミング
例:
python3 extension-scanner.py extension.xpi
python3 extension-scanner.py *.xpi
python3 extension-scanner.py /path/to/extensions/
python3 extension-scanner.py a.xpi b.xpi --min-severity HIGH
python3 extension-scanner.py ext.xpi --scans obfuscation payloads
python3 extension-scanner.py ext.xpi --s steganography zip-tricks file-meta
python3 extension-scanner.py ext.xpi --verbose
python3 extension-scanner.py --update-blocklist
python3 extension-scanner.py --manifest
ヒント:
- .bashrcまたは.zshrcからscanner-completions.shを読み込んで、--scansカテゴリとターゲットファイルパスのタブ補完を有効にしてください。
- --min-severityを使用して、最初に最も重要な発見事項に集中してください。
- --scansを使用して特定のカテゴリのチェックに分析を制限し、特定のものを探したりスキャンを高速化したりできます。
- --manifestを使用してマニフェスト全体を確認し、権限、コンテンツスクリプト、その他の拡張機能メタデータを確認して結果の解釈に役立ててください。
- --update-blocklistでブロックリストを定期的に更新し、最新の悪意のあるドメインがチェックに含まれるようにしてください。
クレジット:
Ernos @ https://www.yourdev.net によって開発
メール: max at yourdev.net
GitHub: https://www.github.com/ernos/extension-scanner
════════════════════════════════════════════════════════════════════════════
XPI ANALYZER — example.xpi
════════════════════════════════════════════════════════════════════════════
全体判定: HIGH RISK
発見事項: 1 CRITICAL 3 HIGH 2 MEDIUM 1 LOW
── CRITICAL ────────────────────────────────────────────────────────────
[CRITICAL ] [JS_OBFUSCATION] content.js
eval() 呼び出し — 文字列から任意のコードを実行可能
Evidence: var x = eval(atob("dmFyIGE9MTs…"))
── HIGH ────────────────────────────────────────────────────────────────
[HIGH ] [PERMISSION] manifest.json
危険な権限: 'nativeMessaging' — ネイティブOSプロセスを起動可能…
Evidence: permissions: ['nativeMessaging', 'storage', '<all_urls>']
…
複数のファイルを分析すると、個々のレポートの後にすべての拡張機能を並べて表示する比較テーブルが出力されます。
| コード | 意味 |
|---|---|
0 | CRITICALまたはHIGHの発見事項なし |
1 | 少なくとも1つのHIGH発見事項 |
2 | 少なくとも1つのCRITICAL発見事項 |
これにより、CIパイプラインやシェルスクリプトでの使用が容易になります:
python3 extension-scanner.py extension.xpi --min-severity HIGH
if [ $? -eq 2 ]; then echo "CRITICALな問題が見つかりました!"; fi
HIGHの発見事項として表示される可能性があります。Maximilian Cornett
https://www.yourdev.net https://www.github.com/ernos
GNU General Public License - このツールはセキュリティ研究および防御的分析のみを目的としています。
| 隠し要素 | DOMに注入される動的に作成された非表示iframe(display:none、ゼロ寸法)— 無音のアフィリエイトpingまたはC2チャネル。外部URLを指す new Image().src によるトラッキングピクセル。 |
| タイムボム | 5分以上の遅延を持つ setTimeout/setInterval;Date.now() 算術ゲート;localStorage インストール日付チェックで動作を初回実行後数日遅らせる;Math.random() しきい値ゲートでページロードの一部でのみ発火。 |
| 解析回避 | navigator.webdriver チェック;ゼロ幅/高さのウィンドウ比較;ベア debugger ステートメント;タイミングベースのサンドボックス検出に使用される performance.now() 算術。 |
| フラグ | 説明 |
|---|
--update-blocklist | URLhausとPeter Loweの広告/マルウェアサーバーリストから最新のドメインリストを取得し、バンドルされたスナップショットとマージして、スクリプトと同じ場所にある blocklist.json に保存します。更新後に終了します。 |
targets | 1つ以上の .xpi ファイルまたはディレクトリ |
--min-severity | 出力をフィルタリング: CRITICAL、HIGH、MEDIUM、LOW、INFO(デフォルト: INFO) |
--json | 人間が読めるレポートの代わりにJSONドキュメントとして発見事項を出力 |
--verbose または -v | manifest.json の内容を出力し、不審なパターンが見つかった箇所の前後5行程度のコードも含めます |
--checks | 特定の チェックカテゴリ のみをスキャン(以下参照) |
| 利用可能な チェックカテゴリ | カテゴリ内のチェックの説明 |
|---|
| permissions | 危険/広範なマニフェスト権限とCSPの問題 |
| remote-code | リモートURLから読み込まれるバックグラウンドページまたはサービスワーカー |
| obfuscation | eval/atob/エンコーディングのトリック、不審なURL、高エントロピー文字列 |
| payloads | Base64エンコードされたブロブをデコードし、実行可能ファイル/スクリプトをスキャン |
| steganography | PNGに追加されたデータ、未知のチャンク、LSBチャネル解析 |
| credentials | ハードコードされたAPIキー、トークン、パスワード、秘密鍵、IPアドレス |
| file-meta | マジックバイト、二重拡張子、不審なファイル名、ファイルエントロピー |
| polyglot | 2つの形式で同時に有効なファイル(例: HTML+ZIP) |
| zip-tricks | パストラバーサル、NULLバイト、重複エントリ、ZIPコメント |
| cross-file | HTMLクラストークンをJS localStorageキーと相互参照 |
| api-abuse | データ窃取または外部送信を示すブラウザAPI呼び出し(cookies、tabs、history、keyboard、clipboard)。同一ファイル内で収集+ネットワーク送信がある場合CRITICAL。 |
| hidden-elements | 非表示iframeの注入とトラッキングピクセル。iframeが非表示でDOMに追加された場合HIGH。 |
| time-bomb | 長時間遅延のsetTimeout、Date.now()算術ゲート、localStorageインストール日付、Math.random()しきい値。 |
| anti-analysis | navigator.webdriver、ゼロサイズウィンドウ、ベアdebuggerステートメント、performance.now()算術。 |