@Yoski はてな別室

ツイキャスの中の人。Twitter やってるよ http://twitter.com/yoski

Appleのサーバー認証を通過するアプリ内課金のクラックツールが出回っているらしい

アプリ内課金のクラックツールで有名なのは iAP Cracker で、これは偽署名を作成することで「サーバー側認証を行なっていない」実装のアプリについてアプリ内課金を回避ししてしまうツールです。

urus のリポジトリにあるやつが有名で、これを使うとデフォルトで Transaction ID が「com.urus.iap.xxxx」になるので、まぁもろバレなわけですが・・・。

 

iAP Cracker については、iOS 6.1 で Apple が対策をいれたため使えなくなりました。

代わりに「LocalIAPStore」というものが出まわってます。ただ、これも「サーバー側認証」されるとダメなので、アプリ開発者がちゃんとサーバー側で認証していれば問題ありません。

 

ところが、最近サーバー側認証を回避するアプリ内課金のクラッキングツールが出回っているようです。

 

アプリ内課金のサーバー認証では、iPhoneなどでアプリ内課金を行った際に発行される「レシート」というものをサーバー側で「Apple のレシート認証サーバー」に渡して、このレシートが正しいものかどうか判定しています。

 

で、このツールは「正しいレシート」を作成することで、サーバー認証を通過してしまいます。

どうやって「正しいレシート」を作成するかというと、全く関係ないアプリのアプリ内課金を使っています。

以下、そのレシートの内容。

 

{
"original-purchase-date-pst" = "2012-07-12 05:54:35 America/Los_Angeles";
	"purchase-date-ms" = "1342097675882";
	"original-transaction-id" = "1700000xxxxx";
	"bvrs" = "1.4";
	"app-item-id" = "450542233";
	"transaction-id" = "1700000xxxxx";
	"quantity" = "1";
	"original-purchase-date-ms" = "1342097675882";
	"item-id" = "534185042";
	"version-external-identifier" = "9051236";
	"product-id" = "com.zeptolab.ctrbonus.superpower1";
	"purchase-date" = "2012-07-12 12:54:35 Etc/GMT";
	"original-purchase-date" = "2012-07-12 12:54:35 Etc/GMT";
	"bid" = "com.zeptolab.ctrexperiments";
	"purchase-date-pst" = "2012-07-12 05:54:35 America/Los_Angeles";
}



つまり、アプリにてアプリ内課金を実施すると、まったく関係ないアプリのレシートを送信してくるわけです。
で、これが(全部ではないのですが)たまに Apple の認証を通過してしまいます。non-consumable なんですかね。

※追記)成功率は非常に低いことがわかりました。ので、いたずらレベルですね。

この踏み台に使っているアプリはこちら。

https://itunes.apple.com/app/id450542233

bid にある通りなんですが、ZeptoLab というところが作ってるアプリですね。ここが仕掛けてるのか踏み台にされているのかはわかりません。ていうか、Google おすすめの有名パズルゲームなんで、踏み台にされてんでしょうね。

 

全然関係ないレシート送付して課金成功するわけないじゃんwwwwって思うかもしれませんが、レシートチェック後の product-id をちゃんと検証してないサーバーを狙った攻撃なんで、成功するところはあるでしょう。(ていうか、俺もちょっと落とし穴あって塞いだw)


なので、まぁ、iPhone のアプリ内課金では

- サーバー側でのレシート認証
- 認証後のレシートの product id などのチェック

が必須ですので、一応メモ。


#ていうか、Jailbreak まわり詳しくないんで、詳しい人教えてくださいw