このリポジトリには、特権のないユーザーがシステムに任意のカーネル ドライバーをロードできるようにする TeamViewer の脆弱性のエクスプロイト概念実証が含まれています。脆弱性を報告し、責任を持って開示するために協力してくれた Zero Day Initiative に感謝します。
これらの脆弱性によって終了した研究の詳細については、私のブログの次の 3 部構成のブログ シリーズでご覧いただけます。これらの脆弱性についてはさらに詳しく説明されており、プロセス中に失敗した箇所も示されています。パート 3 は楽しいものです :P.
エクスプロイトのビデオは次の場所にあります。
SYSTEM サービス IPC に接続するときに有効な TeamViewer クライアントをスプーフィング(ブログで詳しく説明されているように、単純な認証) できるようになると、任意のドライバーのインストールをトリガーすることが可能になりました。 TeamViewer は、インストールされているドライバーの署名を検証していませんでした。
したがって、TeamViewer のおかげで、USER から KERNEL への権限の拡張が可能になりました。
最良のアプローチの 1 つは、よく知られた手法BYOD (Bring Your Own Vulnerable Driver) を使用して、有効な署名付きドライバーを Windows カーネルにロードし、それを悪用して、任意のトークンの変更など、ユーザー レベルから特権アクションを実行することです。特権のあるものでプロセスを実行します。
TeamViewer がシステムにインストールされると、SYSTEM として実行されるサービス、 TeamViewer_service.exeが作成されます。
このサービスは、クライアントのいくつかのタスクを支援します。したがって、クライアントは昇格された特権で実行されず、一部のタスクはサービスに委任されます。
サービス (IPC) との通信は、ソケット ( Overlapped I/OおよびIoCompletionPort を使用) を通じて実装されます。デフォルトでは、TeamViewer SYSTEM サービスはローカルホストの5939/tcpでリッスンします。
TeamViewer は、ドライバーのインストールや署名のチェックなどを求めるためにクライアントから送信されたパラメーターをフィルタリングしていません。
つまり、アイデアは次のとおりです。TV クライアントを偽装し、 VPN ドライバーのインストールを要求しますが、別の INF を示します。 TeamViewer の同じ元の INF を再利用しましたが、別の (特権のない) パスで「不正な」ドライバーの名前をTeamviewervpn.sysに変更しました。これは、元の INF の対象となっているドライバー名だからです。
これにより、TeamViewer のオプション「変更にはこのコンピュータの管理者権限が必要」もバイパスされます。
権限のないユーザーがボタンをクリックするとTeamViewer オプションが無効になるため、このチェックは GUI 経由でのみ有効です。ただし、ソケットに接続して任意のドライバーのロードを実行することは可能です。
クライアントが PID とバージョン間の別のデータを指定した IPC メッセージのため、エクスプロイトはバージョンに依存します。クライアントのバージョンは、SYSTEM サービスのバージョンと一致する必要があります。 Main.cpp 内のエクスプロイト (140 行目から 143 行目) を、対象となる TeamViewer_service.exe バージョンに変更する必要があります。
したがって、基本的には、SYSTEM サービスに接続する TeamViewer クライアントを偽装し、任意のドライバーのインストールを要求します。 TeamViewer サービスは親切にそれをカーネルにロードします。
TeamViewer には、私が最初に発見したメッセージ ( [VPN ドライバーのインストール] をクリックするとスローされるメッセージ) とよく似た別の IPC メッセージがあります。このもう 1 つのメッセージは、プリンター ドライバーをインストールするように求めるものです。
したがって、本質的に、CVE-2024-7479 と CVE-2024-7481 は同じですが、TeamViewer は同じエラーを 2 回犯しました。メッセージは異なりますが、非常に似ています。それらは異なる IPCメソッド ID を持っています。
結果は同じで、任意のドライバをロードできます。