permissão de arquivo com setuid e octal 4000

6

Quando definimos setuid para um arquivo, fazemos o seguinte no terminal:

chmod u+s filename

Isso funciona bem. Mas o número octal 4000 está sempre associado ao setuid (em livros etc).

Eu entendo (até certo ponto) permissões de arquivo, o conceito de umask, setuid e usando números octal com chmod . Mas ainda não consigo descobrir a relação entre o número octal 4000 e o setuid. Por favor explique.

    
por DUKE 17.07.2014 / 16:32

3 respostas

9

É apenas uma convenção. Todos os identificadores constantes estão associados a números no código-fonte do Linux. Alguns deles são muito antigos e vêm dos primeiros lançamentos do kernel, enquanto outros foram adicionados recentemente.

A constante S_ISUID associada a "setuid" é definida em include / uapi / linux / stat.h , um dos inúmeros cabeçalhos do Linux. Poderia ter sido definido para qualquer coisa, mas aconteceu de ser 04000.

Como afirmado por @steeldriver, man 2 stat pode ajudar você a entender o significado das diferentes constantes usadas para a permissão de arquivos:

       S_IFMT     0170000   bit mask for the file type bit fields
       S_IFSOCK   0140000   socket
       S_IFLNK    0120000   symbolic link
       S_IFREG    0100000   regular file
       S_IFBLK    0060000   block device
       S_IFDIR    0040000   directory
       S_IFCHR    0020000   character device
       S_IFIFO    0010000   FIFO
       S_ISUID    0004000   set-user-ID bit
       S_ISGID    0002000   set-group-ID bit (see below)
       S_ISVTX    0001000   sticky bit (see below)
       S_IRWXU    00700     mask for file owner permissions
       S_IRUSR    00400     owner has read permission
       S_IWUSR    00200     owner has write permission
       S_IXUSR    00100     owner has execute permission
       S_IRWXG    00070     mask for group permissions
       S_IRGRP    00040     group has read permission
       S_IWGRP    00020     group has write permission
       S_IXGRP    00010     group has execute permission
       S_IRWXO    00007     mask for permissions for others (not in group)
       S_IROTH    00004     others have read permission
       S_IWOTH    00002     others have write permission
       S_IXOTH    00001     others have execute permission

Nesse trecho, você vê não apenas as constantes e seu valor numérico, mas também a maneira como são escolhidos. Os desenvolvedores / designers escolheram as constantes de maneira que você possa combiná-las. Por exemplo, S_ISUID and S_IRWXU and S_IRUSR and S_IRGRP = 04740 , então permissão 04740 significa precisamente "setuid e todas as permissões para proprietário e permissão de leitura para o grupo proprietário".

    
por 17.07.2014 / 16:51
4

Na maioria dos sistemas semelhantes a Unix, um arquivo, diretório ou qualquer outro objeto de sistema de arquivos é representado por um inode , que contém, entre outras coisas, um inteiro chamado mode , que descreve o tipo de objeto e algumas de suas permissões. Está descrito em POSIX stat.h .

The following symbolic names for the values of type mode_t shall also be defined:

File type:
    S_IFREG
        Regular.
    S_IFDIR
        Directory.
    S_IFLNK
        Symbolic link.

File mode bits:

S_IRWXU
    Read, write, execute/search by owner.

    S_IRUSR
        Read permission, owner.
    S_IWUSR
        Write permission, owner.
    S_IXUSR
        Execute/search permission, owner.
...

S_ISUID
    Set-user-ID on execution.
S_ISGID
    Set-group-ID on execution.
...

Esses são todos os nomes simbólicos para constantes inteiras. S_IFREG é 0100000. S_IRUSR é 000400. S_ISUID é 004000. Eles estão em octal para facilidade de uso: os bits de modo de arquivo podem ser logicamente considerados como sendo 4 grupos de 3 bits cada.

Aqui você pode ver os bits do tipo de arquivo e os bits do modo de arquivo do meu .profile :

$ perl -e 'printf("%#o\n", (stat(".profile"))[2]);'
0100644

Os usuários podem definir os bits de modo (mas não o tipo de arquivo) usando a chamada de sistema chmod , que usa um argumento inteiro (possivelmente usando algumas dessas constantes simbólicas S_ *) ou o utilitário chmod , um nome inteiro ou simbólico (como u+r ).

Como, na prática, não há muitas combinações diferentes de bits de modo, muitos usuários Unix ao longo de muitas décadas chamaram chmod (a chamada do sistema e o comando) com um argumento numérico em vez de nomes simbólicos. 0755 significa "gravável pelo proprietário, legível e executável para todos os outros", 0644 significa "gravável pelo proprietário, legível por todos os outros", 04755 significa "setuid, gravável pelo proprietário, legível e executável por todos os outros" .

    
por 17.07.2014 / 17:00
2

Da página man (em inglês) de chmod (debian jessy): (Destaque por mim)

A numeric mode is from one to four octal digits (0-7), derived by adding up the bits with values 4, 2, and 1. Omitted digits are assumed to be leading zeros. The first digit selects the set user ID (4) and set group ID (2) and restricted deletion or sticky (1) attributes. The second digit selects permissions for the user who owns the file: read (4), write (2), and execute (1); the third selects permissions for other users in the file's group, with the same values; and the fourth for other users not in the file's group, with the same values.

Não sei se isso responde à sua pergunta, mas explica o que significam os números.

    
por 17.07.2014 / 16:52

Tags