隠された情報がたまにスキャンされる

QRコードを簡単に作る方法

神戸大学の手法の簡易説明

「QRコードに脆弱性」というニュース記事が2018年6月25日現在、世間を賑わせています。

これについて、グループリーダーの神戸大学・森井教授自ら解説された記事がありました。

同手法は、QR コードの持つ誤り訂正の仕組みを利用しています。同記事に示された QR コードを例に説明しましょう。QR コードを構成するのは白と黒のドットなのですが、その中間色である灰色のドットが QR コード内に紛れこんでいるとき、それを QR コードリーダーが白と解釈するか黒と解釈するかは、諸条件によって変化します。特に細工されていない QR コードであれば、どっちに解釈されたとしても誤り訂正によって元通りに修正されるのですが、森井教授が上記サイトで示した QR コードは、特定のドットを灰色とすることで、それが白と解釈されるか黒と解釈されるかで訂正の働き方が変わるようになっています。

少し詳しく説明します。QR コード中の白黒のドットは、場所によって異なる役割があります。下図の QR コードのうち、紫色で着色されている領域は、埋め込まれるデータがバイナリデータに変換されて記されています。また、黄色で着色されている領域は、誤り訂正のための情報が記されています。 （赤いところはフォーマット情報や位置マーカなど）

森井らが示した例では、データとして不正サイトの URL (http://srv.prof-morii.net/~lob) が埋め込まれています（紫色の領域）。一方、誤り訂正情報の方は埋め込むデータが正しいサイトの URL (http://srv.prof-morii.net/~lab) であった場合の訂正情報になっています（黄色の領域）。そのため、QRコードリーダーの通常の動作に従うとこの誤り訂正情報によって正しいサイトの URL が読み取られます。

ここで、この誤り訂正情報の領域に灰色のドットが仕掛けられているのがポイントとなります。灰色のドットが黒と解釈されれば誤り訂正が働くのですが、白と解釈されてしまうとそれがうまく働かず、紫色の領域に埋め込まれていた不正サイトの URL がそのまま出力されてしまうのです。（なお、誤り訂正情報のドットならどれでも適当に灰色にすればいいというものではなく、誤り訂正の仕組みに基いてドットを特定する必要があります）

なお、同記事に示された例だけ見ると、「灰色のドットがあるかどうかで、怪しいかどうかを見破れるのでは」と思ってしまいますが、黒いドットはすべて濃い灰色とすれば、人間の目に区別しにくくすることはできそうです。また、QR コードの上に薄く他の画像を重ねてわかりにくくする、といったこともできるかもしれません。

さらには、要は白にも黒にも判断されうる、あいまいなドットさえ作れればいいので、もっと巧妙に隠すこともできそうです。例えば、色を変えるのではなくドットの形を変える、例えば三角にする、といったことでも同様の効果を引き起こすことができそうです。他にも、各ドットの大きさを不揃いにしたり場所をずらしたりすることでも、あいまいなドットを作ることができるかもしれません。ドットがまるで目立たないデザインのQRコードもあるくらいなので、いくらでもわかりにくくすることはできるでしょう。点滅させるとか、人が気付かないくらいごく短かい時間だけドットの色を変える、といった手法も考えられそうです。神戸大のグループからの続報を期待しましょう。

つけ加えると、森井らの手法は、原理的には他の二次元バーコードにも適用可能です。検証したわけではありませんが DataMatrix や Aztec Code などにも同種の攻撃がおそらくは有効と思われます。この辺も、続報を待ちたいところです。

第二の情報を安直に埋め込む方法

神戸大の手法は、QR コードの誤り訂正手法を分析した上で精密に設計されているため、とても見破りにくい優れた手法です。一方で、すぐ見破られてしまってもよいのであれば、これをもっと安直に実現する手法がありますので、それを紹介します

次の QR コードをスキャンしてみてください。

何度か試していただくと、次の2種類の URL が読み取れたはずです。

うまくいかない場合は、QR コードリーダを変えてみたり、カメラの角度を変えてみたりしてください。

この仕掛け、神戸大学の手法とは比べものにならないくらい安直です。次の図を見れば一目瞭然。

こんな感じで、小さな QR コードを大きな QR コードに埋め込んでいるだけです。大きな QR コードの方は誤り訂正能力を最高レベルに設定しているため、右下の領域を他の QR コードで大胆に覆い隠してしまっても、元のデータを復元することができています。

このような安直な手法だと、QR コードは三つの隅に特徴的な位置マーカがあるので、わかっていればすぐに見破ることはできるのですが、事情を知らない人を相手にするのであれば悪用できてしまう可能性は十分にあるかと思います。

なお、位置マーカ部分は、多少はその形が崩れても認識される場合があります。下図は少し崩してみた例です。頑張れば、もっとうまく溶け込ませることもできるかもしれません。

埋め込む方の QR コードにマイクロ QR コードを使うと、余分に増える位置マーカが1つになるので、さらに分かりにくくなります。ただ、マイクロ QR コードに対応しているリーダーはそれほど多くないので、影響力は小さくなります。

マイクロ QR コードを使うとコード全体を小さくすることもできますが、小さくしてしまうと埋め込まれる方の QR コード全体をスキャンしやすくなるので、マイクロ QR コードの方を優先的に読ませるのはちょっと難しくなりそうです。

議論

神戸大・森井教授らが示した QR コードの弱点について解説し、またそれを簡易的に真似た手法を紹介しました。

以前に紹介した、QR コードに隠しデータを埋め込む手法に比べると、この手法は悪用の危険性がかなり高いといえます。ざっと見た限りでは、これを防ぐ効果的な手法は思い当たりません。上掲記事で森井教授は、読み取られた URL を目視で確認することを挙げていますが、正規の URL から一文字だけ変えたような URL を目視で見極めるのは難しいでしょうし、BitCoin の公開鍵のように乱雑で長い文字列が対象になってしまうと、その改竄を目視で見破ることはもはや不可能です。

いちおう、QR コードリーダー側で、複数の解釈が可能なコードは拒否するといったこともできるのでしょうが、こんどは正常なコードが読み取れない確率が上がる、といった弊害が生じそうです。

QR コードのような、カメラで読み取ることができるバーコードの需要は依然として衰えていません。セキュリティを向上させた次世代コードが求められているといえそうです。