Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 05 Feb 2000 23:08:54 +0900
From:      Atsuo Ohki <ohki@gssm.otsuka.tsukuba.ac.jp>
To:        freebsd-hackers@FreeBSD.org
Cc:        ohki@gssm.otsuka.tsukuba.ac.jp
Subject:   some guard against stack overflow attack
Message-ID:  <200002051408.XAA02525@smr00.gssm.otsuka.tsukuba.ac.jp>

next in thread | raw e-mail | index | archive | help
Hi folks

 I'd like to propse a simple guard against stack overflow attack.
 The idea is very simple: just prevent system call from writable
 user area (i.e. data & bss area) except SYS_sigreturn.

 It has few performance penalty and can prevent trivial stack
 overflow attack such as simply executing shell.


*** /usr/src/sys/i386/i386/trap.c-ORIG	Mon Aug 30 01:05:56 1999
--- /usr/src/sys/i386/i386/trap.c	Fri Feb  4 22:30:44 2000
***************
*** 1074,1079 ****
--- 1074,1090 ----
  
   	if (p->p_sysent->sv_mask)
   		code &= p->p_sysent->sv_mask;
+ /* begin XXXXXXX -- prevent system call from writable user area */
+ 	if (code != SYS_sigreturn &&
+ 	    ((int)(*vtopte(frame.tf_eip-frame.tf_err))&(PG_V|PG_RW|PG_U))
+ 		!= (PG_V|PG_U)) {
+ 		printf("pid%d: %d@0x%08x\n",
+ 		       p->p_pid, code, frame.tf_eip-frame.tf_err);
+ 		trapsignal(p, SIGILL, T_PRIVINFLT);
+ 		error = -1; /* just prevent warning */
+ 		goto bad_syscall;
+ 	}
+ /* end XXXXXXX */
  
   	if (code >= p->p_sysent->sv_size)
   		callp = &p->p_sysent->sv_table[0];
***************
*** 1140,1145 ****
--- 1151,1159 ----
  		frame.tf_eflags &= ~PSL_T;
  		trapsignal(p, SIGTRAP, 0);
  	}
+ /* begin XXXXXXX */
+ bad_syscall:
+ /* end XXXXXXX */
  
  	userret(p, &frame, sticks);
  


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200002051408.XAA02525>