SYSRET 64bit OS Privilege escalation on Intel CPU (patch code)

Index: sys/amd64/amd64/trap.c
===================================================================
--- sys/amd64/amd64/trap.c.orig
+++ sys/amd64/amd64/trap.c (working copy)
@@ -972,4 +972,21 @@
       syscallname(td->td_proc, sa.code)));
 
  syscallret(td, error, &sa);
+
+ /-
+  * If the user-supplied value of %rip is not a canonical
+  * address, then some CPUs will trigger a ring 0 #GP during
+  * the sysret instruction.  However, the fault handler would
+  * execute with the user's %gs and %rsp in ring 0 which would
+  * not be safe.  Instead, preemptively kill the thread with a
+  * SIGBUS.
+  *-
+ if (td->td_frame->tf_rip >= VM_MAXUSER_ADDRESS) {
+  ksiginfo_init_trap(&ksi);
+  ksi.ksi_signo = SIGBUS;
+  ksi.ksi_code = BUS_OBJERR;
+  ksi.ksi_trapno = T_PROTFLT;
+  ksi.ksi_addr = (void *)td->td_frame->tf_rip;
+  trapsignal(td, &ksi);
+ }
 }

by codexb | 2012/07/14 21:21 | Ring0 | 트랙백

트랙백 주소 : http://leony.egloos.com/tb/5657561
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.

◀ 이전 페이지          다음 페이지 ▶