setuid in scripten - war: Re: [linux-l] Datum in Script verwenden
Peter Ross
Peter.Ross at alumni.tu-berlin.de
Mi Apr 11 23:17:50 CEST 2007
Hi Frank,
On Wed, 11 Apr 2007, Frank Reker wrote:
> das tut nicht not. lediglich das open wird vorgezogen. so dass beim
> eigentlichen open-aufruf lediglich der filedescriptor der bereits
> geoeffneten datei zurueckgegeben wird. dadurch erhaelt man die
> gewuenschte atomaritaet.
Dazu muesste jeder in Frage kommender Interpreter um diese Funktionalitaet
erweitert werden.
> ob eine datei veraenderbar ist oder nicht haengt von den zugriffsrechten
> ab. genau wie bei jedem setuid-binary auch.
Nein. Das Setuid-Binary kann nicht mehr veraendert werden, egal wie die
Zugriffrechte (BTW: auch die des Verzeichnisses sind zu beachten) sind.
Sicherheit funktioniert auch stufenweise, meist gibt es mehr als eine
Massnahme. Wenn man dann eine nach dem anderen aushebelt, steht man nackt
da (alle Unix-Systeme haben inzwischen sogar zusaetzliche Konzepte, um das
System vor dem "Ich bin root, ich darf das!" zu schuetzen).
> 3) handelt es sich um ne sache, die schon ewig existiert,
> und auf einmal gestrichen wird.
Nein, das ist schon lange auf allen von mir benutzten Unix-Systemen
Praxis. Meine "Entdeckung" stammt ganz sicher noch aus Berliner Uni-Tagen,
und da war ich bis 1999.
Hier uebrigens noch etwas Sicherheitsrelevantes aus der FreeBSD-Manpage,
speziell zum Oeffnen von Files:
SECURITY CONSIDERATIONS
Read and write permissions to files are determined upon a call to
open(2). Once a file descriptor is open, dropping privilege does not
affect the process's read/write permissions, even if the user ID speci-
fied has no read or write permissions to the file. These files normally
remain open in any new process executed, resulting in a user being able
to read or modify potentially sensitive data.
To prevent these files from remaining open after an exec(3) call, be sure
to set the close-on-exec flag is set:
void
pseudocode(void)
{
int fd;
/* ... */
fd = open("/path/to/sensitive/data", O_RDWR);
if (fd == -1)
err(1, "open");
/*
* Set close-on-exec flag; see fcntl(2) for more information.
*/
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
err(1, "fcntl(F_SETFD)");
/* ... */
execve(path, argv, environ);
}
Es gruesst
Peter
Mehr Informationen über die Mailingliste linux-l