Sudo in system()
cenains.blog
cenains.blog
But the thing that I don't get the most is that passing a list of arguments is easier than using the shell in a lot of cases. I frequently see people build a list of arguments then join it by spaces! Save yourself a step and just pass the list to `exec` directly.
Not entirely and this is what the post mentions. That compromise of the program calling systemd("sudo <...>") does not necessarily lead to full blown privilege escalation, because the sudoers file can be crafted into letting sudo run pre-specied privileged programs including pre-specified arguments.
Also the compromised system caller will not be able to use poisoned environmental variables to influence the privileged program ran by sudo because sudo wipes the environmental variables by default, before running the privileged program.
Do what now?
> By default, the env_reset flag is enabled. This causes commands to be executed with a new, minimal environment. On AIX (and Linux systems without PAM), the environment is initialized with the contents of the /etc/environment file.
So if you want to make sure there are no sudo commands relying on PATH or any environmental variable you just delete the /etc/environment or set it empty. Like it says in the post, Ubuntu has the $PATH variable in it, and in other distributions it is just empty. The deletion suggestion is for systems where there is a big degree of control over the system, like embedded distributions built with yocto or custom container images.
The author is so very confused. Not a single argument actually in favor of system(), as opposed to execve() which is the alternative mentioned in manuals next to "don't use system".
> execve() executes the program referred to by pathname. This causes the program that is currently being run by the calling process to be replaced with a new program
The argument in favor of system is that it is a standard C library function. It is clearly in the article: > Better, while we are being pragmatic why not use good old system C stdlib function
You make a good point about it not being standard. Is there no standard way of creating a process from an argument vector, without dealing with the shell?