Android 7.1 以降には、慌てて戻るボタンが押されたことを検出する「パニック検出」モードがあります。

Android Nougat (7.1 以降) には、ユーザーが戻るボタンを必死に押しているかどうかを検出するパニック検出モードがあります。 それが何をするのかについては、続きを読んでください。

私たちのような Android 中心の Web サイトの読者の多くは、目にする可能性は低いですが、 不正なアプリケーションがシステムを侵害する状況では、一般的な状況では同じことが当てはまらない可能性があります。 人口。 私たちはほぼ毎週、さまざまなセキュリティ研究者から Android ユーザーをターゲットにした新しいマルウェアについて聞いています。 こうした悪意のある攻撃のほとんどは、アクセス許可を検査したり、見た目が不自然なアプリケーションのインストールを回避したりすることで回避できます。 読者の皆様には携帯電話のセキュリティを自分で管理することをお勧めしますが、Google はすべての Android をセキュリティで保護する責任があります。 電話。 そのために、同社は Android 7.1 Nougat に「」と呼ばれる新しいセキュリティ機能を密かに導入しました。パニック検知」は、複数の「戻る」ボタンが連続して押されるのをリッスンし、ユーザーをホーム画面に戻します。

非常に簡単に言うと、不正なアプリケーションがユーザーの画面を乗っ取り、ユーザーが離れるのを妨げようとした場合(おそらく、 すべての主要なイベントをインターセプトするためのアクセシビリティ サービスの実装)、Android 自体がアプリケーションをオーバーライドして、 ホーム画面。 その後、ユーザーはランチャーから悪意のあるアプリケーションをアンインストールできると考えられます。

この機能は、当然のことながら、悪意のあるアプリケーションを削除する方法を世界に宣伝したくないと考えられるため、注目を集めませんでした。 しかし、Android のオープンソース コードをざっと見てみると、この単純な機能がそれをサポートするデバイス上でどのように動作するかがわかります。


コードを調べる

まず、デバイスが Android 7.1 以降を実行しているからといって、このパニック検出動作が実際に有効になるわけではありません。 機能がオンかどうかを決定する値は、 config.xml SystemUI APK 内のファイル。


<integername="config_backPanicBehavior">0integer>

デフォルトでは、戻るボタンが慌てて押されたときの Android の反応は何も行われません。 整数値の場合、 config_backPanicBehavior ただし、 は 1 に設定されていますが、ここで Android の新しい保護対策が開始されます。

内で PhoneWindowManager.java この機能がどのように実装されているかの大部分を確認できます。 まず、このファイルは 2 つのことを定義します。1 つはユーザーが「パニック状態」であるとシステムが判断するために戻るボタンを何回押すか、そしてその状態に基づいてどのようなアクションを実行するかです。

// Number of presses needed before we induce panic press behavior on the back button
staticfinalint PANIC_PRESS_BACK_COUNT = 4;
staticfinalint PANIC_PRESS_BACK_NOTHING = 0;
staticfinalint PANIC_PRESS_BACK_HOME = 1;

デフォルトでは、システムはパニック モードに入るために「戻る」ボタンを 4 回連続して押す必要があります。 関数が次の整数値を使用するかどうか PANIC_PRESS_BACK_NOTHING または PANIC_PRESS_BACK_HOME SystemUI APK 内の構成ファイルの値によって決まります。

この値に関係なく、各戻るボタンの複数回押しがパニックプレスとしてカウントされるかどうかがチェックされます。 まず、システムはダウンプレスをインターセプトします。 KEYCODE_BACK キー イベントを検出し、キーの複数回押しまたは長押しをチェックするようにシステムが設定されているかどうかを確認します。 次に、システムは、同じ KEYCODE_BACK キー イベントの上押しをユーザー アプリに渡す必要があるかどうかを確認します。

の中に interceptBackKeyDown() この方法では、戻るキーの押下カウンタが 1 ~ 3 の場合、パニック検出ではアクションを実行するために少なくとも 4 回の押下が必要となるため、システムは複数回押しの検出タイムアウトをスキップします。

次に、ユーザーが戻るキーから指を離すと、up イベントがトリガーされ、 interceptBackKeyUp バックキーカウンターに1を加算します。 その後、メッセージを 300 ミリ秒間キューに入れます。 その理由は、戻るボタンの押下が複数回押下イベントの一部であるかどうかを判断するときに、システムが 300 ミリ秒の遅延期間を予約しているためです。 そうである場合、ユーザーはパニックになってボタンを押している可能性があるため、システムはキー イベントをユーザー アプリケーションに送信すべきではありません。

300ms の複数回押しのタイムアウト値は安全な設定に保存されます。multi_press_timeout" 以下に示すように。

/**
* The duration in milliseconds between the first tap's up event and the second tap's
* down event for an interaction to be considered part of the same multi-press.
* @hide
*/
publicstaticfinal String MULTI_PRESS_TIMEOUT = "multi_press_timeout";

デフォルトでは、この値は 300ms に設定されています。

/**
* Defines the default duration in milliseconds between the first tap's up event and the second
* tap's down event for an interaction to be considered part of the same multi-press.
*/
privatestaticfinalint DEFAULT_MULTI_PRESS_TIMEOUT = 300

次に、複数回の押下が実際に検出された場合 (300 ミリ秒以内に戻るボタンが 1 回以上完了した場合)、システムは backMultiPressAction 実行するアクションを決定するメソッド。 最後に、戻るボタンのカウンターが 0 にリセットされます。

非常にマイナーで非公開の機能ではありますが、平均的なユーザーにとって Android をより安全にするために Google が舞台裏でどのような取り組みをしているのかを知るのはやはり嬉しいことです。