Por que o redirecionamento () não funciona algumas vezes, mas o appending () funciona?

7

Enquanto estudava para o RHCE, deparei-me com uma situação em que o redirecionamento de stdin não funciona em bash :

# file /tmp/users.txt
/tmp/users.txt: cannot open '/tmp/users.txt' (No such file or directory)  
# semanage login -l > /tmp/users.txt
# file /tmp/users.txt
/tmp/users.txt: empty

No entanto, isso funciona:

# file /tmp/users.txt
/tmp/users.txt: cannot open '/tmp/users.txt' (No such file or directory)
# semanage login -l >> /tmp/users.txt
# file /tmp/users.txt
/tmp/users.txt: ASCII text

Por que isso acontece?

1ª atualização:

Permissões:

# ls -ld /tmp
drwxrwxrwt. 8 root root 4096 Jul 17 15:27 /tmp

ACLs (não uma montagem ACL, mas apenas no caso):

# getfacl /tmp
getfacl: Removing leading '/' from absolute path names
# file: tmp
# owner: root
# group: root
# flags: --t
user::rwx
group::rwx
other::rwx

E estou executando todos os comandos como root (daí o prompt do hash).

2ª atualização

Per Caleb, listagem completa de permissões de /tmp :

# ls -al /tmp
total 40
drwxrwxrwt.  8 root    root    4096 Jul 17 15:37 .
dr-xr-xr-x. 26 root    root    4096 Jul 17 15:07 ..
drwx------.  2 melmel  melmel  4096 Jul 16 21:08 .esd-500
drwxrwxrwt.  2 root    root    4096 Jul 17 15:07 .ICE-unix
drwx------.  2 gdm     gdm     4096 Jul 17 15:08 orbit-gdm
drwx------.  2 gdm     gdm     4096 Jul 17 15:07 pulse-5E9i88IGxaNh
drwx------.  2 melmel  melmel  4096 Jul 16 21:08 pulse-329qCo13Xk
-rw-------.  1 root    root       0 Jul 16 14:32 tmpXd9THg
-rw-------.  1 root    root       0 Jul 16 12:55 tmpie0O98
-rw-------.  1 root    root       0 Jul 16 20:23 tmpr10LrK
-r--r--r--.  1 root    root      11 Jul 17 15:07 .X0-lock
drwxrwxrwt.  2 root    root    4096 Jul 17 15:07 .X11-unix
-rw-r--r--.  1 root    root     865 Jul 16 20:20 yum.conf.security
-rw-------.  1 root    root       0 Jul 10 14:57 yum.log

3ª atualização:

Por Hello71:

# mount | grep /tmp
# mount | grep -w '/'
/dev/mapper/vg_svr-tap-lv_root on / type ext4 (rw)

Respostas às perguntas de Gilles:

Is this something you read about in a book, or did you reach this situation on a real machine?

Percebeu isso ao executar um laboratório em um livro em uma máquina real.

Is SELinux in use?

# sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted

Some Linux-on-Linux virtualisation?

Sim. Convidado do KVM / QEMU.

I second Hello71's request, except please grep /tmp /proc/mounts

Nada corresponde.

Also env | grep '^LD_' please.

Nada corresponde.

Oh, and can we rule out active attacks

Sim, podemos. Eu sou o único que tem acesso a esse convidado.

    
por Belmin Fernandez 17.07.2011 / 21:21

1 resposta

2

Provavelmente, é um bug na política do SELinux em relação a semanage binary (que possui seu próprio contexto semanage_t ) e /tmp directory, que também tem seu próprio contexto - tmp_t .

Consegui reproduzir quase os mesmos resultados no meu CentOS 5.6.

# file /tmp/users.txt 
/tmp/users.txt: ERROR: cannot open '/tmp/users.txt' (No such file or directory)
# semanage login -l  >  /tmp/users.txt
# file /tmp/users.txt 
/tmp/users.txt: empty
# semanage login -l  >>  /tmp/users.txt
# file /tmp/users.txt 
/tmp/users.txt: empty

Quando tentei usar o arquivo em um diretório diferente, obtive resultados normais

# file /root/users.txt
/root/users.txt: ERROR: cannot open '/root/users.txt' (No such file or directory)
# semanage login -l  >  /root/users.txt
# file /root/users.txt
/root/users.txt: ASCII text

Diferença entre /tmp e /root é o contexto deles

# ls -Zd /root/
drwxr-x---  root root root:object_r:user_home_dir_t    /root/
# ls -Zd /tmp/
drwxrwxrwt  root root system_u:object_r:tmp_t          /tmp/

E, finalmente, depois de tentar redirecionar para o arquivo em /tmp , recebi os seguintes erros em /var/log/audit/audit.log

type=AVC msg=audit(1310971817.808:163242): avc:  denied  { write } for  pid=10782 comm="semanage" path="/tmp/users.txt" dev=dm
-0 ino=37093377 scontext=user_u:system_r:semanage_t:s0 tcontext=user_u:object_r:tmp_t:s0 tclass=file
type=AVC msg=audit(1310971838.888:163255): avc:  denied  { append } for  pid=11372 comm="semanage" path="/tmp/users.txt" dev=d
m-0 ino=37093377 scontext=user_u:system_r:semanage_t:s0 tcontext=user_u:object_r:tmp_t:s0 tclass=file

Nota interessante: redirecionar semanage output para pipe funciona OK

#semanage login -l  | tee /tmp/users.txt > /tmp/users1.txt
# file /tmp/users.txt 
/tmp/users.txt: ASCII text
# file /tmp/users1.txt 
/tmp/users1.txt: ASCII text
    
por 18.07.2011 / 09:03