カテゴリー
技術

ねじ曲げ画像を使った新方式のCAPTCHA MintEyeを23行のPythonコードで破った話

先月ご紹介してなかなか好評だった、画像をグニャリと円状に曲げて加工し、それを正しい状態に戻すことで人間かスパムプログラムかを判定するという新方式のCAPTCHA MintEyeですが、一ヶ月しか経っていないのに機械的に解 […]

先月ご紹介してなかなか好評だった、画像をグニャリと円状に曲げて加工し、それを正しい状態に戻すことで人間かスパムプログラムかを判定するという新方式のCAPTCHA MintEyeですが、一ヶ月しか経っていないのに機械的に解いてしまう話が出てきてしまいました。それもPythonでたった23行のコードで。

このスクリプトがやっているのは、グレースケールに変換した上で、Sobel()で画像上のエッジを取得し、エッジの合計をグラフにプロットしている、というだけですね。画像ファイルを開くところやグラフを描くところを除けば、数行の短さです。

スライダーにあわせて表示されるすべての画像について計算を行いグラフにプロットすると、たとえば以下のような結果となり、エッジの合計がもっとも小さくなる赤い点に対応する画像こそが、ねじまげられていない元の画像だというのがわかるということ。

minteye-sums-of-sobel

このスクリプトで、Minteyeで表示された13種類のCAPTCHA画像を試し、13種のすべてに対して正しい画像を当てることができたとか。

たしかに、ねじまげられた画像では一つ一つの線の長さが長くなっています。

minteye-samples

また、画像を使ったCAPTCHAではよくある、目が見えない利用者のためのオーディオCAPTCHAがMintEyeにもあるのですが、こちらについても別の人が、音声版の「もっと左」「もっと右」と案内する音声を音声認識することで、正答に対するスライダの位置を言い当てる、という解法を発表しています。

http://www.youtube.com/watch?v=u0M7gmS5Eg0

音声版を攻略する、というのは、この手のCAPTCHAでもっとも成功・普及しているreCAPTCHAに対しても使われた手ですね。これへの対策で、reCAPTCHAの音声版はたいへん聞き取りにくく、使いにくいものになってしまいました。

今回のMintEye破り、ブログのコメント欄に「Pythonは使ってないのでVisual Basicでどうするか教えてくれないか?」というコメントが登場していて、それをからかうコメント等で変な盛り上がり方をしていますが、技術力のないスパム業者が一番に飛びついて研究(VBでどうするか尋ねるのも研究?)しているのかもしれません。普及すれば解析されやすくなるが、普及しないと彼らの「広告をCAPTCHAに使う」というビジネスモデルは成立しないわけで、このあとMintEyeがどんな改良策を考えてくるか、気になるところです。