2019/11/25

Android のスクリーンキャプチャに潜む脆弱性

2019 年 11 月 25 日 Emil Hozan 著

スクリーンショットはモバイルデバイスの大事な機能であり、少なくとも私はそう考えています。
何か(ミーム、文章、あるいはそれに類似するもの)を記録するのであれば、さまざまなメタデータが含まれるメディアを外部のサーバからダウンロードするのではなく、間違いなく、スクリーンショットを撮る方法を選択します。
しかしながら、バンキングアプリなどのどちらかといえば機密性の高い情報の場合は、スクリーンショットを撮れないことがあります。
最近になってその理由がわかったため、スクリーンショットの問題点も含めて、解説したいと思います。

セキュリティ研究者の Lorenzo Stella 氏が、前任の研究者から引き継ぐ形で続けている研究で明らかになった、驚くべき発見を記事にしました。この研究は、FLAG_SECURE フラグが有効であるにもかかわらず(後述します)、機密情報が含まれる画面をキャプチャできることを検証するものです。Stella 氏の研究によって、さまざまなパスワード管理アプリで機密情報をキャプチャできることがわかりました。

そのようなウィンドウやスクリーンのキャプチャを防ぐには、FLAG_SECURE フラグを使用し、該当するウィンドウに適用します。このフラグが設定されていると、そのウィンドウをキャプチャできなくなりますが、これは、スクリーン単位でしか効果がありません。そのため、あるウィンドウにこのフラグが設定されていたとしても、アプリのすべてのウィンドウが保護されるわけではありません。他の API が併せて使われている場合の(Toast や PopupWindow)API の動作の技術的な詳細は省略しますが、API によっては、このフラグの効果がないものもあります。この説明の意味が分からなくても、問題ありません。Stella 氏のリンクに概念実証のビデオが紹介されているので、ご覧になることをお勧めしますが、要点としては、これら他の API によって、たとえそのコンテンツ自体に FLAG_SECURE フラグが含まれていたとしても、渡されるコンテンツのキャプチャを防ぐことにはならないということです。この概念実証のビデオでは、パスワード管理アプリの隠れたコンテンツが、Android の Toast API (ユーザの画面にコンテンツを表示する API)に表示される過程が説明されています。

Stella 氏は、4 つの異なるモバイルパスワード管理アプリでこれを試し、調査でわかったことをそれぞれの開発元に報告しました。それ自体はいいことですが、他のアプリの開発者が、機密情報を表示するすべての画面に正しくこのフラグを適用する方法を知らない可能性があるという懸念もあります。もちろん、インストールするアプリとその入手先については、ユーザが十分に注意する必要があります。