ロックダウンモードの偽装:ポストエクスプロイトの改ざん技術

このブログでは、悪意ある行為者がロックダウンモードを使って、どのように偽りの安心感を作り出しているかについて説明します。

December 5 2023 投稿者

Jamf Threat Labs

Door secured with a large padlock that is unlocked.

Hu KeとNir Avrahamによる研究で分かったこと

Jamf Threat Labsは、通常ロックダウンモードによって実装されるはずの保護が一切無い、無防備な状況でありながら、ユーザーにはこのモードに関するすべての視覚的な合図が送られる、ポストエクスプロイト型の改ざんテクニックを特定しました。これはロックダウンモードの欠陥やiOSの脆弱性そのものではなく、マルウェアがユーザを視覚的に欺き、スマートフォンがロックダウンモードで動作していると信じ込ませる、ポストエクスプロイト(侵入後の悪用)型の改ざんテクニックです。このテクニックが実際に使用された事例は報告されておらず、すでに侵害されたデバイスでのみ実行が可能です。

この調査は、ロックダウンモードの仕組みとその限界を十分に理解していないと、攻撃を受けやすいということを伝えるために行われました。ロックダウンモードはiOSデバイスのアタックサーフェスを効果的に狭めることができますが、デバイスがすでに侵害されている場合、ロックダウンモードではマルウェアの活動を阻止できません。ロックダウンモードには、アンチウィルスソフトウェアとしての機能はなく、既存の感染を検出することもないので、すでに感染しているデバイスをスパイする能力には何の影響も与えません。つまり本当に有効な唯一の対策は、攻撃が行われる前に、攻撃者が利用できる侵入口の数を減らすことだけです。

右の画像はApple Newsroomの投稿から引用したものです。

iPhone with Lockdown Mode.

この研究では、脆弱なデバイスが攻撃者に侵入され、偽のロックダウンモードを実装するコードを植えつけられるシナリオを調査します。侵害されたデバイスを使用するハイリスクユーザ(例:ジャーナリスト、政府関係者、幹部)がロックダウンモードを有効化すると、ロックダウンモードの視覚的な合図を送る攻撃者のコードが起動しますが、デバイス自体の構成には変更はありません。

あなたのロックダウンモードは万全ですか?

iOS16に搭載されたAppleのロックダウンモードは、特定の状況には便利な機能ですが、スマホがすでに侵害されている場合、ロックダウンモードはあなたを守ってはくれません。ハッカーがすでにデバイスに侵入していると、ロックダウンモードを有効にしても「バイパス」されます。本ブログでは、この偽のロックダウンモードについて掘り下げます。

ロックダウンモードの登場

アップルは2022年9月、世界的なサイバー攻撃キャンペーンの急増を受け、ロックダウンモードを導入しました。以下に示すように、GoogleのThreat Analysis Group(TAG) によると、2021年と2022年は、2014年半ばからこのようなインシデントの追跡を開始して以来、出回っているのが確認されたゼロデイ攻撃の数が最も多くなりました。特に、最も悪名高いスパイウェアブランドの1つであるPegasusは、ゼロクリック攻撃として知られるように、ユーザ側の操作を必要とせずして最新iPhoneに感染。Appleは近年、セキュリティアーキテクチャの強化に力を入れていますが、Pegasusの攻撃者は新たな脆弱性を特定して、ゼロクリック攻撃を実行する並はずれた能力を示しています。このような状況はユーザの懸念を増長させており、この増加傾向に対抗するソリューションとして、またiPhoneユーザに安心感を与えるために、ロックダウンモードの開発が急ピッチで進められました。

Zero day attacks detected in the wild by Google's Threat Analysis Group from 2015-2022 with a peak of ~70 in 2021

ロックダウンモードは、潜在的な攻撃者がリモートでアクセスできる機能性を最小限に抑えることでユーザを保護します。これは、さらされるコードが少なければ少ないほど、攻撃者が脆弱性を悪用するために活用できるコードも少なくなるという、単純ながらも、堅牢なアプローチに基づいています。Appleはロックダウンモードについて次のように説明しています

ロックダウンモードは、その立場や活動内容から、きわめて精巧なデジタル脅威の標的になる可能性を拭えないごく一部の個人を対象に考案された、任意で使える究極のセキュリティ対策です。ほとんどの人は、この類の攻撃の標的になる心配はありません。

ロックダウンモードになると、デバイスが通常通りには機能しなくなります。金銭目的の高度な標的型スパイウェアに悪用されるおそれのある攻撃対象領域を極力減らすため、一部のアプリ、Web サイト、機能はセキュリティ面から厳しく制限され、場合によってはまったく使用できなくなります。

ロックダウンモードは、iOS 16 以降、iPadOS 16 以降、watchOS 10 以降、macOS Ventura 以降で利用できます。iOS 17、iPadOS 17、watchOS 10、macOS Sonoma では、対策が追加されています。すべての対策を講じられるように、ロックダウンモードを有効にする前に、デバイスを最新のソフトウェアにアップデートしておいてください。

例えば、ロックダウンモードは、キャプティブポータルで使用するウェブブラウザエンジンを制限します。キャプティブポータルは、通常、公衆Wi-Fiネットワークに接続する際にポップアップ表示されるウェブページであり、主に広告や認証の目的で使用されます。キャプティブポータルの後方にあるウェブエンジンは、多くの制限を課しており、その顕著な制限の1つが、セキュリティを考慮してJavaScriptのジャストインタイム(JIT)コンパイルを無効化することです。この制限はロックダウンモードにも適応され、結果的に、ロックダウンモードを使用すると、JavaScriptエンジンに関して、ウェブアプリケーションのパフォーマンスと応答性が最大で95% 低下することがわかっています。

ロックダウンモードをオンにすると、悪用の履歴がある特定のファイル形式がサポートされなくなります。さらに、メッセージで送信されたリンクのプレビューを表示しない、共有アルバムを無効にする、構成プロファイルのインストールやモバイルデバイス管理(MDM)ソフトへの登録をブロックするなど、便利な機能も無効化されます。

以下の画像は、GitHubのblacktopに掲載されているもので、ロックダウンモードが無効化する機能の一覧です。

List of what files and features are disabled when Lockdown Mode is enabled.

2023年になると、ロックダウンモードの有効性が明らかになりました。2023年9月、CitizenLabは、当時利用可能だった最新のiOS 16バージョンを標的とした、ゼロクリック悪用チェーン「BLASTPASS」を特定。CitizenLabとAppleの両社は、ロックダウンモードを有効にすることで、この特定の攻撃をブロックできることを確認しました。悪用される可能性を避けるため、詳細は明らかにされていませんが、おそらくロックダウンモードが有効になった後、エクスプロイトをトリガーさせるためには、ある程度のユーザインタラクションが必要となり、結果的に攻撃者のゼロクリック機能が無効化され、ユーザが反応する機会が得られるようになったものと思われます。

ロックダウンモードの限界

ロックダウンモードが特定のシナリオにおいて有効であることは確かですが、Jamfの評価は、すでにデバイス上で開始されている攻撃をロックダウンモードは止められないことを強調しています。iPhoneユーザは、デバイスがすでに感染している場合、ロックダウンモードを有効にしても、すでにシステムに侵入しているトロイの木馬には影響がないことに注意する必要があります。つまりロックダウンモードの主たる目的は、悪意のあるペイロードの実行を防ぐためにセキュリティ対策を追加することではなく、潜在的な攻撃ベクトルを減らすことにあるのです。

ここからは、既に感染しているiPhoneにおいて、ロックダウンモードがどのように操作され、ユーザに誤った安心感を与える可能性があるのかについて解説します。

スイッチ

下図のように、まず設定アプリのロックダウンモードのトグルを調べます。舞台裏で起こっているアクションの多くは、再起動を除いてユーザ側からは見えません。dyldcache内で 「lockdownMode」という文字列を検索したところ、PrivacySettingsUIというフレームワークが以下の2つのC関数を実装していることが判明しました:

bool isLockdownModeEnabled()

void setLockdownModeEnabled(bool)

Turning Lockdown Mode on in the GUI

void setLockdownModeEnabled(bool)関数内で、キーであるLDMGlobalEnabledのブール値を NSUserDefaults API経由で「Yes」に設定。ファイル変更イベントをモニタリングしていると、このファイルのパスを発見しました:/var/mobile/Library/Preferences/.GlobalPreferences.plist

この値はシステムがロックダウンモードの有効、無効を判断する主たる指標となります。ユーザのデフォルトデータベースを手動で上書きし、以下のようなコマンドでこの値を「Yes」に設定。

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool: 1] forKey:@"LDMGlobalEnabled" inDomain:NSGlobalDomain"]

このコマンドはサンドボックス外のほぼすべてのプロセスで実行され、さまざまな関数の戻り値が変化します。これらの関数はdyldcache内で「grep -i lockdownMode」と実行することで見つけることができます。

PUILockdownModeControllerなど、いくつかの関数は、初期化メソッドでファイルの読み込みが発生するため、新しいインスタンスを初期化する必要があります。とはいえ、これらのプロセスが再スタートされると、すべてのプロセスが肯定的な結果を返して、デバイス全体でロックダウンモードが有効になり、この調整はデバイスを完全に再起動しなくても有効になります。

これは、iOS 16.5の時点において、ロックダウンモードはユーザー空間のアーティファクトとして機能し続けている(カーネルはそれに気づいていない)という我々の考察を裏付けるものです。iOS 16.5カーネル内には、ロックダウンモードに関連するコードの実装は見つかりませんでした。この段階では、ロックダウンモードの有効化または無効化にシステムの再起動はまったく必要ありません。

ただ、それは今だけの話であり、blacktopによる「Anatomy of Lockdown Mode」を参照すると、iOS 17以降、Appleはロックダウンモードをカーネルレベルに昇格させており、/System/Library/PrivateFrameworks/LockdownMode.frameworks/lockdownmodedにある独自のバックグラウンドデーモンと、com.apple.driver.AppleLockdownModeというカーネル拡張機能が追加されました。カーネル内のロックダウンモードを変更するには、既存のセキュリティ対策から、デバイスを再起動する必要があり、ある程度のセキュリティ強化につながると評価されています。

再起動の偽装

ロックダウンモードの改ざんに話を戻しましょう。ロックダウンモードを無効にし、システムの再起動をユーザ空間の再起動に置き換えること可能か検証します。マルウェアがどのようにユーザを騙すか実証することがこの調査の目的です。感染したスマートフォンの場合、ロックダウンモードの有効、無効に関わらず、マルウェアがバックグラウンドで実行されるのを阻止する方法はありません。

Screenshot of the LockdownModeController code.

ユーザが設定アプリでロックダウンモードをオンにすると、-[PUILockdownModeController setLockdownModeGloballyEnabled:]というメソッドがトリガーされます。(ロックダウンモードがどのように機能するかは上記のイベントシーケンスを参照)共有アルバムとリンクプレビューの無効化から始まり、開発者モードの無効化、USB制限モードの有効化が起こり、プロファイルのインストールも無効化され、ユーザのデフォルトデータベースのLDMGlobalEnabled キーが「YES」に設定され、変更が同期されます。_DaemonReady 関数の内部で、CFNotificationCenterPostNotification() が呼び出され、WebKit プロセスに構成変更を通知し、最後にデバイスが再起動されます。

-[PUILockdownModeController setLockdownModeGloballyEnabled:]がオブジェクトCメソッドの場合、method_exchangeImplementationsをフックして、その内容を置き換えることができます。我々の実証は極めてシンプルです:ユーザがロックダウンモードをオンにすると、/fakelockdownmode_on という名前のファイルがインジケータとして作成され、ユーザ空間のリブートが開始されます。さらに[PUILockdownModeController lockdownModeEnabled]など他の機能性もフックし、このファイルの存在に基づいた結果を返すようにしました。

Screenshot of Lockdown Mode enabled in the code.

これにより、デバイスは実際にはリブートせず、注入したコードがロックダウンモードの適応制御を維持できるようになりました。これはつまりパーシステンスのないマルウェアであっても、永続的に実行され、ユーザを監視できることを意味します。

Safariの偽ロックダウンモード

Lockdown Mode statuses checked in Safari when Lockdown Mode is off, on, and on with a trusted website

ロックダウンモードの改ざんをさらに実証するために、我々は最もよく使われるアプリケーションのひとつであるSafariを選択。ユーザがSafariを使ってウェブサイトを閲覧していると「ロックダウンが有効」という目立つラベルが表示されるようになり、このラベルは、現在のウェブページのレンダリングにキャプティブポータル版のウェブエンジンが使用されていることを示すサインとなります。何らかの理由で通常のウェブエンジンが代わりに使用された場合、Safariは「ロックダウンは無効」と目立つ赤いフォントで表示します。このシナリオは、ユーザが信頼できるウェブサイト(ウェブサイトの設定で調整できる構成)を閲覧しているときに起こります。

Safariでは、+[WBSUIFeatureAvailability isLockdownModeEnabledForSafari]というたったひとつの関数がロックダウンモードのステータスを決定しており、この関数をフックすることで、この関数がさまざまなシナリオで望ましい結果を返すようにすることができます。例えば、キャプティブポータルのウェブエンジンを使用するかどうかを決める際は「No」を、ユーザインターフェイスの「ロックダウンモードをオンにしますか?」ラベルなど、表面レベルの要素の外観を決定する際は「Yes」を返すようにすることができます。

Screenshot displaying Safari code with Lockdown enabled.

これでSafariはすべてのウェブサイトが信頼されているかのように振る舞うようになり、いくつかのステップを踏むことで「ロックダウンモード無効」ラベルが改ざんされます。これを達成するために、我々はまず文字列 「ロックダウンモード無効」を検索し、WBSAnnotationStringForLockdownModeStatusと呼ばれる関数を特定。そのバックトレースを監視し、この関数が便利にフックすることができるobjective-Cメソッド[SFLockdownStatusBar _updateLabelWithLockdownStatus:] によって呼び出されたことを確認。この関数を改ざんし、通常「ロックダウン無効」と表示されるところを「ロックダウン有効」と表示させます。

Screenshot of Lockdown Mode status within the code.
Screenshot of the code displaying Lockdown Mode within the status bar.

デモビデオ

このデモ動画では、ユーザが設定でロックダウンモードを有効にします。デバイスはロックダウンモードになっているように見えて、実際のところロックダウンモードは有効になってはいません。またこのデモでは、ロックダウンモードのステータスを確認する方法として、crypt.eeのサイトを使用しています。

高度な攻撃を検出しユーザを保護するJamf Executive Threat Protectionについても併せてご検討ください。

Jamfブログの購読

市場トレンドやAppleの最新情報、Jamfのニュースなどをお届けします。

当社がお客様の情報をどのように収集、利用、移転、および保存するかに関しては、プライバシーポリシーをご参照ください。