wivern ロゴ

サイバーセキュリティ研究所

サイバーセキュリティを中心に、軍事、防犯、サーバーの管理と監視、その他、最新技術を研究しています。


Linux コマンド辞典「file」

file:ファイル形式を判定する

IPAパスワード啓蒙

マルウェア解析の初期段階である表層解析でも使われる、対象ファイルの形式を判定するコマンドです。


名前
file — ファイル形式を判定する

書式
file [-bchiklLNnprsvz0] [--apple] [--mime-encoding] [--mime-type]
[-e testname] [-F separator] [-f namefile] [-m magicfiles]
[-R maxrecursion] file ...
file -C [-m magicfiles]
file [--help]

説明
このマニュアル・ページは file コマンドのバージョン 5.14 を記述している。

file は引き数のそれぞれを分類するためにテストする。
3つのテストとして、ファイル・システムのテスト、マジック・ナンバーのテスト、言語のテストをこの順で行う。
最初に成功したテストで得られたファイル形式を表示する。

表示された形式は通常以下の単語のひとつを含む:
テキスト(ファイルは表示可能な文字といくつかの制御文字だけが含まれ、ASCII 端末で多分安全に読める)、
実行形式(いくつかの UNIX カーネル等が理解できる形式でのコンパイル・プログラムの結果を含むファイル)、他のものを意味するデータ(データは通常"バイナリ"か表示できない形式)。
例外は、バイナリ・データを含むとを知られているよく知られたファイル形式( core ファイルや tar アーカイブ)である。
/etc/magic にローカルの定義を追加する際は、これらのキーワードを保護するようにする。
ユーザはディレクトリ内の全ての読み取り可能なファイルは "text" が表示されることを当てにしている。
Berkeley が行ったような、"shell commands text" を "shell script" に変更するようなことはしてはいけない。

ファイル・システムのテストはシステム・コールである stat(2) からの結果の分析を元にしている。
プログラムは、そのファイルが空か、ある種の特別なファイルかをチェックする。
実行中のシステムにふさわしいなんらかのファイル形式(システムで実装されているソケット、シンボリック・リンク、名前付きパイプ( FIFO ))は、システム・ヘッダ・ファイル に定義されているならすぐにわかる。

マジック・ナンバーのテストは、特定の固定形式のデータのあるファイルをチェックするのに使われる。
この標準的な例はバイナリの実行形式(コンパイルされたプログラム) a.out ファイルで、その形式は標準インクルードディレクトリの ともしかすると で定義されている。
これらのファイルは、ファイルの先頭近くの特定の場所に格納されていて、そのファイルがいろいろあるタイプの内のバイナリの実行形式であることを UNIX オペレーティング・システムに伝える"マジック・ナンバー"を持っている。
"マジック・ナンバー"の概念は、データ・ファイルに対する拡張子に応用されてきた。
ファイル内の小さな固定オフセットに不変の識別子のあるファイルは、通常この方法で判別される。
これらのファイルを識別する情報は /etc/magic やコンパイルされたマジック・ファイル /usr/share/misc/magic.mgc か、コンパイルされたファイルが存在しない場合はディレクトリ /usr/share/misc/magic 内のファイルから読まれる。
それに加えて、$HOME/.magic.mgc か $HOME/.magic が存在する場合は、それがシステムのマジック・ファイルに優先して使われる。

マジック・ファイルのエントリのどれにもファイルがマッチしない場合は、テキスト・ファイルかどうかが調べられる。
ASCII、ISO-8859-x、( Macintosh や IBM PC で使われているもののような )非 ISO 8-bit 拡張 ASCII 文字セット, UTF-8 エンコードされた Unicode、UTF-16 エンコードされた Unicode、EBCDIC 文字セットがそれぞれのセット内で印刷可能なテキストを構成する異なるバイトの領域や並びによって区別可能である。
もしファイルがこれらのテストのどれかを通ると、その文字セットがレポートされる。
ASCII、ISO-8859-x、UTF-8、拡張 ASCII ファイルは、ほぼどんな端末でも一般に読めるので"テキスト"として識別される。
UTF-16 と EBCDIC は、テキストを含んでいても読めるようになる前に変換を必要とするテキストなので、ただの"文字データ"である。
加えて、file コマンドはテキスト型のファイルの他の特徴を判定しようと試みる。
もしファイル中の行が Unix 標準の LF の代わりに CR、CRLF、NEL で終わっていたら、これは報告される。
組込み型のエスケープ・シーケンスや重ね打ちを含むファイルもまた識別される。

一旦 file コマンドがテキスト型で使われている文字セットを判定したら、そのファイルがどの言語で書かれているかを判定しようとする。
言語テストは、ファイルの最初の数ブロックのどこかに現れる特定の文字列( を参照)を探す。
例えば、キーワード .br は、struct というキーワードが C 言語のプログラムを示唆するように、そのファイルがおそらく troff(1) の入力ファイルであると示す。
これらのテストは前の2つのグループよりは当てにならないので最後に行われる。
言語テストのルーチンはまた、( tar(1) アーカイブのような)いくつかの雑録もテストする。

上に一覧した文字セットのどれかで書かれたものとして特定できないファイルは、単純に "data" と言われる。

オプション
-b, --brief
    出力行の先頭にファイル名を追加しない(簡素モード)。

-C, --compile
    マジック・ファイルやディレクトリの事前にパースしたバージョンを含む magic.mgc 出力ファイルを書く。

-c, --checking-printout
    マジック・ファイルのパースしたフォームの印刷出力をチェックする。
    これは通常 -m フラグと併用して新しいマジック・ファイルをインストールする前にデバッグするのに使われる。

-e, --exclude testname
    ファイル形式を判定するために作られたテストの一覧から testname 内で命名されているテストを除外する。
    有効なテスト名は:

    apptype  EMX アプリケーション型( EMX においてのみ)。

    asciiいろいろな型のテキスト・ファイル(このテストは 'encoding' オプションの設定に関わりなくテキストのエンコードを推測しようとする)。

    encoding ソフトウェア的なマジック・テストのための異なるテキスト・エンコード。

    tokens  後方互換性の無視。

    cdf Compound Document Files の詳細の表示。

    compress 圧縮されたファイルをチェックして内部を見る。

    elf ELF ファイルの詳細の表示。

    soft   マジック・ファイルを参考にする。

    tar tar ファイルを調べる。

-F, --separator separator
    ファイル名と返されるファイル結果の間のセパレータとして特定の文字列を使う。デフォルトは、':'。

-f, --files-from namefile
    引数リストの前に、(1行ずつの) namefile からファイルの名前を調べるために読む。
    namefile か最低ひとつのファイル名引数がなければならない。
    標準入力のテストには、ファイル名引数として '-' を使う。
    namefile は括らないことと、このオプションが現れて他のオプションの処理がなされる前に
    内包されているファイル名が処理されることに注意する。
    これは、同じファイル読み出しで、異なるコマンド・ライン引数によって複数ファイルのリストの処理を可能にする。
    したがって、もし区切り文字を設定したい場合は、"-f namefile -F @" ではなくて、"-F @ -f namefile" のように、ファイルのリストを指定する前に行う必要がある。

-h, --no-dereference
    (シンボリック・リンクをサポートするシステム上で)シンボリック・リンクに従わせないようにするオプション。
    環境変数 POSIXLY_CORRECT が定義されていない場合は、これがデフォルトである。

-i, --mime
    file コマンドに、より伝統的な人間に読めるものよりも、mime 形式の文字列を出力させる。
    したがって、"ASCII text" よりは "text/plain; charset=us-ascii" になる。

--mime-type, --mime-encoding
    -i のようだが、指定された要素だけを表示する。

-k, --keep-going
    最初のマッチングで止めずに継続する。
    後続のマッチングに、先頭に "\012" を追加した文字列があるかも知れない。
    (改行が欲しい場合は、-r オプションを参照。)
    最高強度のマジック・パターン( -l オプションを参照)が最初に来る。

-l, --list
    パターンとマッチングに使われる magic(4) の強度で降順にソートされた強度のリストを示す
    ( -k オプションも参照の事)。

-L, --dereference
    (シンボリック・リンクをサポートするシステム上で) ls(1) に命名されたオプションとして、シンボリック・リンクに従わせる。
    これは、環境変数 POSIXLY_CORRECT が定義されている場合はデフォルトである。

-m, --magic-file magicfiles
    マジック・ナンバーを含むファイルやディレクトリの代わりのリストを指定する。
    これは単独項目かコロンで区切られたリストが指定できる。
    コンパイルされたマジック・ファイルやディレクトリが見つかった場合は、代わりに使用される。

-N, --no-pad
    出力を整列させるためのファイル名の隙間を詰めない。

-n, --no-buffer
    それぞれのファイルのチェックの後で標準出力をフラッシュする。
    これはファイルのリストをチェックする場合にのみ有用である。
    パイプからファイル形式の出力をさせたいプログラムに使われることを意図している。

-p, --preserve-date
    utime(3) か utimes(2) をサポートするシステム上で、file コマンドが絶対にファイルを読まないと見せかけるために、解析されるファイルのアクセス時刻を保護しようとする。

-r, --raw
    表示できない文字を \ooo に変換しない。
    通常 file コマンドは表示できない文字を 8 進数表記に変換する。

-R, --recursion maxlevel
    間接的な型のマジックや名前の最大反復レベルを設定する。
    エントリの呼出しに使われる。
    デフォルトは 15。

-s, --special-files
    通常、file コマンドは stat(2) が普通のファイルであるとレポートする引数ファイルの型を呼んで判定しようとするだけである。
    特別なファイルを読むことは特別な結果になるので、これは問題を防ぐ。
    -s オプションを指定すると、file コマンドはまたブロックや文字の特別なファイルである引数ファイルを読む。
    これは、ブロックの特別なファイルである生のディスク・パーテーションのデータのファイル・システムの型を判定するのに役立つ。
    いくつかのシステム上では生のディスク・パーテーションはサイズ0とレポートされるので、このオプションはまた、stat(2) にレポートされるファイルのサイズを file コマンドに無視させる。

-v, --version
    プログラムのバージョンを表示して終了する。

-z, --uncompress
    圧縮ファイルの中を見ようと試みる。

-0, --print0
    ファイル名の最後にヌル文字 '\0' を出力する。
    出力を cut(1) するのに使える。これは固定で表示されるセパレータには影響しない。

--help ヘルプ・メッセージを表示して終了する。

ファイル
/usr/share/misc/magic.mgc  デフォルトのコンパイルされたマジックのリスト
/usr/share/misc/magic    デフォルトのマジック・ファイルのあるディレクトリ

環境変数
環境変数 MAGIC は、デフォルトのマジック・ファイル名を設定するのに使うことができる。
この変数が設定されていると、file コマンドは $HOME/.magic をオープンしようとしない。
file コマンドは、".mgc" を妥当としてこの変数の値に追加する。
しかしながら、file コマンドは file.mime を考慮するために存在しなければならないわけではない。
環境変数 POSIXLY_CORRECT は(シンボリック・リンクをサポートするシステム上で) file コマンドがシンボリック・リンクに従おうとするかどうかを制御する。
もし設定されていれば、file コマンドはシンボリック・リンクに従い、そうでなければ従わない。
これはまた、-L と -h オプションでも制御される。

関連項目
magic(5), hexdump(1), od(1), strings(1),

標準への準拠
このプログラムは、FILE(CMD) の System V インターフェース定義をしのぐと信じられていて、その点を含む曖昧な言語からほとんど確定できる。
その振る舞いは、同名の System V プログラムとほぼ互換性がある。
このバージョンはもっとマジック・ナンバーがわかるが、多くの場合に異なる(にもかかわらずより正確な)出力を提示する。

このバージョンと System V とのひとつの重要な違いは、このバージョンはどんなホワイト・スペースも区切り文字として扱うので、パターン文字列内のスペースはエスケープされなければいけない。
例えば、

   >10 string language impress (imPRESS data)

既存のマジック・ファイルでは、以下のように変更されなければならない

   >10 string language\ impress (imPRESS data)

それに加えて、このバージョンでは、もしパターン文字列ばバックスラッシュを含んでいる場合は、エスケープされなければいけない。
例えば、

   0 string \begindata Andrew Toolkit document

既存のマジック・ファイルでは、以下のように変更されなければならない

   0 string \\begindata Andrew Toolkit document

Sun Microsystems の SunOS releases 3.2 以降には System V から派生した file コマンドが含まれているが、いくつかの拡張がある。
このバージョンは、Sun のものとは小規模ではあるが異なる。
例えば、'&' 演算子として使われる拡張が含まれる。

   >16 long&0x7fffffff >0 not stripped

マジック・ディレクトリ
マジック・ファイルのエントリは、主に USENET のようないろいろなソースから収集されていて、いろいろな作者に貢献されている。
Christos Zoulas (アドレスは下記) は、追加もしくは訂正済みのマジック・ファイルのエントリを収集している。
統合されたマジック・ファイルのエントリは、定期的に配布されている。

マジック・ファイルのエントリの順序は重要である。
どんなシステムを使っているかによっては、編集された順序は正しくないかも知れない。

$ file file.c file /dev/{wd0a,hda}
file.c: C program text
file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), stripped
/dev/wd0a: block special (0/0)
/dev/hda: block special (3/0)

$ file -s /dev/wd0{b,d}
/dev/wd0b: data
/dev/wd0d: x86 boot sector

$ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}
/dev/hda: x86 boot sector
/dev/hda1: Linux/i386 ext2 filesystem
/dev/hda2: x86 boot sector
/dev/hda3: x86 boot sector, extended partition table
/dev/hda4: Linux/i386 ext2 filesystem
/dev/hda5: Linux/i386 swap file
/dev/hda6: Linux/i386 swap file
/dev/hda7: Linux/i386 swap file
/dev/hda8: Linux/i386 swap file
/dev/hda9: empty
/dev/hda10: empty

$ file -i file.c file /dev/{wd0a,hda}
file.c: text/x-c
file: application/x-executable
/dev/hda: application/x-not-regular-file
/dev/wd0a: application/x-not-regular-file

履歴
少なくとも Research Version 4 ( man のページの日付が November, 1973 ) 以降あらゆる UNIX に file コマンドはある。
System V バージョンはひとつの大規模な主要な変更を発表した:マジック・タイプの外部リストである。
これはプログラムを少し遅くしたが、より一層柔軟になった。

System V バージョンを元にしたこのプログラムは、他人のソース・コードを見ずに Ian Darwin (ian@darwinsys.com) によって書かれた。

John Gilmore は、広範囲に渡ってコードを改訂して、最初のバージョンより良くした。
Geoff Collyer はいくつかの欠点を見つけて、マジック・ファイルのエントリのいくつかを提供した。
1989 年、Rob McMahon (cudcv@warwick.ac.uk) が '&' 演算子で貢献した。

1993 年から現在に至るまで、Guy Harris (guy@netapp.com) は多くの変更をした。

主な開発と保守は、1990 年から現在に至るまで Christos Zoulas (christos@astron.com) に行われている。

2000 年、Chris Lowth (chris@lowth.com)のよる変更:代わりのマジック・ファイルを内部ロジックを使って、-i オプションで mime 型文字列の出力を扱う。

2000 年 7 月、Eric Fischer (enf@pobox.com) が、文字コードを識別して、非 ASCII ファイルの言語を識別しようと変更した。

2007-2011 年、Reuben Thomas (rrt@sc3d.org) が、MIME のサポートの強化、MIME と非 MIME のマジック・ナンバーの統合、マジック・ナンバーのファイルと同様のディレクトリのサポート、多くのバグの修正の適用、多くのマジック・ナンバーの更新と修正、ビルド・システムの改善、ドキュメントの改善、純粋な Python による Python の関連付けの書き直し、の変更をした。

'magic' ディレクトリ(マジック・ファイル)への貢献者のリストは長すぎてここには掲載できない。
あなたのことだ;ありがとう。多くの貢献者はソース・ファイルの中にリストされている。

法的注意事項
Copyright (c) Ian F. Darwin, Toronto, Canada, 1986-1999.
Berkeley Software Distribution の標準著作権が適用される。ソース・ディレクトリのファイル COPYING を参照。

ファイル tar.h と is_tar.c は、John Gilmore によって彼の tar(1) プログラムから書かれ、上記のライセンスは適用されない。

返り値
file コマンドは、成功時に 0、エラー時に非 0 を返す。

バグ
バグ報告、http://bugs.gw.com/ やメーリング・リスト file@mx.gw.com でのバグ・トラッカーへのパッチをお願いします。

すべきこと
MIME と APPLE フラグのテストが至る所で必要なわけではなく、実際の出力は一ヵ所だけでなされるので、出力を修正する。
これには設計が必要である。
提案:可能な出力をリストにプッシュして、最後の最新のプッシュ(もっとも明確でひとつを希望)の値を拾い上げるか、もしリストが空ならデフォルトを使う。
これは評価を遅くするべきではない。

全てのマジック・ナンバーのバグを制圧し続ける。よい情報源として Debian BTS を見る。

例えば %s 形式のために、任意の長さの文字列を格納して、画面表示できるようにする。
Debian のバグ #271672 を修正する。より複雑な格納/ロードのコードが初心者に必要。

現在のレベルの後に相対オフセットのための構文を追加する(Debian のバグ #466037)。

file -ki を動作するようにする。すなわち、複数の MIME 形式を与える。

Office2007 のドキュメントをのぞいてそれが何であるかを把握できるように、zip ライブラリを追加する。

ファイル記述の情報源のための URL を表示するオプションを追加する。

スクリプト検索を統合して、MIME 形式に実行形式の名前を配置する方法を追加する(例えば、!:mime というマジック値があると、文字列をテーブルの中に見に行く結果になる)。
これは、それぞれの新しいシバン・インタープリタに同じマジック・ナンバーを繰り返し追加するのを避ける。

"name" と "use" を修正してコンパイル時の一貫性をチェックする(二重の "name" と "use" が定義されていない "name" を指している)。
名前のソートされたリストを維持して、"name"/"use" をもっと効率よくする。
パーサのエンディアンを反転する特別なケース ^ を、エスケープされなくていいようにして文書化する。

有用性
オリジナルの作者の最新版は、 anonymous FTP の ftp.astron.com の /pub/file/file-X.YZ.tar.gz ディレクトリで得ることができる。

BSD              October 25, 2012              BSD


記述に際しては、細心の注意をしたつもりですが、間違いやご指摘がありましたら、こちらからお知らせいただけると幸いです。


←「Linux コマンド辞典「pwgen」」


« 戻る