# Clam Antivirusに関するメモ

作成日: 2002年8月16日

作成者: 小川真樹

## 1. Clam Antivirus

### 1.1 Clam Antivirusについて

Clam AntivirusはTomasz Kojmによる、各種UNIX系のシステム(MacOSXも含む)で動作するアンチウィルスソフトです。WindowsでもCygwin上で動作するようです。オープンソースで、GPLライセンスに基づいて利用することができます。また、同じくフリーのOpenAntiVirus(http://www.openantivirus.org/)プロジェクトのウィルスデータベースを利用しています。

### 1.2 ホームページ

Clam Antivirusについての最新かつ正確な情報、ソースコードはhttp://clamav.elektrapro.com/にあります。

## 2. Clam AntiVirusのインストール

### 2.1 Clam AntiVirusの入手

ソースコードはhttp://clamav.elektrapro.com/から入手することができます。2002年8月16日時点での最新のバージョンは0.23のようです。

### 2.2 clamavユーザの作成

Clam Antivirusをインストールする前に'clamav'というユーザとグループを作成する必要があります。(Cygwinではこの作業は必要ありません。)

      LinuxやSolarisの例

        # groupadd clamav
        # useradd -g clamav -s /bin/false -c "Clam Antivirus" clamav

      MacOSXの例(この例ではuidとgidを402で作成しています)

        $ sudo niutil -create / /groups/clamav
        $ sudo niutil -createprop / /groups/clamav gid 402
        $ sudo niutil -createprop / /groups/clamav passwd '*'
        $ sudo niutil -create / /users/clamav
        $ sudo niutil -createprop / /users/clamav uid 402
        $ sudo niutil -createprop / /users/clamav gid 402
        $ sudo niutil -createprop / /users/clamav passwd '*'
        $ sudo niutil -createprop / /users/clamav realname 'Clam Antivirus'
        $ sudo niutil -createprop / /users/clamav home /dev/null
        $ sudo niutil -createprop / /users/clamav shell /dev/null

      ※NetInfo Managerを使ってGUIで作成してもかまいません。

### 2.3 コンパイル・インストール

他の多くのソフトと同様の手順でコンパイルおよびインストールできるでしょう。GNU makeが必要になります。

     $ zcat clamav-0.23.tar.gz | tar xvf -
     $ cd clamav-0.23
     $ ./configure
     $ make
     $ sudo make install

## 3. ウィルスのスキャン

### 3.1 clamscan

clamscanコマンドを使って、ウィルスに感染しているファイルがないか検査します。

#### 3.1.1 主なコマンド実行例

$ clamscan <file>
  ファイルを検査します。
$ cat <file> | clamscan -
  標準入力のデータを検査します。
$ clamscan
  現在のディレクトリにあるファイルを検査します。
$ clamscan -r [<dir>]
  ディレクトリとサブディレクトリにあるファイルを再帰的に検査します。

### 3.2 圧縮ファイルのスキャン

圧縮されたファイル等、なんらかの形式で加工されたファイルを検査するためには、それらを一度元のファイルに戻す必要があります。たとえば、「clamscan /var/spool/mail」を実行しても、メールスプール内の添付ファイルを正しく検査することができません。また、MacOSXにおいて「clamscan -r ~/Library/Mail」を実行しても、同様にMail.appのメールデータを正しく検査することはできません。

ただし、一部の圧縮フォーマットについては、clamscanコマンドにそれぞれのオプションをつけることで外部コマンドを利用して解凍しながら検査することが可能です。このときに「-r」オプションを併用すると、再帰的に解凍しながら検査します。また、圧縮されたファイル自体がウィルスに感染しているかどうかも検査されます。

#### 3.2.1 圧縮ファイル用の主なオプション

--unzip[=/path/to/unzip]
  .zip形式のファイルを検査します。
--unrar[=/path/to/unrar]
  .rar形式のファイルを検査します。
--lha[=/path/to/lha]
  .lzh形式のファイルを検査します。
--tar[=/path/to/tar]
  .tar形式のファイルを検査します。GNU tarが必要です。
--tgz[=/path/to/tar]
  .tgzおよび.tar.gz形式のファイルを検査します。GNU tarが必要です。
--jar[=/path/to/unzip]
  .jar形式のファイルを検査します。
--deb[=/path/to/ar]
  .deb形式のファイルを検査します。

## 4. ウィルス定義データベース

### 4.1 データベース

Clam Antivirusのウィルス定義データベースは、デフォルトでは/usr/local/share/clamav/viruses.dbにインストールされます。最新のウィルスに対応するためにはこのファイルをこまめに更新する必要があります。

また、バージョン0.23以降では、このviruses.dbと同じディレクトリにexample.dbのようなファイル名の末尾に「.db」を含むファイルがある場合は、そのファイルもウィルス定義データベースとして使用するようになっています。つまり標準のウィルス定義データベースに加えて独自作成もしくはサードパーティ製のデータベースを併用することが可能です。

### 4.2 freshclam

### 4.3 oav-update

## 5. AMaViSを利用した電子メールのスキャン

### 5.1 AMaViS-perl

AMaViS-perlとClam Antivirusを連係させて使用すると、サーバサイドでの電子メールのウィルススキャンをさせることができます。

使用するためにはClam Antivirusのソースコードに含まれているパッチ(support/amavis/clamavis.patch)を使ってAMaViS-perlをClam Antivirusに対応させる必要があります。まずはhttp://www.amavis.org/からamavis-perl-11.tar.gzを入手します。それから以下のような手順でパッチをあてます。

     $ tar zxpvf amavis-perl-11.tar.gz
     $ cp clam-0.23/support/amavis/clamavis.patch amavis-perl-11
     $ cd amavis-perl-11
     $ patch -p1 < clamavis.patch
     $ find . -exec touch 01010000 {} ＼;

パッチをあてた後は、通常のAMaViS-perlのインストール手順と同じようにインストール・設定・使用することができます。AMaViS-perlについての詳細な情報についてはhttp://www.amavis.org/を調べて下さい。

### 5.2 AMaViS-ng

AMaViS-ngはパッチをあてるまでもなくデフォルトでClam Antivirusに対応しています。また、AMaViS-perlに比べて若干インストールが楽です。が、MIME構造の壊れたメールなどの配送を保留してしまったりするのが少し困りものです。

AMaViS-ngはhttp://sourceforge.net/projects/amavisから入手できます。インストール後に、amavis.confの次のような行のコメントを外します。

     virus-scanner = CLAM

それから、同じくamavis.confの[CLAM]セクションにclamscanのpathを設定します。

    [CLAM]

    clamscan = /usr/local/bin/clamscan

## 6. ウィルスシグネチャ

### 6.1 ClamAV-Test-Signatureのシグネチャ

ClamAV-Test-SignatureはClam Antivirusに含まれているテスト用のウィルス(動作確認用のもので実際には害をもたらさない)です。ソースコードではtest/test1にあります。このファイルがどのようになっているか見てみましょう。

     $ cat test/test1
     $CEliacmaTrESTuScikgsn$FREE-TEST-SIGNATURE$EEEEE$

一方、このClamAV-Test-Signature用のシグネチャは次のようになっています。

     $ grep ClamAV-Test-Signature /usr/local/share/clamav/viruses.db
     ClamAV-Test-Signature=2443456c6961636d615472455354755363696b67736e24465245452d544553542d5349474e4154555245244545454545240a

「=」の左側がウィルスの名前、右側がウィルスのシグネチャ本体であることがわかると思います。では、このシグネチャはどのようにして作成されたのでしょうか。その前にとりあえずClamAV-Test-Signatureのファイルを16進数で出力してみましょう。これはSolarisでの実行例です。

     $ od -t x1 test1
     0000000 24 43 45 6c 69 61 63 6d 61 54 72 45 53 54 75 53
     0000020 63 69 6b 67 73 6e 24 46 52 45 45 2d 54 45 53 54
     0000040 2d 53 49 47 4e 41 54 55 52 45 24 45 45 45 45 45
     0000060 24 0a
     0000062

もうお分りいただけたと思います。シグネチャの正体はウィルス(の断片)をhexdumpしたものだったんですね。このClamAV-Test-Signatureの場合はファイルが小さいので全体をhexdumpしていますが、通常はファイルの一部を使います。

### 6.2 シグネチャの作成

シグネチャを作成するにはウィルスのデータをhexdumpすればよいことがわかりました。このシグネチャと一致する箇所をもつファイルをウィルスに感染しているとみなすわけです。

ところが、ウィルスに感染したファイルをそのままhexdumpしたものをシグネチャとして配布してしまうと、ウィルスそのものを配布しているのと変わりありません。また、シグネチャそのものが肥大化してしまうので、それを読みこむアンチウィルスソフトの負担が大きくなります。また、感染したファイルごとに形を変えるようなタイプのものに対しては効果がありません。

したがって、シグネチャの作成のために抽出する箇所は次のような条件を満たす必要があります。

- 手頃な長さであること
- そのウィルスに感染したファイルに必ず含まれること
- そのウィルスに感染していないファイルには含まれないこと
- それだけでは無害であること

これらの条件をみたすようなシグネチャを作成するためには、まずウィルスに感染したファイルを入手する必要があります。また、同じウィルスに感染したファイルを、別の経路から複数入手するか、あるいは一つのウィルスを閉じられた環境で培養してみて、該当のウィルスの性質などについてより深く調べる必要があるでしょう。また、当然のことですが、たとえばWindowsに感染するウィルスのシグネチャをWindows上で作成するのは危険です。

シグネチャを作成したら、ウィルス定義データベースに登録しましょう。Clam Antivirusの標準のデータベースファイルはviruses.dbですが、このファイルに追加すると、データベースを更新するときに上書きされて失われてしまうので、たとえばlocal.dbというような名前のファイルを新規に作成し、そこに追加していくとよいでしょう。

### 6.3 sigtool

このように、「どの部分をシグネチャに採用するか」という問題のために、自力で良質なシグネチャを作成するのはやや困難であるといえるでしょう。Clam Antivirusに含まれるsigtoolコマンドは、このシグネチャの作成を支援するものです。

sigtoolは、ウィルスに感染したファイルを細切れにして、それを他のウィルススキャナにかけ、そのウィルススキャナが細切れにされたファイルからウィルスを検出するかを調べます。そういったことをくり返して、その他のウィルススキャナが、どの部分をウィルスとして検出するかを正確につきとめます。そしてその部分をhexdumpします。

sigtoolでシグネチャを作成するためには以下の条件が必要です。

- ウィルスに感染したファイルがある
- そのウィルスをClam Antivirusでは検出できない
- ほかのウィルススキャナでは、そのウィルスを検出できる
- そのウィルススキャナがコマンドラインでのインターフェースを持ち、なおかつ標準出力にウィルス検出時の固有のメッセージを出力する

仮にこの他のウィルススキャナのコマンド名を「otherscan」とし、ウィルスに感染したファイルを「virus.exe」とします。また、このotherscanコマンドがvirus.exeからウィルスを検出したとき「infected」という文字列が標準出力に出力するメッセージに含まれるものとします。

これらの条件下でsigtoolを次のように実行します。

     $ sigtool -c "otherscan" -f virus.exe -s "infected"

このコマンドを実行すると、「virus.exe.sig」というファイルにシグネチャを出力します。これだけではまだOpenAntivirusのシグネチャのフォーマットの右辺だけで不充分ですので、適切なウィルスの識別名を左辺に設定します。

## 7. フリーのアンチウィルスについて

OpenAntiVirusをはじめとするフリーのアンチウィルスプロジェクトは、いまだに商用のものには、足もとさえ全く及びません。何もしないよりはましかもしれませんが、現在のところ、Clam AntivirusやOpenAntiVirus等を導入したからといって、十分であるとは到底言えない状況です。2002年8月16日の時点で、検出できるウィルスの種類は1800にも届いていません。また、OpenAntiVirusのウィルス定義データベースの現在の最終更新日付は7月1日で、1ヵ月半以上更新されていません。

## 8. この文書について

### 8.1 ライセンスなど

この文書はGNU General Public Licenseに基づいています。

この文書は小川真樹がClam Antivirusについて調べたもので、忘れないように記録したものをまとめたものです。 この文書の内容についての意見や感想、あるいは誤りの指摘についてはproc@mac.comまでご連絡下さい。

### 8.2 免責事項

ここに書かれてあるものは完全に無保証です。ここに書かれてあることをそのまま実行してそのとおりに動作する保証は全くありません。特にシグネチャの作成の部分については、他にまとまった資料らしいものをみつけられなかった(もしそういった資料について知っている方がいたら教えてください)こともあって、間違ったことを書いている可能性が比較的高いです。

戻る