これは夏の怪談ですね。Windows 10 最新版のサンドボックスから管理者権限を取れちゃう件。見出しごとに軽く紹介。
It all seemed clear. の部分は、NtUserPostMessage によるウィンドウ間コミュニケーションが、特権付きウィンドウなら UIPI (User Interface Priviledge Isolation) によって阻まれるはず………なのに、なぜか 0xCNNN あたりの範囲で許可されているという話。
Tracking down the culprit... は、その許可の原因を探したところ、新規ウィンドウ作成にフックされた MSCTF というライブラリだったという話。CTF が何の略かは不明。
The hidden depths reveal... は CTF が TSF の一部だという話。TSF は IME とかの関係なので日本人なら目にすることのある語。
Understanding the CTF Protocol... は CTF の複雑さの説明。デスクトップセッションごとに CTF モニタサービスが起動し、クライアントからのメッセージを処理する。あらゆるウィンドウが CTF クライアントになる。CTF は Windows 98 時代の Office XP から存在。以来ほとんど変更されていない。
Is there any attack surface? これだけ古ければ、さもありなん。アクセス制御はゼロ。サンドボックスからでさえ CTF に参加できてしまううえに、スレッド ID やプロセス ID やウィンドウハンドラも自己申告。なんなら CTF サービス側になりすますこともできる。ここでさらにやる気になって、ctftool というものを作成。
Exploring CTF with ctftool... 図に示されているとおり、wait notepad.exe と打って待つと、メモ帳の方から接続してきてくれる。そこにデータを注入できる。
Looking for bugs... で、「こんなに複雑怪奇なレガシープロトコルならメモリ破壊もいっぱいあるだろうなぁ、境界チェックや桁あふれチェックもほとんどないだろうなぁ」と言いながら脆弱性を探す。すぐに、メソッド番号を受けとるコマンドを発見。任意の数を受けとるので、どこにでもジャンプさせてくれそう。(しかも例外を CTF ライブラリが吸収してくれるから、クラッシュしないで好きなだけ試行できちゃう)
Let's find something to call... そうは言っても CFG (Control Flow Guard) のホワイトリストにあるところにしか飛べないのだけど、ひたすらメソッド番号をしらみつぶしに探して、良さげなメソッドを発見。
A note about ASLR... やっぱり ASLR はブートごとじゃ弱いみたい。さらに、スタックはプロセスごとにランダマイズされるものの、CTF の仕様から、モニタがスタックの場所を教えてくれちゃうので意味ない。
Browsing what gadgets are available... というわけでサーバのスタックは分かった。クライアントは、任意書き込みガジェットを探したけど、dec しかなかったので、任意の値になるまで回す必要がある。まあ面倒だけど、これで、あちこちガジェットを行ったり来たりしてレジスタ調整すれば、あらゆる CTF クライアントを compromise できちゃう。(メモ帳からでさえ cmd.exe を実行できる)
Making it matter... では影響の大きさを説明。アクセス制御が皆無だから Administrator を含む他のユーザのあらゆるアプリケーションを乗っとれる。さらには LockWorkStation を使えば、既に SYSTEM 権限で動いている Winlogon さえ OK。そう、Winlogon も CTF クライアントなのだ!
これだけでも SYSTEM 権限への上昇という成果だが、
The "TIP" of the iceberg... ここまでのは Windows デフォルトの話。TIP (Text Input Processors) を使うと、もっとできる。IME がインストールされていれば (有効化されていなくても)、あらゆる CTF クライアントがあらゆる (他ユーザセッションの) ウィンドウのテキストを読み書きできてしまう。メモ帳にテキストを書けるだけじゃない。Administrator のコンソールにコマンドを送りつけられる。他ユーザのログイン時にパスワードを読み取れる。サンドボックス内 AppContainer プロセスからもできる。UAC 同意ダイアログも SYSTEM 権限だ。だれでも runas で呼べて、すぐ SYSTEM になれる。
So what does it all mean? バグがなくても CTF は仕様からしてアプリケーション間の内容を読み書きし合う。そこに加えてバグがある。今後マイクロソフトがプロトコル自体を現代的にするかどうかに注目。
Conclusion 大変だったけど、20年近くだれにも気づかれなかった弱点だと分かった。
おーさむ!
これっすね https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-1162 <br>それこそ氷山の一角だろうけど
ここに顛末が一部書いてある。発見者も当惑するネーミングって…… https://bugs.chromium.org/p/project-zero/issues/detail?id=1859#c24
hindsightだけど、クラッシュ連発というのは、このfixの途中だったからなのかもね https://news.mynavi.jp/article/20190803-windows10report/
https://github.com/taviso/ctftool#ctftool <br>今月のパッチを当てれば ctftool は動かないみたい。 <br>いま試してみたら scan すら失敗した。 <br>当然 uac のも失敗した。
https://news.mynavi.jp/article/20190601-834516/ <br>これ誤解してるなあ。メモ帳から「開く」ダイアログで任意コマンドを出せるという茶化しに対して「いやそれはメモリ破壊じゃないし」と反論してるのに