Excelの奇妙なパスワードとマクロウイルス

サイボウズ・ラボの光成です。

今回はMicrosoft Excelに存在する特別なパスワードの仕様を紹介します。 後半はそれがマクロウイルスと関わるとどうなるか、ちょっとした実験をしたのでその紹介をします。

そもそものきっかけ

それは海外の人からのメールでした。 私はCODE BLUE 2015で「MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策」を発表した際、 Windows/LinuxでMicrosoft Officeファイルの暗号化・復号をコマンドラインでできるツールmsofficeを公開しました。

そのメールはツールについての質問で、「知人からもらったファイルをこのツールで確認すると暗号化されているのにファイルを開くときにパスワードを聞かれない。なぜ?」というものでした。

最初質問の意味がわからなかったのですが、確認すると確かにファイルを開くときにパスワードが不要なのに中身は暗号化されています。 拙作のツールを使うと暗号に使われている詳細パラメータを取得できます。

bin\msoffice-crypt.exe test.xlsm -info
flags = 00000024
sizeExtra = 0
algId = 0000660e
algIdHash = 00008004
keySize = 128
providerType = 00000018
cspName = Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)
dataSize = 72
saltSize = 16
salt = 0C:A5:...
encryptedVerifier = FF:14:...
...
bad password

暗号化フォーマットとしては不自然なところはありません。とすると「何か特別なパスワードで暗号化しているのだろう」と想像しましたが、どんなパスワードか見当もつきません。 ふとLibreOfficeでも開けるのだろうかと試したら、問題なく開けたのです。

ということはLibreOfficeが何か特別な処理をしていると推測できます。 それでLibreOfficeのソースコードを調べてみたらまさにそういう処理が入っていました(filterdetect.cxx)。

if( aDecryptor.readEncryptionInfo() )
{
    /*  "VelvetSweatshop" is the built-in default encryption
        password used by MS Excel for the "workbook protection"
        feature with password. Try this first before prompting the
        user for a password. */
   std::vector<OUString> aDefaultPasswords;
   aDefaultPasswords.push_back("VelvetSweatshop");

特別なパスワードVelvetSweatshop

ソースコードを読むと、どうやらVelvetSweatshopという特別なパスワードがあるようです。暗号化されたファイルを処理する場合、まずこのパスワードで復号してみて駄目だったら通常のパスワードを求める処理に移っていました。 そこで私のツールでこのパスワードをつけて先程のファイルに対して復号処理をしたらちゃんと復号できたのです。

ちなみにWordやPowerPointでこのパスワードをつけて保存すると、次回開いたときにパスワード入力画面が表示されました。 このパスワードはExcelのみに有効なようです。なんとも奇妙な仕様です。

マクロウイルスとアンチウイルスソフト

さて、ExcelなどのVBScriptを利用したマクロウイルスというものがあります。 1996年頃Larouxと呼ばれるマクロウイルスが初めて登場しました。 それからウイルスの種類が徐々に増えていき1999年ごろ大流行します。その後Office 2007からマクロ機能はデフォルトでオフになり、また会社によってはマクロを禁止しているところもあって近年では下火になっていました。 ただ去年の記事によると2015年ぐらいから再び増加傾向にあるそうです(マクロウイルスを知らない世代の社員が狙われる?「Office文書を開いて感染」攻撃が再び増加(INTERNET Watch))。

アンチウイルスソフトはマクロウイルスファイルを概ねパターンマッチで検出します。 しかしパスワードをつけて暗号化していたらもちろん復号できず、中身をチェックできません。

ただVelvetSweatshopという特別なパスワードをつけた場合、中身は暗号化されていても見かけはユーザにとって普通のファイルと同じです。 パスワードが分かっているので技術的には復号可能ですが、アンチウイルスソフトはこの中身をチェックしているのでしょうか。

そこで実際にLarouxと判定されるExcelマクロファイルを作り、VelvetSweatshopで暗号化して試してみました。 7種類のアンチウイルスソフトでチェックしたところ検出したのは一つだけでした(2017年3月6日時点)。 意外にも素通ししてしまうのが多かったです。

検出したソフトは、「暗号化Excelファイルを見つけたらとりあえずVelvetSweatshopで復号し、成功したら中身をチェックする」という処理をしているのだろうと思います。

実はこの話は海外では割と有名なようで、たとえばWhen is a password not a password?という2013年の記事があります。 今回、メジャーなアンチウイルスソフトが検知しないのを自分で確認して、個人的にはそれはチェックすべきではと思いました。しかしソフトベンダーにとっては、このリスクに対してスキャンするコストの増加が見合わないという判断なのかもしれません。 この件についてMSRC(Microsoft Security Response Center)に問い合わせしてみたのですが、たいして影響がないので(minimal impact)特に対応する予定はないとのことでした。

いずれにせよ最近は個人を狙った標的型ウイルスが多いそうです。ファイルを開くときやマクロを有効にするときにいつでも注意しなければならないのは実践するのが難しく、悩ましい問題ですね。