連載
» 2017年04月19日 05時00分 公開

CasperJSと類似画像分類で見えてきた、Android野良アプリの具体的な危険性統計で見るサイバーセキュリティ群像劇(4)(2/2 ページ)

[安藤類央(国立情報学研究所),@IT]
前のページへ 1|2       

CasperJSでスクリーンキャプチャーを取る

 APKのバイナリファイル内のURLの文字列だけでは情報が足りないため、URLの接続先のスクリーンキャプチャーを取得・収集することにしました。つまり、「本稿のために開発したクローラ」にURLを渡して、接続先のWebページのスクリーンキャプチャーを取らせるというわけです。スクリーンキャプチャーを取る際には、前回と同じくCasperJSを利用しました。下記は、CasperJSのプログラムです。

var casper = require('casper').create({
    pageSettings: {
        webSecurityEnabled: false
    }
});
 
var url = casper.cli.get('url');                                             
casper.userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 '\
  );
 
casper.start(url,function(){
 
});
casper.then(function(){
    this.wait(3000, function() {
    });
});
 
casper.then(function () {
    this.echo( this.getCurrentUrl());
    casper.capture("nodejs.png");
});
 
casper.run();
https://github.com/RuoAndo/ITMedia/blob/master/1-4/getScreenCapture.js

 上のプログラムの15行目で3秒待った後、21行目でスクリーンキャプチャーを取得しています。このプログラムを実行して取得できた画像の数は、最終的に8377枚になりました。

# ls *png | wc -l
8377

 ちなみに、ファイル名には接続したURLの文字列を付けています。

blog.sina.com.cn.png
pl.linkedin.com.png
connect.facebook.net.png,

 なお、先ほどの国別通信先の表2を踏まえて、これらの文字列にgrepをかけてみました。

# grep ".cn" tmp | wc -l
26
# grep ".ru" tmp | wc -l
165
# grep ".us" tmp | wc -l
134
# grep ".jp" tmp | wc -l
62
# grep ".kr" tmp | wc -l
42

 cnつまり、中国の数が極端に低くなっています。やはり中国のネットワークにCasperJSなどを使ってクロールをかけると、他の国々と比べて弾かれることが多いということでしょうか。また、政府系「gov」のサイトで、米国のものに接続しているものがないか調べてみました。

# grep ".gov" tmp 
grants.nih.gov.png,18446726447159788032 
www.nasa.gov.png,9359034179300440320                                                                                      
www.whitehouse.gov.png,18374967953037592326

 1番目は医療系のサイトです。3番目に、ホワイトハウスへ接続しているものがあるようですが、今回は詳しく調べませんでした。

Average Hashで類似画像分類

 かなり前置きが長くなりましたが、Average Hashというアルゴリズムを使って、CasperJSで取得した8377枚の画像を分類してみました。

 Average Hashはシンプルな類似分類を行う際に使える特徴量を計算するアルゴリズムです。ハッシュということになっていますが、いわゆるバイナリハッシュと言われるものの1つで、似たデータ(この場合は画像)は、近いハッシュ値に変換されます。一時期Webデータの検索などに関して話題になったLSH(Locality Sensitive Hash)に近いものです。

 具体的な処理は、画像をグレースケールに変換し、全画素の平均を元に各画素を処理し、画素の値が平均より上なら「1」、下なら「0」としてハッシュ値を構築します。

 下記は、Average Hashのプログラムの抜粋です。

 9 def avhash(im):
10     if not isinstance(im, Image.Image):
11         im = Image.open(im)
12     im = im.resize((8, 8), Image.ANTIALIAS).convert('L')
13     avg = reduce(lambda x, y: x + y, im.getdata()) / 64.
14     return reduce(lambda x, (y, z): x | (z << y),
15                   enumerate(map(lambda i: 0 if i < avg else 1, im.getdata())),
16                   0)
17 
18 def hamming(h1, h2):
19     h, d = 0, h1 ^ h2
20     while d:
21         h += 1
22         d &= d - 1
23     return h
24 
https://github.com/RuoAndo/ITMedia/blob/master/1-4/averagehash.py

 上のプログラムを使って、収集したスクリーンキャプチャーの画像の類似性を計算してみました。実行例は下記のようになります。

# python averagehasg.py 1.png 
avhash:
1.png     7961933613770873918
:
:
中略
:
:
45      17568966557860594049-2212.png   17568966557860594049
45      9367381568229835137-2735.png    9367381568229835137
45      13961653357748797923-2549.png   13961653357748797923

 図2は、Average Hashによって算出されたハッシュ値によって、画像を並べたものです。筆者は画像処理の専門家ではありませんが、ところどころに大体似たようなイメージが固まっているのが分かると思います。

図2 Average Hashで分類した画像のディレクトリのキャプチャー

 ここで、この画像の3段目に注目してください。

図3 図2の3段目にある画像の1つ

 用途は不明ですが、メールアドレスとパスワードを入力する画面がキャプチャーされていました。当然今回作ったCasperJSプログラムはスクリーンキャプチャーを取るだけなので、このページの用途も詳細な背景も分かりませんでした。

 そして前回と同じく今回のオチになるのですが、図2で図3の左にある画像を見てください。なぜかアノニマスのものが混ざっていました。

図4 キャプチャーされたアノニマスの画像

 ここでは詳細なことは説明できませんが、これはあるストリーミングのサイトでした。関連するかどうかは分かりませんが、ちょっと前に下記のようなニュースがありました。

参考リンク:アノニマス、ニュースサイト立ち上げに5.5万ドル調達(WIRED.jp)

 このアプリがアノニマスによって開発されたものなのか、あるいは、たまたまアノニマスのコンテンツがストリーミングされていたのかは不明です。

 というわけで、APKファイルの通信先を見る場合、大量の文字列を見る必要がある場合は、スクリーンキャプチャーを取る方法もあるかと思います。データを何らかの画像に対応させると、類似検索のテクニックが使えることがあるかと思います。

今回のまとめ

 今回の記事の内容を以下にまとめました。

  1. 今回は「baksmali」などによるAPKファイルの解析ではなく、対象を野良アプリに絞って、grepのよるURL文字列の抽出を行った
  2. マルウェアの混入率は、野良アプリマーケットの方が、Google Playよりもはるかに大きいと報告されているが、実際はそう頻繁にダウンロードされるものではなさそうだ
  3. スマホアプリは、米国、日本、中国などで利用が盛んであり、特に米国と日本ではゲーム系アプリの利用が多いとされているが、意外とストリーミングをするアプリや、ロシアからアプリも興隆しているようだ
  4. Androidアプリでも、割とメジャーどころのSNSへ接続するものは多いようだ。場合によると、Web APIを使っているのかもしれない
  5. Androidアプリの処理内で知らず知らずのうちに、メールアドレスやパスワードを入力するページへアクセスする場合が結構見受けられる
  6. 大量の文字列を処理しなくても、類似画像検索で割と変なものは見つけられる場合がある。ただし、スクリーンキャプチャーが取れる場合は多くなく、的を絞った調査規模に限って有効である

 セキュリティベンダーが行っているような解析はできませんが、各国で行われているアプリ開発の空気感や、Webを介した広告またはWebページへのアクセスを誘導する目的のAPKが以外に多いのではというのが筆者の印象です。

 次回は、Webで流布されているサイバー攻撃に関係したIPアドレスが、実際どれほど信ぴょう性があるのか、実際に統計を取って確かめてみたいと思います。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。