Подробности

[В начало]

Проблема в стандарте № S0102

Краткое описание

setreuid/setregid может изменить saved set-user/group-ID

Подробное описание

В стандарте LSB ничего не сказано про изменение сохраненного идентификатора пользователя функцией setreuid(). Но на самом деле эта функция меняет его, если реальный или эффективный идентификатор пользователя устанавливается в значение отличное от предыдущего реального идентификатора пользователя. Эта особенность описана в Linux man pages. Предлагается описать данную особенность в стандарте LSB.

Следующий код иллюстрирует проблему. Этот код надо запускать под пользователем root.

#include <unistd.h>
#include <stdio.h>

// Prints real user ID, effective user ID,
// real group ID and effective group ID
static void ReadIds( void ) {
  printf( "Read real user ID, effective user ID,"
          "real group ID and effective group ID :\n"
          "[%3d|%3d|%3d|%3d]\n",
          getuid(), geteuid(), getgid(), getegid()
        );
}

int main( int argc, char ** argv ) {
  ReadIds();
  printf( "Set real user ID and effective user  ID\n" );
  printf( "to non root (uid 500) with setreuid( 500, 500 ): " );
  if (setreuid( 500, 500 ) == 0 ) 
  { 
    printf( "passed.\n" );           
  }
  else 
  { 
    printf( "failed.\n" ); 
    return -1; 
  }
  ReadIds();
  printf( "Try to set effective user  ID to 0 with seteuid( 0 ): " );
  // The following seteuid() call fails, because argument
  // does not equal to saved set-user-ID. The seteuid() function may be
  // replaced by setuid(0), setreuid(0,0) but the problem is still
  // the same. So it seems that the saved set-user-ID was changed by setreuid().
  if ( seteuid( 0 ) == 0 ) { 
    printf( "passed.\n" ); 
  }
  else { 
    printf( "failed.\n" ); 
  }
  ReadIds();
   
  return 0;
}

Полностью аналогичная картина с функцией setregid().

Раздел стандарта

Linux Standard Base Core Specification 3.1, Chapter 13. Base Libraries, 13.3. Interfaces for libc, 13.3.2. System Calls, который ссылается на The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition, System Interfaces, the description of sereuid() function

[В начало]