
CVE-2020-27949の概念実証エクスプロイト。macOSプロセスにおけるDTrace fasttrap ioctlを介した任意メモリ読み書きを、昇格した権限なしで実証します。
/dev/fasttrap デバイスは、pid および objc プロバイダのトラップノードをユーザー空間プロセスに作成するためのもので、パーミッションは 666 です。同じく 666 である /dev/dtrace とは対照的に、fasttrap にはパーミッションチェックがありません。これにより、任意のプロセスが FASTTRAPIOC_MAKEPROBE または FASTTRAPIOC_GETINSTR ioctl を発行できます。
攻撃者は FASTTRAPIOC_MAKEPROBE を使用して、他の任意のプロセスの任意のメモリ位置にプローブを作成できます。これらのプローブが有効化されると、指定されたメモリ位置の値はトラップ命令(x86では 0xCC)に置き換えられ、元の値はシャドウメモリに配置されます。元の値の取得は FASTTRAPIOC_GETINSTR ioctl で可能です。これにより、攻撃者は複数のトラップを配置することで、他のプロセスの任意のメモリを読み取ることができます。
この脆弱性は CVE-2020-27949 として追跡されており、macOS Big Sur 11.1、セキュリティアップデート 2020-001 Catalina、セキュリティアップデート 2020-007 Mojave で修正されました。
0xCC)を書き込むことができます。root として実行されているプロセスにでもメモリを書き込むことが可能です。他の命令やジャンプアドレスの一部として、被害者の制御フローを変更でき、特権の昇格が可能になります。ユーザーとして、DTrace を有効にすると、root パーミッションを持つプロセスのみが他のプロセスをトレース、計測、または変更できるようになることを期待します。DTrace は、dtruss、iotop などのツールを提供する管理タスクに役立つツールです。
被害者(target)は root として実行される実行ファイルです。攻撃者(memaccess)は通常のユーザーパーミッションで実行される実行ファイルです。トレーススクリプト libc_monitor.d は、libsystem_c.dylib 共有オブジェクト内の関数呼び出しの数を記録します(これは、マシン所有者が実行する可能性のある管理スクリプトの単純な例にすぎません)。
libc_monitor.d)管理操作の一部として発生する可能性があります。FASTTRAPIOC_GETINSTR を使用して、作成されたプローブのメモリ値を読み取ります。ステップ 4 は、被害者プロセスのメモリをトラップ命令の値に置き換えます。アプリケーションによっては、攻撃者はこれを使用して、重要なメモリ位置に既知の値を書き込むことができます。たとえば、攻撃者は RNG のシードを制御したり、プロセス内の暗号化キーを置き換えたりできます。
注: 攻撃者は昇格された権限または root 権限を必要としません。
注2: 自作の DTrace スクリプトは必要ありません。たとえば、dapptrace も pid プロバイダを使用して任意の関数をトレースします。
/dev/fasttrap に /dev/dtrace と同様の権限チェックを実装するか、ワールドライタブルパーミッションを削除します。
注: リリースされた修正は確認していません。
target を実行し、画面の指示に従います。