...
Compliant Solution
A better solution would be is to ensure that we have proper privileges exist before attempting to carry out a permanent drop.
Code Block | ||
---|---|---|
| ||
/* Store the privileged ID for later verification */ uid_t privid = geteuid(); /* Code intended to run with elevated privileges */ /* Temporarily drop privileges */ if (seteuid(getuid()) != 0) { /* Handle error */ } /* Code intended to run with lower privileges */ if (need_more_privileges) { /* Restore Privileges */ if (seteuid(privid) != 0) { /* Handle error */ } /* Code intended to run with elevated privileges */ } /* ... */ /* IfRestore we have low privileges, restoreif themneeded */ if (geteuid() != privid) { if (seteuid(privid())) { /* Handle Error */ } } /* Permanently drop privileges */ if (setuid(getuid()) != 0) { /* Handle error */ } if (setuid(0) != -1) { /* Privileges can be restored, handle error */ } /* Code intended to run with lower privileges */ |
...