Por que o algoritmo de verificação de acesso de “man acl” não corresponde à diferenciação real de direitos?

2

Em man acl diz:

2.   else if the effective user ID of the process matches the qualifier of any entry of type ACL_USER, then
              if the matching ACL_USER entry and the ACL_MASK entry contain the requested permissions, access is granted,
              else access is denied.

Como eu entendo, se existirem entradas ACL_USER para o usuário, acesse o acesso concedido ou negado correspondente a esta entrada e o final do algoritmo.

Crie um arquivo e atribua a ele direitos de acesso ::

echo "echo 123" > /file1
chmod 005 file1
setfacl -m u:test1:--- /file1
chown usertest:root /file1

e obtenha

userc@client:~$ getfacl /file1
getfacl: Removing leading '/' from absolute path names
# file: file1
# owner: usertest
# group: root
user::---
user:test1:---
group::---
mask::---
other::r-x

Se eu entendi o algoritmo corretamente, o acesso para execução e leitura é permitido para todos, exceto usertest e test1 , mas para test1 e execute file:

test1@client:~$ sh /file1
123

i.e. obter direitos de acesso de others

Por que a entrada ACL_USER para o usuário 'test1' não nega acesso a test1 ?

p.s. unidade montada com 'acl'

    
por magrif 10.09.2018 / 13:32

1 resposta

2

Nesse caso, como o ACL_MASK não contém bits (e, portanto, a ACL não pode conceder permissões), o kernel do Linux pula totalmente a verificação de ACL. A operação passa apenas para verificar os "outros" bits de permissão (que permitem o acesso).

Isso pode ser um bug que foi introduzido em 2004 na reescrita "suporte genérico à ACL" (commit 42017c2e no tglx / history, dc4ceab7 no unificado). Você pode vê-lo na função acl_permission_check () em fs/namei.c (observe que a 'máscara 'variável não não refere-se ao ACL_MASK, mas aos bits de acesso desejados):

static int acl_permission_check(struct inode *inode, int mask)
{
    unsigned int mode = inode->i_mode;

    if (likely(uid_eq(current_fsuid(), inode->i_uid)))
        ...
    else {
        if (IS_POSIXACL(inode) && (mode & S_IRWXG)) {
            int error = check_acl(inode, mask);
            if (error != -EAGAIN)
                return error;
        }
        ...

Como observação: quando você usa sh /file1 , somente , a permissão + r se aplica ao arquivo1, porque você não está pedindo ao kernel para executar o arquivo - você está executando apenas sh .

    
por 10.09.2018 / 14:38