Mais conteúdo relacionado James Windows10 elevator action final-jp26. James Forshaw @tiraniddo
脆弱なコードのパターン
NTSTATUS DriverEntry(DRIVER_OBJECT *DriverObject, ...) {
// 脆弱な可能性がある
IoCreateDevice(DriverObject, 0, Name, FILE_DEVICE_UNKNOWN,
0, TRUE, &DeviceObject);
// デバイスの名前空間が保護されている
IoCreateDevice(DriverObject, 0, Name, FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN, TRUE, &DeviceObject);
// 名前にもかかわらず、脆弱なまま
IoCreateDeviceSecure(DriverObject, 0, Name,
FILE_DEVICE_UNKNOWN,
0, TRUE, SecuritySddl, NULL,
&DeviceObject);
}
26
27. James Forshaw @tiraniddo
例:Windows ソケット
● LinuxやOS Xでは、ソケットはシステムコールとして実装
● Windowsでは Ancillary Functionドライバ(AFD) 内に実装
● DeviceAfd を通じて情報をやり取り
● しかし、デバイスの名前空間は DeviceAfdEndpoint に命令を投げ
ることで開かなくてはならない
● 名前空間にはセキュリティが無い (>_<)
● その後の操作は DeviceIoControl を通じて行う
30. James Forshaw @tiraniddo
何を探すべき?
● 最適な場所はハンドラの中で次のものを探すこと:
○ IRP_MJ_DEVICE_CONTROL
○ IRP_MJ_FILE_SYSTEM_CONTROL
○ Classic IOCTL bugs
● コントロールコードはデバイスハンドルが呼び出すのに必要な
権限を符号化しており、また、情報を投げるためのパラメータ
を含んでいる
30
デバイスタイプ ビット
30 - 16
必要な
アクセス
15-14
ファンクション
コード
12-2
転送の
タイプ
1-0
METHOD_BUFFERED 0
METHOD_IN_DIRECT 1
METHOD_OUT_DIRECT 2
METHOD_NEITHER 3
FILE_ANY_ACCESS 0
FILE_READ_ACCESS 1
FILE_WRITE_ACCESS 2
35. James Forshaw @tiraniddo
攻撃の手段は・・・
● MS15-111 においてプロセス毎のデバイスマップがサンドボックス
から取り除かれた
if (ProcessInformationClass ==
ProcessDeviceMap) {
if (RtlIsSandboxedToken(NULL)) {
return STATUS_ACCESS_DENIED;
}
return ObSetDeviceMap(ProcessHandle,
DirectoryHandle);
}
35
37. James Forshaw @tiraniddo
なりすましとデバイスマップ
● 特権サービスがユーザに成りすますときは、ユーザもまたデバイ
スマップに成りすます。
● C:シンボリックリンクをユーザ毎のデバイスマップのディレクト
リにドロップすることで、成りすましている間はC: の配下で動く
サービスをコントロールできる。
● MS15-038 の前は、このDLLロードを狙ったプロセス内で行うこと
で実現できた。
○ デバイスマップの成りすましを無効化する新しいオブジェクト属性
OBJ_IGNORE_IMPERSONATED_DEVICEMAP を追加することで修
正された。
● しかし、まだ使える。たとえば、なりすまし中のプロセス作成は
依然として脆弱。
● 「保護された」設定を読み込むことも同様に脆弱。
● オリジナルのDLLバージョンはダウンロード可能
https://code.google.com/p/google-security-research/issues/detail?
id=240
37
39. James Forshaw @tiraniddo
興味深いオブジェクト属性のフラグ
39
フラグ名 値 解説
OBJ_CASE_INSENSITIVE 0x0040
システムが大文字小文字を識別す
るように設定された場合に興味深い
(デフォルトはNO)
OBJ_OPENLINK 0x0100
Opens a “link” オブジェクトを開く。
レジストリキーのシンボリックリンクを
開くことに使用。
OBJ_KERNEL_HANDLE 0x0200
カーネルモードで設定されなかった
ら、ハンドルを現行のプロセスに対し
てさらす。
OBJ_FORCE_ACCESS_CHECK 0x0400
カーネルモードで設定されなかった
ら、リソースをセキュリティチェック無
しで開く。
OBJ_IGNORE_IMPERSONATED_DEVICEMAP 0x0800
なりすまされたデバイスマップを無視
する。
40. James Forshaw @tiraniddo
デフォルトのACLとオーナー
● ファイルもしくはオブジェクトの権限は下記の3つのうちの1つに依存
○ 自らのコンテナ(ディレクトリなど)から受け継いだ権限
○ 現在有効なトークンにおけるデフォルト権限
○ カーネル システム コールに渡されたセキュリティ記述子
40
デフォルト
Group
デフォルト
DACL
デフォルト
Owner
整合性レベルも
トークンから受け継がれる
41. James Forshaw @tiraniddo
もし DeviceMap が存在しなかったら?
NTSTATUS SeGetTokenDeviceMap(TOKEN *token,
DEVICE_MAP **device_map) {
if (!token->LogonSession->pDeviceMap) {
swprintf_s(
&SourceString,
L"Sessions0DosDevices%08x-%08x",
token->AuthenticationId.HighPart,
token->AuthenticationId.LowPart);
InitializeObjectAttributes(&ObjectAttributes,
SourceString, OBJ_KERNEL_HANDLE, ...);
ZwCreateDirectoryObject(&DirectoryHandle,
DIRECTORY_ALL_ACCESS, &ObjectAttributes);
ObSetDirectoryDeviceMap(&token->LogonSession,
DirectoryHandle);
}
*device_map = token->LogonSession->pDeviceMap;
}
41
42. James Forshaw @tiraniddo
デフォルトセキュリティ
● 実行過程における必要に基づいて作成されたデバイスマップ ディ
レクトリは、それゆえに、呼び出したものの権限を得る。
○ Owner セット
○ デフォルト DACL
● つまり、デバイスマップにアクセスできる。
● このことを、限られた方法ながら、プロセス毎のデバイスを失っ
たことの埋め合わせに使用できる。
● また、レジストリ・キーやファイルなどの他のさまざまなリソース
にも使える
1. トークン(S4Uから等)を初期化されていないデバイスマップととも
に受け取る
2. トークンに成りすまし、デバイスマップにアクセスして作成する
3. ユーザに成りすましながら、リソースを開いたりカーネル関数を
呼び出す
42
43. James Forshaw @tiraniddo
Win32 の自動リダイレクト
43
● Win32 API はネイティブAPIを呼び出したときに特定のファイル名
をリダイレクトする
○ COM1 -> ??COM1
○ NUL -> ??NUL
○ などなど
● システムサービスはほとんど保護しない。
● もし、なりすまし中に呼び出された場合、完全なパスをコントロ
ールしていなくてもファイルアクセスをリダイレクトできる
● 例:
○ もし、サービスがc:somepathyourfile を開いた場合、他のファイル
へリダイレクトできる
○ 設定情報へ悪用が可能
44. James Forshaw @tiraniddo
パスの正規化
● パスの正規化はWindowsとLinux・OSXでまったく異なる
● LinuxやOSXではパスはそのままでカーネルに渡される
○ カーネルがパスの正規化に責任を持つ
○ 「. 」と「.. 」ディレクトリは本物のディレクトリエントリ
● Windowsでは、絶対パスでカーネルに渡されなくてはならない
○ 相対パスのコンポーネントはユーザモードで取り除かれる
○ 現行のディレクトリが処理される
○ 「. 」と「.. 」 はシミュレートされたディレクトリ
44
45. James Forshaw @tiraniddo
パスの正規化
45
A B C
Path Linux/OSX Windows
A/B/C Valid Valid
A/B/C/../../B Valid Valid
A/B/D/../C Invalid Valid
A/B/D”/../C Invalid Valid
const char* path = "c:myapp.exe" ....windowsnotepad.exe";
if (CheckSig(path)) {
snprintf(cmdline, ""%s" arg", path);
CreateProcess(NULL, cmdline, ...);
}
54. James Forshaw @tiraniddo
NTFS の交互データ・ストリームだ!
54
c:windows tracing:malicious.exe
ALLOWED
● 生成されて名づけられたストリームに対するディレクトリにおけ
るFILE_WRITE_DATA/FILE_ADD_FILE の権限があれば良い。
● このバグはWindows 10で修正されているが、Windows 8.1以下で
はそのまま。
55. James Forshaw @tiraniddo
Windows シンボリックリンク
55
Windows NT 3.1 – 1993年7月27日
オブジェクトマネージャシ ンボリックリンク
レジストリキー シンボリックリンク
Windows 2000 – 2000年2月17日
NTFS マウント ポイントと
ディレクトリ ジャンクション
Windows Vista –
2006年11月30日
NTFS シンボリックリンク
57. James Forshaw @tiraniddo
奇妙なデフォルト権限
● C:WindowsTemp と C:ProgramData は、標準ユーザに新規ファ
イルの作成を許可。
● その権限を誤って使っているプログラムを見つけたら、それらを
攻撃するために新しいファイルもしくはシンボリックリンクをつ
くることができる。
● ファイルの削除は必ずしも可能である必要は無い。無論、見つけ
出す価値はある。
57
59. James Forshaw @tiraniddo
便利なツール (私のチョイス)
59
● SysInternals
○ Process Explorer
○ Process Monitor
○ WinObj
● WinDBG
● Rohitab API Monitor (http://www.rohitab.com/apimonitor)
● RPCView (http://www.rpcview.org/)
● OleView.NET (https://github.com/tyranid/oleviewdotnet)
● Sandbox Analysis Tools (
https://github.com/google/sandbox-attacksurface-analysis-tools
● IDA Pro