|
Packit |
4e8bc4 |
#include <stdlib.h>
|
|
Packit |
4e8bc4 |
#include <priv.h>
|
|
Packit |
4e8bc4 |
#include <stdio.h>
|
|
Packit |
4e8bc4 |
#include "memcached.h"
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/*
|
|
Packit |
4e8bc4 |
* this section of code will drop all (Solaris) privileges including
|
|
Packit |
4e8bc4 |
* those normally granted to all userland process (basic privileges). The
|
|
Packit |
4e8bc4 |
* effect of this is that after running this code, the process will not able
|
|
Packit |
4e8bc4 |
* to fork(), exec(), etc. See privileges(5) for more information.
|
|
Packit |
4e8bc4 |
*/
|
|
Packit |
4e8bc4 |
void drop_privileges(void) {
|
|
Packit |
4e8bc4 |
priv_set_t *privs = priv_str_to_set("basic", ",", NULL);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
if (privs == NULL) {
|
|
Packit |
4e8bc4 |
perror("priv_str_to_set");
|
|
Packit |
4e8bc4 |
exit(EXIT_FAILURE);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
(void)priv_delset(privs, PRIV_FILE_LINK_ANY);
|
|
Packit |
4e8bc4 |
(void)priv_delset(privs, PRIV_PROC_EXEC);
|
|
Packit |
4e8bc4 |
(void)priv_delset(privs, PRIV_PROC_FORK);
|
|
Packit |
4e8bc4 |
(void)priv_delset(privs, PRIV_PROC_INFO);
|
|
Packit |
4e8bc4 |
(void)priv_delset(privs, PRIV_PROC_SESSION);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
if (setppriv(PRIV_SET, PRIV_PERMITTED, privs) != 0) {
|
|
Packit |
4e8bc4 |
perror("setppriv(PRIV_SET, PRIV_PERMITTED)");
|
|
Packit |
4e8bc4 |
exit(EXIT_FAILURE);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
priv_emptyset(privs);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
if (setppriv(PRIV_SET, PRIV_INHERITABLE, privs) != 0) {
|
|
Packit |
4e8bc4 |
perror("setppriv(PRIV_SET, PRIV_INHERITABLE)");
|
|
Packit |
4e8bc4 |
exit(EXIT_FAILURE);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
if (setppriv(PRIV_SET, PRIV_LIMIT, privs) != 0) {
|
|
Packit |
4e8bc4 |
perror("setppriv(PRIV_SET, PRIV_LIMIT)");
|
|
Packit |
4e8bc4 |
exit(EXIT_FAILURE);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
priv_freeset(privs);
|
|
Packit |
4e8bc4 |
}
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
void setup_privilege_violations_handler(void) {
|
|
Packit |
4e8bc4 |
// not needed
|
|
Packit |
4e8bc4 |
}
|