...
Code Block | ||
---|---|---|
| ||
int establish(void) { struct/* sockaddr_in sa;This will store the listening socket's address */ struct sockaddr_in sa; /* This will storehold the listening socket's address */ int s; /* This will hold the listening socket */ /* Fill up the structure with address and port number */ sa.sin_port = htons(portnum); /* Other system calls like socket() */ if (bind( s, (struct sockaddr *) &sa, sizeof(struct sockaddr_in)) < 0) { /* Perform cleanup */ } /* Return */ } int main(void) { int s = establish(); /* Block with accept() until a client connects */ switch (fork()) { case -1 : /* Error, clean up and quit */ case 0 : /* This is the child, handle the client */ default : /* This is the parent, continue blocking */ } } |
...
Code Block | ||
---|---|---|
| ||
/* Code with elevated privileges */ int establish(void) { struct/* sockaddr_in sa;This will store the listening socket's address */ struct sockaddr_in sa; /* This will storehold the listening socket's address */ int s; /* This will hold the listening socket */ /* Fill up the structure with address and port number */ sa.sin_port = htons(portnum); /* Other system calls like socket() */ if (bind( s, (struct sockaddr *) &sa, sizeof(struct sockaddr_in)) < 0) { /* Perform cleanup */ } /* Return */ } int main(void) { int s = establish(); /* Drop privileges permanently */ if (setuid(getuid()) == -1) { /* Drop privileges permanently */ /* Handle the error */ } /* Block with accept() until a client connects */ switch (fork()) { case -1: /* Error, clean up and quit */ case 0: /* Close all open file descriptors * This is the child, handle the client */ default: /* This is the parent, continue blocking */ } } |
Risk Assessment
Failure to follow the principle of least privilege may leave the program susceptible to a wide range of attacks that may result in full system compromise. Privilege escalation is possible in the worst case.
...