MIMEタイプ検出器

次へ

ファイルの拡張子には嘘がある、誰でもmalware.exephoto.jpgに変更できる。ファイルが実際にどのような形式であるかを確実に把握するには、その最初の数バイトを読み取ることが必要だ。ほとんどのフォーマットでは、ファイル名に関わらずそのフォーマットを識別する「マジック数値」(シグネチャー)が含まれている。この検出ツールは、送信されたファイルのシグネチャーを読み取り、標準的なMIMEタイプと最も一般的な拡張子の対応関係を返すことで、クライアントが報告したファイル内容が実際に該当するかを確認できる。

MIME検出の仕組み

  1. 1

    ファイルをドロップ

    任意のサイズで構いません。読み込まれるのは最初の4~16KBのみです。

  2. 2

    マジックバイトを読み取る

    ほとんどのフォーマットは既知のシグネチャから始まります。

  3. 3

    シグネチャデータベースとの照合

    この検出器は、`file(1)`/libmagicと同じルールを使用しています。

  4. 4

    MIME+拡張子を返す

    RFC 6838のメディアタイプ、標準的な拡張子および人間が付与したラベルを表示します。

サンプル署名

フォーマット 最初のバイト(16進) MIME
JPEG FF D8 FF image/jpeg
PNG 89 50 4E 47 0D 0A 1A 0A image/png
GIF87a 47 49 46 38 37 61 image/gif
GIF89a 47 49 46 38 39 61 image/gif
WebP 52 49 46 46 ... 57 45 42 50 image/webp
PDF 25 50 44 46 (%PDF) application/pdf
ZIP / JAR / ODT / DOCX 50 4B 03 04 application/zip(または特定のファイル形式)
gzip 1F 8B 08 application/gzip
MP4(ISO BMFF) 00 00 00 XX 66 74 79 70 video/mp4
MP3 49 44 33またはFF FB audio/mpeg
FLAC 66 4C 61 43 audio/flac
WAV 52 49 46 46 ... 57 41 56 45 audio/wav
ELF(Linuxバイナリ) 7F 45 4C 46 application/x-executable
Windows PE (exe) 4D 5A application/x-msdownload

拡張子だけでは不十分な理由

  • セキュリティ。 アップロードされたresume.pdf(実際には.exe)は、単純な拡張子フィルターを回避します。サーバー側のMIME検出機能がこの問題の解決策となります。
  • Content-Typeの不一致。 ブラウザがアップロードデータに対して誤ったMIMEを送信する可能性があります。マジックバイトの読み取りにより、データの実際の内容を確認できます。
  • 復元されたバックアップ。 拡張子が失われたり削除されたりすることがあります。コンテンツを分析することで、各ファイルの内容を特定できます。

ZIPベースのファミリー

多くの現代のファイル形式は実質的にZIPアーカイブであり、他のZIPファイルと同様にPK\x03\x04というプレフィックスで始まります。

  • Office Open XML: .docx.xlsx.pptx
  • OpenDocument: .odt, .ods, .odp.
  • EPUB: .epub
  • Android用APKファイル: .apk
  • Java JARファイル: .jar

これらを区別するために、検出器はZIPファイルの内部に目を差し込んでマニフェストファイルを読み取ります(OOXML用は[Content_Types].xml、ODF/EPUB用はmimetype)。

有用な組み合わせ

  • 最初の512バイトはほとんどのフォーマット署名をカバーしています。
  • 「最初の4KB」は、マニフェストがその後に配置されるZIPベースのフォーマットを対象としています。
  • 「最初の16 KB」は、いくつかのマルチメディアコンテナのような特殊なケースをカバーしています。

完璧ではありません

  • プレーンテキストファイルにはマジックバイトが含まれていません。検出器はヒューリスティクスに基づいて処理を行います(有効なUTF-8かどうか、JSONまたはXMLに似ているかどうか)。
  • 暗号化された/匿名化されたファイルは、識別可能な署名がなく、ランダムなバイトの組み合わせのように見える場合があります。 – 形式の曖昧さ。 audio/wavおよびvideo/aviはいずれもRIFFから始まるが、検出器は二次識別子(4バイト後に現れるWAVEAVI )を確認する。

よくある質問

いいえ。検出処理はブラウザ内で実行されます、最初の数KBのみが読み込まれ、クライアント側の署名データベースと照合されます。デバイスから一切データが送信されません。

OOXML、ODF、EPUBおよびJARはいずれもZIP署名から始まるため、検出器はその内部を確認してフォーマット固有のマニフェストを抽出し、より具体的なMIME(application/vnd.openxmlformats-...)を返します。

これは単純な名前の変更を検出する機能である。.exe.jpgに変更された場合、そのマジックバイトによって実行可能ファイルとして表示される。高度な攻撃者は、実際のメディアファイル内にペイロードを埋め込むか、複数の署名に対応するポリグロットファイルを使用することで、単純な検出手法を回避する。

プレーンテキストにはマジックバイトがありません。検出器はヒューリスティクスを適用します:有効なUTF-8か?有効なJSONか?XML宣言か?CSV構造か?それ以外の場合はtext/plainに切り替えます。

署名データベースは類似しており(Unixのlibmagicルールから派生しています)、一般的なフォーマットでは結果が一致するはずです。暗号化されたまたはカスタムフォーマットの場合は異なる場合があります。

関連ツール

このツールは他の言語でも利用できます