EICARテストファイル作成でハマる
アンチウイルスソフトの動作テストをするのに、本物のウイルスを使う人はおらんだろう。いやおらんよね??
そこでテスト用のウイルスを使うことになる。普通はEICARテストウイルスデータを使うんではなかろうか?
下記の68バイトの文字列がEICARテストウイルスの正体。
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
これはDOS実行形式になっているらしく、Windowsだったらeicar.com
みたいなファイル名で保存して実行出来るらしい。もちろん実行してもEICAR-STANDARD-ANTIVIRUS-TEST-FILE!
という文字列が表示されるだけで、悪事を働くことは無い。
このテストファイルを作る際に、テキストエディタにコピペして保存するのが普通か。ただMacやLinuxなどのUNIXマシンで作るなら、シェルのCUI上で作成する方が簡単。しかしまさかハマることになるとは・・・・
さて、下記のようにechoコマンドとcatコマンド使ってEICARテストファイルを作ることを考える。この中で失敗してしまうのはどれだろうか??
# 1. $ echo X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* > eicar.com # 2. $ echo "X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*" > eicar.com # 3. $ echo 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > eicar.com # 4. $ cat > eicar.com X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* ^D【Ctrl-Dを押す】 # 5. $ cat <<EOF > eicar.com X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* EOF # 6. $ cat <<'EOF' > eicar.com X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* EOF
では失敗する場合の解答。1、2、5だ。
1と2の場合は、!
がbashの機能でコマンド履歴とみなされてしまうから。この場合はエラーメッセージが出るので気付きやすい。
$ echo "X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*" > eicar.com -bash: !P%@AP[4\PZX54: event not found $ echo X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* > eicar.com -bash: !P%@AP[4\PZX54: event not found
問題は5だ。実際に実行してみる。
$ cat <<EOF > eicar.com > X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* > EOF
エラーメッセージとかは特に出てこない。上手くいったっぽいぞ。しかしこのファイル、アンチウイルスソフトが検知してくれない・・・何でだ??
念のためファイルの中身を確認してみる。
$ cat eicar.com X5O!P%@AP[4\PZX54(P^)7CC)7}-STANDARD-ANTIVIRUS-TEST-FILE!+H*
・・・あれ?よく見ると$EICAR
の部分が消えているではないか・・・これに気がつくのに時間がかかってしまった。ヒアドキュメントでは変数展開されてしまうんだった。$EICAR
の部分がシェル変数として処理され、そんな変数は無いから消えたということ。
ということで、ヒアドキュメントで変数展開しないためには、6のようにデータ終了文字列をクォーティングする必要があるぞ!ハマったぞい・・・