Lucene search
K

max_processes.txt

🗓️ 19 Sep 1999 00:00:00Reported by Packet StormType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 32 Views

Limit the maximum number of processes using Linux-PAM configurations and limits.conf settings.

Code
`Subject: Re: limit maximum nr. of processes.  
To: [email protected]   
  
  
El dia Wed, Sep 01, 1999 at 10:53:48AM +0200, Petter Wahlman <[email protected]> escribió:  
  
  
to limit the maximum number of processes you can use the Linux-PAM  
  
  
edit /etc/pam.d/login  
  
  
#%PAM-1.0  
auth required /lib/security/pam_securetty.so  
auth required /lib/security/pam_pwdb.so shadow nullok  
auth required /lib/security/pam_nologin.so  
account required /lib/security/pam_pwdb.so  
password required /lib/security/pam_cracklib.so  
password required /lib/security/pam_pwdb.so shadow nullok use_authtok  
session required /lib/security/pam_pwdb.so  
session required /lib/security/pam_limits.so  
  
  
you have to add the last two lines  
  
  
then edit  
  
  
/etc/security/limits.conf  
  
  
# /etc/security/limits.conf  
#  
#Each line describes a limit for a user in the form:  
#  
#<domain> <type> <item> <value>  
#  
#Where:  
#<domain> can be:  
# - an user name  
# - a group name, with @group syntax  
# - the wildcard *, for default entry  
#  
#<type> can have the two values:  
# - "soft" for enforcing the soft limits  
# - "hard" for enforcing hard limits  
#  
#<item> can be one of the following:  
# - core - limits the core file size (KB)  
# - data - max data size (KB)  
# - fsize - maximum filesize (KB)  
# - memlock - max locked-in-memory address space (KB)  
# - nofile - max number of open files  
# - rss - max resident set size (KB)  
# - stack - max stack size (KB)  
# - cpu - max CPU time (MIN)  
# - nproc - max number of processes  
# - as - address space limit  
# - maxlogins - max number of logins for this user  
#  
#<domain> <type> <item> <value>  
#  
  
  
#* soft core 0  
#* hard rss 10000  
#@student hard nproc 20  
#@faculty soft nproc 20  
#@faculty hard nproc 50  
#ftp hard nproc 0  
#@student - maxlogins 4  
  
  
  
as you can see you can limit the number of process and much more  
like cpu, stack ...  
  
  
  
  
  
  
>  
> i have made a loadable kernel module that lets you limit the maximum  
> number of processes members of the group USER_GID can execute.  
> this can e.g be used to prevent DoS attacks like:  
>  
> int main()  
> {  
> while(1) fork();  
> return 1;  
> }  
>  
> Setting the limit is easily done through the proc interface:  
>  
> arjuna(root):fork~>cat /proc/maxprocs  
> gid: 500 restricted to: 40 processes  
>  
> arjuna(root):fork~>echo 64 > /proc/maxprocs  
>  
> arjuna(root):fork~>cat /proc/maxprocs  
> gid: 500 restricted to: 64 processes  
>  
> [The module does currently only support v.2.2.X of the Linux kernel.]  
>  
> ________________________________________________________________________________  
> Petter Wahlman  
> [email protected]  
>  
> #define QUESTION ((bb) || !(bb)) - Shakespeare.  
> echo '16i[q]sa[ln0=aln100%Pln100/snlbx]sbA6E616D6C68615720726574746550snlbxq'|dc  
> ________________________________________________________________________________  
  
  
> /***************************************************************  
> * secfork v1.0a - petter wahlman <[email protected]>  
> *  
> * Limit the maximum number of processes members  
> * of the group USER_GID can execute.  
> *  
> * compile:  
> * gcc foo.c -DMODULE -D__KERNEL__ -O2 -fomit-frame-pointer \  
> * -Wstrict-prototypes -Wall -Wunused -c -o secfork  
> *  
> * install:  
> * insmod secfork  
> *  
> * remove:  
> * rmmod secfork  
> *  
> * usage:  
> * echo 64 > /proc/maxprocs # set limit to 64 processes  
> *  
> ***************************************************************/  
>  
> #ifndef __KERNEL__  
> # define __KERNEL__  
> #endif  
> #ifndef MODULE  
> # define MODULE  
> #endif  
>  
> #include <linux/config.h>  
>  
> #define __NO_VERSION__  
> #include <linux/module.h>  
> #include <linux/version.h>  
> char kernel_version [] = UTS_RELEASE;  
>  
> /*  
> #if CONFIG_MODVERSIONS==1  
> #define MODVERSIONS  
> #include <linux/modversions.h>  
> #endif  
> */  
>  
> #include <linux/kernel.h>  
> #include <linux/types.h>  
> #include <linux/fs.h>  
> #include <linux/mm.h>  
> #include <linux/errno.h>  
> #include <linux/sched.h>  
> #include <linux/proc_fs.h>  
> #include <asm/uaccess.h>  
> #include <asm/io.h>  
> #include <sys/syscall.h>  
> #include <errno.h>  
>  
> MODULE_AUTHOR("petter wahlman <[email protected]>");  
> EXPORT_NO_SYMBOLS;  
>  
> #define MAXPROCS 40  
> #define USER_GID (int)500  
> #define MAXDATA (int)8  
>  
> static unsigned long maxprocs = MAXPROCS;  
> extern void *sys_call_table[];  
> asmlinkage int (*old_fork) (struct pt_regs);  
>  
> static struct user_struct {  
> long count;  
> struct user_struct *next, **pprev;  
> unsigned int uid;  
> }user_t;  
>  
> /***( module_output )***/  
> static ssize_t module_output(struct file *file, char *buf, size_t len, loff_t *offset)  
> {  
> static int i, finished = 0;  
> char msg[MAXDATA+50];  
>  
> if (finished) {  
> finished = 0;  
> return 0;  
> }  
>  
> sprintf(msg, "gid: %d restricted to: %ld processes\n", USER_GID, maxprocs);  
> for(i = 0; i < len && msg[i]; i++)  
> put_user(msg[i], buf+i);  
>  
> finished = 1;  
>  
> return i;  
> }  
>  
> /***( module_input )***/  
> static ssize_t module_input(struct file *file, const char *buf, size_t length, loff_t *offset)  
> {  
> static char data[MAXDATA];  
> int i;  
>  
> for (i = 0; i < sizeof(data)-1 && i < length; i++)  
> get_user(data[i], buf+i);  
> data[i] = '\0';  
>  
> maxprocs = simple_strtoul(data, NULL, 10);  
> return i;  
> }  
>  
> static int module_permission(struct inode *inode, int op)  
> {  
> if (op == 4 || (op == 2 && current->euid == 0))  
> return 0;  
>  
> return -EACCES;  
> }  
>  
> int module_open(struct inode *inode, struct file *file)  
> {  
> MOD_INC_USE_COUNT;  
>  
> return 0;  
> }  
>  
> int module_close(struct inode *inode, struct file *file)  
> {  
> MOD_DEC_USE_COUNT;  
>  
> return 0;  
> }  
>  
> static struct file_operations fops = {  
> NULL, /* lseek */  
> module_output,  
> module_input,  
> NULL, /* readdir */  
> NULL, /* select */  
> NULL, /* ioctl */  
> NULL, /* mmap */  
> module_open,  
> NULL, /* flush */  
> module_close  
> };  
>  
> static struct inode_operations iops =  
> {  
> &fops,  
> NULL, /* create */  
> NULL, /* lookup */  
> NULL, /* link */  
> NULL, /* unlink */  
> NULL, /* symlink */  
> NULL, /* mkdir */  
> NULL, /* rmdir */  
> NULL, /* mknod */  
> NULL, /* rename */  
> NULL, /* readlink */  
> NULL, /* follow_link */  
> NULL, /* readpage */  
> NULL, /* writepage */  
> NULL, /* bmap */  
> NULL, /* truncate */  
> module_permission  
> };  
>  
> static struct proc_dir_entry proc_entry =  
> {  
> 0, 8,  
> "maxprocs", /* The file name */  
> S_IFREG | S_IRUGO | S_IWUSR,  
> 1, /* links */  
> 0, 0, /* uid, gid */  
> 0, /* size */  
> &iops,  
> NULL /* read function - in ino structure */  
> };  
>  
> /***( new_fork )***/  
> int new_fork(struct pt_regs regs)  
> {  
> static int n;  
>  
> if (current->uid == 0) return old_fork(regs);  
> for (n = 0; n < NGROUPS; n++)  
> if (current->groups[n] == USER_GID) {  
> if (current->user->count >= maxprocs)  
> return -EPERM;  
> else  
> return old_fork(regs);  
> }  
> return old_fork(regs);  
> }  
>  
> /***( init_module ***/  
> int init_module(void)  
> {  
> printk("secfork v1.0a - petter wahlman <[email protected]>..\n");  
> old_fork = sys_call_table[__NR_fork];  
> sys_call_table[__NR_fork] = new_fork;  
>  
> return proc_register(&proc_root, &proc_entry);  
> }  
>  
> void cleanup_module(void)  
> {  
> sys_call_table[__NR_fork] = old_fork;  
> proc_unregister(&proc_root, proc_entry.low_ino);  
> printk("secfork unloaded..\n");  
> }  
  
  
  
--  
Saludos.  
  
  
===========================================================  
  
  
Alfonso Lazaro Tellez [email protected]  
Analista de seguridad   
IP6Seguridad http://www.ip6seguridad.com   
Tfno: +34 91-3430245 C\Alberto Alcocer 5, 1 D   
Fax: +34 91-3430294 Madrid ( SPAIN )  
===========================================================   
`

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation