FTPクライアントソフトのパスワード盗難
さて、Gumblar。さまざまなFTPクライアントソフトからパスワードを盗み出す。IEなんかのオートコンプリートの情報からも盗み出す。オートコンプリートについては前回の記事に書いたとおり前々から危険性があった。おそらくこの方法に近いことをしてパスワードを盗んでいるのだろう。
被害にあったFTPクライアントアプリは結構大きな数で、有名どころはほとんど含まれている。その中にFFFTPも入っている。これはオープンソースなので容易に解析される。FFFTPはホストごとに設定したパスワード情報を暗号化してレジストリに格納している。
デコード方法もソースを見ればそこに書かれているので、その通りやればパスワードを平文でいとも簡単に取得できる。
以下は以前のバージョン(ver.1.96d)のソースで、デコード処理の部分。
static void DecodePassword(char *Str, char *Buf) { unsigned char *Get; unsigned char *Put; int Rnd; int Ch; Get = (unsigned char *)Str; Put = (unsigned char *)Buf; while(*Get != NUL) { Rnd = ((unsigned int)*Get >> 4) & 0x3; Ch = (*Get & 0xF) | ((*(Get+1) & 0xF) << 4); Ch <<= 8; if((*Get & 0x1) != 0) Get++; Get += 2; Ch >>= Rnd; Ch = (Ch & 0xFF) | ((Ch >> 8) & 0xFF); *Put++ = Ch; } *Put = NUL; return; }
今回のGumblar騒ぎでFFFTPはバージョンアップされた。現在の最新バージョンはVer.1.97aだ。このバージョンから暗号化にAESが使用されている。
AESだから安心なのではなく重要なのはキーだ。本人しか知り得ないキーを暗号化の際に使用することが大事なわけで、そのあたりも開発者は当然ながらわかっているので、「マスターパスワードを設定してください。」と言っている。この「マスターパスワード」が使用されてFTPパスワードがAES暗号化される。
いまさらながら、前回までのバージョンについて、アルゴリズム上、キー設定もなく、デコードコードが公開されている状態で「暗号化」とは.....
「マスターパスワード」はSHA1でハッシュ後、レジストリに格納している。毎回、起動時に設定したパスワードを入力させ、入力値のSHA1ハッシュとレジストリに設定されているハッシュとを比較している。これは認証処理の王道だね。
ちなみに以下が新バージョンのソース内のデコード処理部分のコード。
static void DecodePassword3(char *Str, char *Buf, const char *Key) { char *Get; unsigned char *EncBuf; size_t StrLen; size_t IvIndex; size_t EncBufIndex; size_t EncBufLen; unsigned char AesKey[32]; unsigned char AesCbcIv[AES_BLOCK_SIZE]; aes_decrypt_ctx Ctx; Buf[0] = NUL; Get = Str; StrLen = strlen(Str); if(AES_BLOCK_SIZE * 2 + 1 < StrLen) { EncBufLen = (StrLen - 1 ) / 2 - AES_BLOCK_SIZE; if((EncBuf = malloc(EncBufLen)) != NULL) { for(IvIndex = 0; IvIndex < AES_BLOCK_SIZE; IvIndex++) { AesCbcIv[IvIndex] = hex2bin(*Get++) << 4; AesCbcIv[IvIndex] |= hex2bin(*Get++); } if(*Get++ == ':') { if(CreateAesKey(AesKey, Key) == SUCCESS) { aes_decrypt_key(AesKey, 32, &Ctx); for(EncBufIndex = 0; EncBufIndex < EncBufLen; EncBufIndex++) { EncBuf[EncBufIndex] = hex2bin(*Get++) << 4; EncBuf[EncBufIndex] |= hex2bin(*Get++); } if(aes_cbc_decrypt(EncBuf, Buf, EncBufLen, AesCbcIv, &Ctx) == EXIT_SUCCESS) { Buf[EncBufLen] = NUL; } } } free(EncBuf); } } return; }
マスターパスワードを設定しなければ、↑の第3引数が固定(空文字かな)になるので意味がない。なので、FFFTPを使用している人は「バージョンアップしたから大丈夫」ではなく、ちゃんと「マスターパスワード」を設定しましょう。
と、それはそれで置いておいて、言いたいのはこれではなく、同じパスワードを使いまわすな!ということ。さんざんセキュリティ上よろしくないと言われているけど、なかなか徹底できていないんじゃないかな。
今回の場合だと、この「マスターパスワード」に設定したパスワードと同じパスワードをどこかのまったく別のサイトで使用していて、IEのオートコンプリートに保存されていたら、前回の記事で書いたこととの合わせ技でFTPパスワードが盗まれてしまう。
確かにパスワードをいっぱい覚えるのは面倒くさいけどね。でも、とくにサイト管理をしているような人はそれなりの責任を背負っているわけだから、しっかりと意識してね。