- Magikaは、Googleが2024年2月に公開した深層学習ベースのファイル種類判定ツールで、ファイルの先頭・中央・末尾から各512バイトを読んで種類を推定します。
- 拡張子やヘッダーのシグネチャに頼る従来手法と違い、コンテンツのパターンを学習しているため、ポリグロットファイルや固定シグネチャを持たないテキスト系ファイルにも対応できます。
- GmailやGoogle Drive、VirusTotalなどの大規模サービスで実運用されており、
pip install magikaで即座に使い始められます。
1. ファイル種類と拡張子
任意の .exe を .pdf にリネームしても、メールクライアントは PDF のアイコンを表示することがあります。
拡張子は中身の証明ではなく、誰でも書き換えられるラベルです。
この「ラベルを先に見る」設計は、利用者の判断だけでなく、システム側の判定ロジックにも長らく影響を与えてきました。
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 は、ヘッダーではなくコンテンツのパターンそのものを読む深層学習モデルです。
ファイルの先頭・中央・末尾からそれぞれ 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 という識別子、description、mime_type、score という信頼スコアが含まれます。
複数ファイルをまとめて渡せる 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_CONFIDENCE、MEDIUM_CONFIDENCE、BEST_GUESS の 3 段階で切り替えられます。HIGH_CONFIDENCE がデフォルトで、確信度が閾値を下回った場合は Generic text document や Unknown 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 をバリデーション層に挟む選択肢があります。
ストリームから直接判定できるため、ファイルを一時保存せずにパイプライン中で処理できます。
テキスト系ファイルの判定精度が上がることは、CI/CD のパイプラインや静的解析ツールにも関係します。
拡張子のないファイルや誤った拡張子を持つファイルを正しく分類してから処理に回せるようになります。
意図的に Magika を騙しにきた入力への耐性については、論文でも課題として言及されています。
敵対的機械学習の領域であり、現時点では完全ではありません。
既存の署名ベースの検出と組み合わせて使うのが現実的です。
50 年以上使われてきた file コマンドに対する、深層学習を使った初めての本格的な代替品という位置づけは、数字を見る限り大げさではありません。
- file コマンドは Bell Labs UNIX とともに登場し、50年以上にわたってファイルタイプ判定のデファクトスタンダードとして使われてきました。 – Magika: AI powered fast and efficient file type identification
- ポリグロットファイルとは、2つ以上のファイル形式として同時に有効なファイルのことです。実際の攻撃チェーンで使われた30件のサンプルと15件の攻撃手法が確認されており、既存のファイルタイプ判定ツールのほとんどがこれを検出できなかったことが報告されています。 – On the Abuse and Detection of Polyglot Files
- Google のベンチマーク(100万ファイル・100種類以上のファイルタイプ)において、Magika は既存ツールと比較して全体で約20%の精度向上を達成しています。特にソースコードや設定ファイルといったテキスト系のタイプで差が大きく出ています。 – Magika: AI powered fast and efficient file type identification
- モデルはファイルの先頭・中央・末尾それぞれから512バイトずつ計3つのシーケンスを入力として受け取ります。これにより、ファイル全体を読まずに分類できます。 – Magika: AI-Powered Content-Type Detection(arXiv:2409.13768)
- Google は「VBA、JavaScript、PowerShell のような潜在的に問題のあるコンテンツタイプにおいて、最大95%の精度向上を達成した」と述べています。 – Google Open Sources Magika: AI-Powered File Identification Tool
- VirusTotal との統合により、Magika はファイルが Code Insight(Google の生成 AI によるマルウェア解析機能)で分析される前段のプレフィルターとして機能します。 – Magika: AI powered fast and efficient file type identification
- Magika の研究論文は、ソフトウェアエンジニアリング分野のトップ国際会議である ICSE 2025 に採択されています。 – Fast and accurate AI powered file content types detection(GitHub)
- v0.6.0 からはプラットフォームごとのホイールに Rust 製のコンパイル済みバイナリが同梱されており、Python 実装のクライアントから置き換わりました。サポートされていないプラットフォーム向けには、フォールバックとして Python 製のピュアホイールも提供されています。 – magika · PyPI