まえがき
Ubuntu 12.10(kernel 3.5)上で、COMODO AntiVirus for Linuxは一応動くようですが、カーネルソースを見ると若干APIの仕様が変わっていて、redirfsのコンパイル時に警告が出ます。
パラメータがintからumode_tに変わったところが数か所。
kernel 3.6以上では、そのAPI自体が変わっていて、コンパイルがエラーで通らなくなります。
あまりにもくやしいので、avfltとredirfsにパッチを入れて無理矢理動くようにしました。

なお、ソース解析中にいろいろと問題を見つけたのも随時修正しています。覚えているだけで以下。
  • Kernel APIの非互換を対応した。
    前は頻繁に変更されていたが、最近は落ち着いている。
  • 旧redirfs-devのサイトに出ていた、COMODO版以降に発見された問題の吸収をした。
    spin_lockして解除していない部分があったかと思う。
  • メモリ確保、解放の仕方を間違えていて、結果的に解放が多かった。
    解放の中でdputを余計に出していて、dput関数の仕様変更により、Kernel 2系ではPanicしないのが、Kernel 3系ではBUG_ONに引っかかってPanicする。不定期にPanicするという報告があったのは、これが原因と思われる。
  • 戻り値とエラーチェックで不整合があった(直し切れていない)。
    例えば、エラー時にNULLや負数を返すところで、呼び出し元のエラーチェックがそうなっていない等。
  • 一部のAPIで特定条件のときに戻り値が不定値になる場合があった。下記のような感じ。
    int rv;

    if (hogehoge1){
    • if(hogehoge2)
      • rv=xxxx;
    • else
      • rv=yyyy;
    }

    return rv;

    ※hoge1のelseがない。
  • avfltでdgetとdputが入れ子になっていない箇所があり、リークが発生した。
    解放漏れの蓄積により、リブート時にハングアップする、xxxx Busyが出る、次の起動でリカバリが走る等の症状が発生。
    これは3.5まではカーネルAPI内部でdputしていたのが、3.6以降はしなくなったことに起因する。
  • どれかのカーネル以降で仕様変更によりAPIがロック状態で呼ばれることがあり、デッドロックした。apt-get updateをやると必ずデッドロックしていた。ロック時に警告をログ出力するようにしていたが、特に問題なさそうなので、警告出力をやめた。
  • 3.15でfile_operation構造体にrename2というのが出来たようだ。3.16までは特に呼ばれていないため、動作上は動いているように見える。
    rename2に対応するように修正中。
  • 3.17でvfs_renameのやり方が変わったようだ。rename2も積極的にコールされていることと、renameとrename2の両方に関数が書かれているとWARN_ONするようだ。

    以前 
    if (!old_dir->i_op->rename2) {
      error = old_dir->i_op->rename(old_dir, old_dentry,
      new_dir, new_dentry);
    } else {
      WARN_ON(old_dir->i_op->rename != NULL);
      error = old_dir->i_op->rename2(old_dir, old_dentry,
      new_dir, new_dentry, flags);
    if (!flags) {
      error = old_dir->i_op->rename(old_dir, old_dentry,
      new_dir, new_dentry);
    } else {
      error = old_dir->i_op->rename2(old_dir, old_dentry,
      new_dir, new_dentry, flags);
    }
     
  • 一部のディストリビューションでd_childのメンバ仕様を変更しているようで、ビルドエラーが出る。

Kernel 3.19まで、リアルタイムでテストウィルスを検出することを確認済です。
そのうち本家も対応してくれるでしょう。期待。

このテストはvmwareに入れているテスト環境とこのサーバの実環境で稼働しています。

なお、いつものように菌XP_SP1の独自実験ですので、何も保証はありません。
自己責任でお願いします。最悪は起動しなくなるかも。。。

COMODO AntiVirus for Linuxの入手とインストール
ここからインストーラをダウンロードして普通にインストールしてください。
現時点最新はv1.1.268025.1です。
インストールの仕方は色々とサイトに出ているので、そちらを参照してください。
最後に「post_setup.shを実行せよ」と出てくるので、このコマンド実行の直前で以下の手順を挟み込みます。

パッチ版ドライバのダウンロードとインストール
パッチ版のdriver.tarをダウンロードしてください。
fix_rebuild_driver.shがダウンロード欄にある場合はそれもダウンロードしてください。

/opt/COMODOの直下にあるファイルをダウンロードしたファイルで上書きします(解凍は不要)。

#sudo cp {ダウンロードしたディレクトリ}/driver.tar /opt/COMODO/driver.tar

fix_rebuild_driver.shをダウンロードした場合はこれも/opt/COMODOにコピーして属性を変更します。

#sudo cp {ダウンロードしたディレクトリ}/fix_rebuild_driver.sh /opt/COMODO/driver.tar
#sudo chmod +x /opt/COMODO/fix_rebuild_driver.sh

driver.tarのコピーをdriver.newとして同じディレクトリに保存しておきます。
後述の"注意点・その他"の1.で使います。

#sudo cp /opt/COMODO/driver.tar /opt/COMODO/driver.new

続けて、以下のコマンド入力から従来の手順に戻ります。

#cd /opt/COMODO
#sudo ./post_setup.sh

post_setup.shの実行で以下のエラーが出ることがあります。

FATAL: Error inserting avflt (/lib/modules/3.9.0-rc8-test/extra/avflt.ko): Invalid argument
RedirFS kernel modules installation failed.

その場合は、以下をお試しください。一部、省略できる手順もあるかもしれませんが、、、
  • そのままリブートする
  • post_setup.shを再度実行する
  • Diagnosticsで問題が検出された場合は解決する
  • 再度、リブートする
  • Diagnosticsで問題がないことを確認する
OS起動後にすぐCOMODOのウィンドウを開くと、左の絵が赤くなり、リアルタイム監視が動いていないように表示されますが、1分程度放置しておくと(正常なら)青く変わります。

また、d_childメンバ関連のビルドエラーが出た場合は、以下のコマンドを実行してください。
#sudo ./fix_rebuild_driver.sh
注意点・その他
  1. "Check for Updates"を実行すると「更新あり」と判断されてdriver.tarが元に戻ってしまうようです。
    これを実行した場合はリブートする前にコピーしたdriver.newでdriver.tarを再度上書きしてください。
    自動で"Check for Updates"が走ることはないみたいですが、もしも自動で走ることが確認できたら、その手順をここで公開します。
  2. reboot時に一瞬、Busy的な表示が出ています。
    version 0.3-pre3のCHANGELOGに以下の記載があり、どうやら、アンロードできない仕様になったようです。
    - redirfs is now a permanent module which cannot be unloaded
    無理矢理にmodule_exitのロジックを入れてみたのですが、lsmodでも常に使用中が出ていて、アンロードできませんでした。
    一部の情報ではシャットダウン時にハングアップするというのもありますが、恐らくはこれが影響していると思われます。