日々之迷歩

世の中わからんことだらけ

ITが複雑で難しくなっていく様に翻弄される日々です。微力ながら共著させていただいた「シェル・ワンライナー160本ノック」をよろしくお願い申し上げます。

EICARテストファイル作成でハマる

アンチウイルスソフトの動作テストをするのに、本物のウイルスを使う人はおらんだろう。いやおらんよね??

そこでテスト用のウイルスを使うことになる。普通はEICARテストウイルスデータを使うんではなかろうか?

www.eicar.org

下記の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のようにデータ終了文字列をクォーティングする必要があるぞ!ハマったぞい・・・