僕はこうしてSnapChatのCAPTCHA代替機能を30分で破りました

僕はこうしてSnapChatのCAPTCHA代替機能を30分で破りました 1

今朝目が覚めたら、サービス内に徐々に浸透してきたsnapのスパムを減らすためSnapchatが新認証システムを導入した話が記事になっていました。

読まなかった人のためにひと言にまとめると、画像を沢山表示して、その中からSnapchatのロゴのオバケ入りの画像を選んでもらって、入力したのがボットじゃなく人間であることを認証する、というの。基本CAPTCHAなんだけど、もっと面倒臭くない、というやつです。

僕はこうしてSnapChatのCAPTCHA代替機能を30分で破りました 2
これの問題はSnapchatのオバケが結構独特なこと。もうテンプレートって呼んでいいぐらい特徴があるんですね。「テンプレートマッチング(画像照合)」って言われてもピンとこないかもしれないけど、Snapchatが人間認証でやらせてる作業がまさにこれでして、これってコンピュータビジョンの中でも最も簡単な部類のタスクなんですよ。

入力してるのが人間であることを確かめる手法としては本当に最悪です。コンピュータに任せてもアッサリ解けちゃうんですね。

そこで記事を読んでから早速、これをコンピュータにやらせるコードを30分ぐらいかけて書いてみました。

問題を解く方法は沢山あります。たぶん一番いいのはHoGだし、カラーしきい値処理とPCAでブロブを認識する方法でもいいんですが、 それだともっと時間がかかるし、僕は怠け者で面倒臭いことはしたくない性質(=効率がいい)なので、結局、OpenCVを使って、簡単なしきい値処理、SURFキーポイント、FLANNでマッチングをし、テスト甩画像の複数のキーポイント(特徴点) が1点も合致しないことを確かめるユニークネス・テストを行うことにしました。

そこでまず上のスライドから個々の画像を抽出して、各画像とオバケのテンプレートのしきい値処理をし、色が合致する物体が探せるようにしてみました。次にテスト甩画像とテンプレートからSURFで特徴点とディスクリプタを抽出し、FLANNでマッチングします。距離メトリックを活用して「最も良く」合致するものだけ使い、あとはマッチしたものを全部チェックして、テンプレート内の1つの特徴がテスト甩画像の大半の特徴と一致しないことを確かめながらユニークネスを確認していきます。ユニークネスが十分あって、特徴がある程度見つかれば、それはオバケ、というわけです。

するとなんの苦もなくアッサリと、僕のコードで上のサンプルから「オバケ探し」ができたんです、的中率100%で。完璧だなんて言ってませんよ。僕が言いたいのは単に、こうして1時間もかけずにコンピュータを調教して人間認証システムのサンプル突破できるようじゃ、全くその用を果たしてないってこと。コンピュータビジョンを使えばやり方は何通りでもあるし、どれも高速で有効です。コンピュータ相手に数当て賭博やるようなものですね。Snapchatの認証システム終わってるなーと思いました。


本稿は筆者ブログ初出の原稿を許可を得て再掲しました。

筆者のスティーブン・ヒックソン(Steven Hickson)さんはテック系ブロガーで、現在はジョージア工科大学大学院に研究員として在学中です。クレムソン大学コンピュータ工学課程を主席で卒業後、米国防省で働き、コンピュータビジョン、ロボティクス、エンベッデドシステムの博士号取得のため復学しました。彼のオープンソースライブラリは世界中で使われ、「Linux User and Developer Magazine」、raspberrypi.org、Hackaday、Lifehackerなどでも紹介されています。余暇はロッククライミング、ランダムなコード書き、『マジック:ザ・ギャザリング』で遊ぶのが趣味。

Steven Hickson(原文/satomi)