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