Droid のRoot化は何をしていたのか

HT-03A のルート権限を取得は、Android 1.5 のバグを突いて行うことができました。Android 1.6 では当然修正されたので Droid のルート権限取得はなかなかできなかったようですが、2.0.1 へのアップデートが行われたときにルート権限取得もできてしまいました。これも Android のバグでした。

問題のコードは、bootable/recovery/verifier.c の中にありました。

int i;
   for (i = 4; i < eocd_size-3; ++i) {
       if (eocd[i  ] == 0x50 && eocd[i+1] == 0x4b &&
           eocd[i+2] == 0x05 && eocd[i+1] == 0x06) {
           // if the sequence $50 $4b $05 $06 appears anywhere after
           // the real one, minzip will find the later (wrong) one,
           // which could be exploitable.  Fail verification if
           // this sequence occurs anywhere after the real one.
           LOGE("EOCD marker occurs after start of EOCD\n");
           fclose(f);
           return VERIFY_FAILURE;
       }
   }

このコードは、update.zip の署名をチェックする部分だそうで、見てのとおり条件式は決して true になりませんから、verify failure にならないのです。

Droid のときには、これを利用して、本物の update.zip の後ろにさらに別のzipを付加してだましたようです。

もちろん、今では修正済みです。

Android では一部のユーザがルート権限を取りたがる、そして、しばしば取ることができる、ということも知られてきましたから、ベンダーや事業者もこれからは気を使うのではないでしょうか。Xperia など 1.6 の製品はかなり堅牢なのではないかと思います。 Nexus One はわざわざハックしなくとも最初から入り口が設けてありますが、これは例外でしょう。