【Magika】
ファイルの種類を判定する
(拡張子、シグネチャ、パターン学習)

  • Magikaは、Googleが2024年2月に公開した深層学習ベースのファイル種類判定ツールで、ファイルの先頭・中央・末尾から各512バイトを読んで種類を推定します。
  • 拡張子やヘッダーのシグネチャに頼る従来手法と違い、コンテンツのパターンを学習しているため、ポリグロットファイルや固定シグネチャを持たないテキスト系ファイルにも対応できます。
  • GmailやGoogle Drive、VirusTotalなどの大規模サービスで実運用されており、pip install magikaで即座に使い始められます。

関連記事

1. ファイル種類と拡張子

任意の .exe.pdf にリネームしても、メールクライアントは PDF のアイコンを表示することがあります。

ファイル種類と拡張子 .exe rename .pdf 拡張子は書き換え可能 中身の証明にならない ポリグロットファイル 正規ヘッダー+悪意コードの混在 $ file unknown.bin %PDF PDF FFD8FF JPEG PK ZIP 先頭バイトで照合 50年以上の実績 テキスト系は固定シグネチャなし 約20%が判定不可

拡張子は中身の証明ではなく、誰でも書き換えられるラベルです。
この「ラベルを先に見る」設計は、利用者の判断だけでなく、システム側の判定ロジックにも長らく影響を与えてきました。

1.1. file コマンドとシグネチャ照合

ファイルの種類を機械的に判定する手法として 50 年以上使われてきたのが、先頭数バイトを読むやり方です。
Unix の file コマンドが体現してきた方法で、PDF なら %PDF、JPEG なら FF D8 FF、ZIP なら PK という形式ごとのシグネチャを照合します1
軽く、速く、依存関係もない。
運用上の扱いやすさという点では、今でも優れています。

1.2. ポリグロットファイル(なりすまし)

問題は、攻撃側もこの前提を知っていることです。

ポリグロットファイルと呼ばれるファイルは、複数の形式として同時に有効な構造を持ちます2
先頭バイトだけを正規の PDF に見せながら、深い位置に別の実行コードを埋め込めます。
ヘッダーの確認は通過しますが、実際に処理されるものはそれとは別物です。
テキストベースのファイル、ソースコードや設定ファイルに至っては固定のシグネチャ自体が存在しないため、従来の手法では約 20% が正しく判定できずに取りこぼされていました3

2. Magika が何を変えたか

Google が 2024 年 2 月にオープンソースとして公開した Magika は、ヘッダーではなくコンテンツのパターンそのものを読む深層学習モデルです。

Magikaが何を変えたか 先頭 中央 末尾 各512バイトを抽出 ニューラルネットワーク モデルサイズ 約1MB コンテンツタイプ判定 精度・再現率 99% 200種類以上対応 推論時間 5ms/件 GPU不要 Gmail / Google Drive 週数千億ファイル処理

ファイルの先頭・中央・末尾からそれぞれ 512 バイトを取り出し、ニューラルネットワークに通して種類を推定します4
ファイル全体を読む必要がないため、5KB の設定ファイルでも 5GB のアーカイブでも推論時間はほぼ変わりません。

モデルのサイズは約 1MB です。
200 種類以上のコンテンツタイプを対象に 1 億件規模のファイルで訓練されており、テストセット上での平均精度と再現率はどちらも 99% 前後に達します。
推論時間はモデルのロードが済んだ状態で 1 ファイルあたり約 5ms、GPU は不要です。

従来手法との差が特に大きいのはテキスト系のファイルです。
VBA、JavaScript、PowerShell といった悪用されやすく判定が難しいコンテンツタイプでは、精度が最大 95% 向上したとされています5

Gmail、Google Drive、Safe Browsing で毎週数千億のファイルを処理する際のルーティングに使われており、VirusTotal にも統合されています6
研究段階ではなく、現在進行形で大規模運用されているツールです。
なお、この研究成果は ICSE 2025(IEEE/ACM International Conference on Software Engineering)にも採択されています7

2.1. 使い方

インストールは pip install magika だけで完了します。
ONNX ランタイムを推論エンジンとして使うため、CPU 環境でも問題なく動きます。

コマンドラインからは次のように使います。

magika ./path/to/file
magika -r ./directory   # ディレクトリを再帰的にスキャン
magika ./file --json    # JSON 形式で出力
cat unknown_file | magika -  # 標準入力から読み込むCode language: Bash (bash)

Python API はバイト列、パス、ストリームの 3 種類を入力として受け付けます。

from magika import Magika

m = Magika()

# バイト列から判定
res = m.identify_bytes(b'function log(msg) {console.log(msg);}')
print(res.output.label)   # => javascript

# ファイルパスから判定
res = m.identify_path('./config.ini')
print(res.output.label)   # => ini

# ストリームから判定(大きなファイルに向いている)
with open('./archive.bin', 'rb') as f:
    res = m.identify_stream(f)
    print(res.output.label)Code language: Python (python)

res.output には label という識別子、descriptionmime_typescore という信頼スコアが含まれます。
複数ファイルをまとめて渡せる identify_paths() もあり、バッチ処理のパイプラインに組み込む場合はこちらが扱いやすいです。

results = m.identify_paths(['a.py', 'b.js', 'c.bin'])
for res in results:
    print(res.path, res.output.label, res.output.score)Code language: Python (python)

予測モードは HIGH_CONFIDENCEMEDIUM_CONFIDENCEBEST_GUESS の 3 段階で切り替えられます。
HIGH_CONFIDENCE がデフォルトで、確信度が閾値を下回った場合は Generic text documentUnknown binary data のような汎用ラベルを返します。
誤判定を黙って通す設計にはなっていません。

from magika import Magika
from magika.prediction_mode import PredictionMode

m = Magika(prediction_mode=PredictionMode.BEST_GUESS)Code language: Python (python)

コマンドラインツールは v0.6.0 以降、Python パッケージに同梱される Rust 製バイナリに切り替わっています8
Python、Rust、JavaScript/TypeScript、GoLang(開発中)向けのバインディングが提供されており、Apache 2.0 ライセンスで公開されています。

3. どこに組み込むか

ファイルアップロードを受け付けるサービスで Content-Type ヘッダーや拡張子だけを信頼している場合、Magika をバリデーション層に挟む選択肢があります。

どこに組み込むか ファイル アップロード Magika バリデーション層 正しい処理へ ルーティング pip install magika CPU対応 アップロード受付 Content-Typeを 信頼しない設計へ CI/CDパイプライン 拡張子なしファイルを 正しく分類 敵対的入力 署名ベース検出と 組み合わせて使用 ストリームから直接判定 → 一時保存不要 fileコマンドに対する深層学習ベースの初の本格的代替

ストリームから直接判定できるため、ファイルを一時保存せずにパイプライン中で処理できます。

テキスト系ファイルの判定精度が上がることは、CI/CD のパイプラインや静的解析ツールにも関係します。
拡張子のないファイルや誤った拡張子を持つファイルを正しく分類してから処理に回せるようになります。

意図的に Magika を騙しにきた入力への耐性については、論文でも課題として言及されています。
敵対的機械学習の領域であり、現時点では完全ではありません。
既存の署名ベースの検出と組み合わせて使うのが現実的です。

50 年以上使われてきた file コマンドに対する、深層学習を使った初めての本格的な代替品という位置づけは、数字を見る限り大げさではありません。

  1. file コマンドは Bell Labs UNIX とともに登場し、50年以上にわたってファイルタイプ判定のデファクトスタンダードとして使われてきました。 – Magika: AI powered fast and efficient file type identification
  2. ポリグロットファイルとは、2つ以上のファイル形式として同時に有効なファイルのことです。実際の攻撃チェーンで使われた30件のサンプルと15件の攻撃手法が確認されており、既存のファイルタイプ判定ツールのほとんどがこれを検出できなかったことが報告されています。 – On the Abuse and Detection of Polyglot Files
  3. Google のベンチマーク(100万ファイル・100種類以上のファイルタイプ)において、Magika は既存ツールと比較して全体で約20%の精度向上を達成しています。特にソースコードや設定ファイルといったテキスト系のタイプで差が大きく出ています。 – Magika: AI powered fast and efficient file type identification
  4. モデルはファイルの先頭・中央・末尾それぞれから512バイトずつ計3つのシーケンスを入力として受け取ります。これにより、ファイル全体を読まずに分類できます。 – Magika: AI-Powered Content-Type Detection(arXiv:2409.13768)
  5. Google は「VBA、JavaScript、PowerShell のような潜在的に問題のあるコンテンツタイプにおいて、最大95%の精度向上を達成した」と述べています。 – Google Open Sources Magika: AI-Powered File Identification Tool
  6. VirusTotal との統合により、Magika はファイルが Code Insight(Google の生成 AI によるマルウェア解析機能)で分析される前段のプレフィルターとして機能します。 – Magika: AI powered fast and efficient file type identification
  7. Magika の研究論文は、ソフトウェアエンジニアリング分野のトップ国際会議である ICSE 2025 に採択されています。 – Fast and accurate AI powered file content types detection(GitHub)
  8. v0.6.0 からはプラットフォームごとのホイールに Rust 製のコンパイル済みバイナリが同梱されており、Python 実装のクライアントから置き換わりました。サポートされていないプラットフォーム向けには、フォールバックとして Python 製のピュアホイールも提供されています。 – magika · PyPI