本記事は生成AIと共同で執筆しています。事実関係は可能な範囲で公式ドキュメント等と照合していますが、誤りが含まれている可能性があります。重要な判断を行う前にご自身でも一次情報をご確認ください。
デジタルアーカイブの SIP(Submission Information Package、OAIS における移管単位)作成ワークフローでは、移管されてきたファイル群に対してフォーマット識別(Siegfried)とウイルスチェック(ClamAV)をかけるのが一般的です。CCA-Public/sipcreator が利用する Brunnhilde も、Siegfried を核に、オプションで ClamAV を呼べる構成になっています(-n/--noclam で無効化でき、Windows では自動スキップされます)。
この ClamAV を macOS 単体で動かして動作確認しようとしたところ、検証用の EICAR テストファイルがディスクに置いた瞬間に消える、という挙動に遭遇しました。最初は「macOS の XProtect が消したのだろう」と考えたのですが、確認したところ原因は別でした。その経緯を記録しておきます。
環境は Apple Silicon(arm64)/ Homebrew / ClamAV 1.5.2 です。
注意: 本記事の「ディスクに置いた瞬間に消える」現象は、筆者の Mac に常駐型のアンチウイルス(Trend Micro Apex One)が入っていたために起きたものです。常駐のオンアクセス型アンチウイルスが入っていない macOS 単体では、同じようには再現しない可能性があります。
EICAR テストファイルとは
実マルウェアを使わずにアンチウイルスの検知動作を確認するための、無害なテスト用文字列です。EICAR(European Institute for Computer Antivirus Research)が定めたもので、実行しても EICAR-STANDARD-ANTIVIRUS-TEST-FILE! と表示するだけで、ウイルスのコードは含まれていません。取り決めとして、多くのアンチウイルス製品がこれを「ウイルス」として検知します。署名本体は次の 68 バイトです(仕様上はこの後ろに空白・改行が付いて最大 128 バイトまでが有効な EICAR ファイルとして扱われます)。
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
セットアップ
Homebrew で導入します。インストール直後は *.conf.sample しか置かれないため、freshclam.conf を作成します。サンプルの先頭付近にある Example の行を残したままだと「設定が未編集」とみなされて freshclam/clamd が起動を拒否するので、無効化します。
brew install clamav
# freshclam.conf を sample から作成(先頭の Example 行を無効化)
SAMPLE=$(brew --prefix)/etc/clamav/freshclam.conf.sample
sed 's/^Example/#Example/' "$SAMPLE" > "${SAMPLE%.sample}"
# ウイルス定義をダウンロード
freshclam

freshclam 実行時に ERROR: NULL X509 store という警告が出ることがあります。

これは Homebrew 版 ClamAV を macOS で動かしたときに報告されている表示で(clamav#1421)、Database test passed. が出ていれば定義の取得自体は成功しています。調べた限りでは、この issue は報告者自身がクローズしていますが、メンテナによる修正や公式な「無害」の判断で閉じられたものではなく、報告者が別ツールへ移行して取り下げた形のようです。実害が出ていないことは確認できますが、原因は未確定という理解にとどめておくのが無難です。
ファイルを置いてスキャンすると消える
EICAR ファイルと正常ファイルを置いてディレクトリスキャンすると、次のようになりました。ls の時点では 2 ファイルとも存在しているのに、clamscan は 1 ファイルしか走査できず、EICAR ファイルを名指しでスキャンすると「存在しない」と返ってきます。

ls で見えていたファイルが、clamscan が開く前に消えている状態です。
原因の切り分け
XProtect を疑ったが該当しなかった
macOS には XProtect という組み込みのマルウェア対策があり、最初はこれが消したと考えました。ただ、調べ直すと XProtect は「書き込み即時」のオンアクセス型スキャナではないようです。
- XProtect のシグネチャ検知(YARA ルール)が動くのは、アプリの初回起動時、ファイル変更時、Gatekeeper の隔離属性が付いたファイルを開いたとき、といった離散的なイベントです。
- EICAR の駆除を担当する
XProtectRemediatorEicarは、XProtect Remediator の定期スキャン(数時間〜24 時間間隔)で動くもので、write()をフックしてリアルタイムに消す仕組みではありません。
実際、該当しそうな時間帯の XProtect の活動ログを見ても、関連するエントリは出ませんでした(観測用の述語は次のとおりです)。
log show --last 5m --predicate 'subsystem == "com.apple.XProtectFramework.PluginAPI"'
常駐していたサードパーティ製アンチウイルスが原因だった
筆者の Mac には常駐型の Trend Micro Apex One が入っており、こちらがオンアクセス(書き込み時)スキャンで EICAR を検知し、リアルタイムに隔離していました。隔離の記録はアンチウイルス側のログにも残っていました。XProtect と異なり、EDR(Endpoint Detection and Response)や法人向けのエンドポイント製品は、ファイル書き込みを契機に走るオンアクセス・エンジンを持つため、clamscan が触れる前にファイルが消えます。
ここに Apex One(ウイルスバスター)の隔離通知・隔離ログのスクリーンショットを差し込む予定です。
念のため、3 種類のファイルを同時に置いて、2 秒後にどれが残るかを観察しました(常駐アンチウイルスが動いている環境での観察です)。
| ファイル | 内容 | 2 秒後 |
|---|---|---|
benign.txt | 普通のテキスト | 生存 |
mentions-eicar.txt | "EICAR" という単語は含むが署名ではない | 生存 |
raw-eicar.txt | 本物の EICAR 署名 | 削除 |
eicar.b64.txt | EICAR を base64 化したもの | 削除 |
「EICAR」という単語を含むだけのファイルは残り、本物の署名を含むファイルだけが消えました。base64 エンコードした変種も消えています。なお ClamAV 自体は base64/base32 化された EICAR を検知しないことが知られている(clamav#1332)ため、この削除は ClamAV ではなく常駐アンチウイルス側の動作だと考えられます。
調べた限りでは、ファイルが勝手に消える場合、まず常駐している EDR / 法人向けアンチウイルスを確認するのがよさそうです。管理された Mac には、Apex One や Microsoft Defender、CrowdStrike などがオンアクセスで動いていることがあります。
stdin 経由でスキャンする
ディスクに書き込まなければ、常駐アンチウイルスのオンアクセス・スキャンの対象になりません。clamscan - で標準入力から流し込みます(- が標準入力を表すのは公式に文書化された挙動です)。

Eicar-Test-Signature FOUND(終了コード 1)が出て、ClamAV が正しく検知しました。macOS 上でも ClamAV 本体は問題なく機能していることが確認できます。
ClamAV 1.5.2 は 2026-03-04 リリースの安定版です。1.4.x が LTS、1.5.x が feature 安定ラインで、Homebrew の formula 更新のタイミングでどちらが入るかは変わりえます。
まとめ
- ClamAV 1.5.2 は macOS(Apple Silicon)で動作します。セットアップは
brew install、freshclam.confの Example 行の無効化、freshclamの 3 手順です。 - EICAR がディスク到達と同時に消えたのは XProtect ではなく、常駐していた Trend Micro Apex One によるものでした。ファイルが消えるときは、OS の機構より先に常駐アンチウイルスを確認するのがよさそうです。テスト検証は
clamscan -(標準入力)で行うと、常駐アンチウイルスに掴まれずに済みます。 - 管理された macOS では、OS レベルの XProtect(イベント駆動・定期スキャン)に加えて、法人 EDR のオンアクセス保護が効いていることがあります。born-digital 中心でリスクが小さいワークフローであれば、アプリ本体に ClamAV を同梱せず、必要なときだけ別途回すという構成も選択肢になります。
検証で導入した ClamAV は、不要であれば次のコマンドで削除できます。
brew uninstall clamav
コメント
…