Por que o mknod requer privilégios de root?

5

Notei que o comando mknod exigia privilégios de root quando criava um nó diferente de um arquivo normal, FIFO ou um soquete Unix.

Por que isso? Como um usuário comum pode prejudicar um sistema ou comprometer a privacidade de outros usuários com o comando mknod que ele não consegue ao criar arquivos regulares?

    
por mittelmania 18.01.2016 / 15:39

4 respostas

8

Se você pudesse chamar mknod arbitrariamente, então você poderia criar arquivos de dispositivos possuídos e acessíveis por você para qualquer dispositivo. Os arquivos do dispositivo fornecem acesso ilimitado aos dispositivos correspondentes; portanto, qualquer usuário poderia acessar dispositivos arbitrariamente.

Por exemplo, suponha que /dev/sda1 tenha um sistema de arquivos ao qual você não tem acesso. (Digamos, ele é montado em /secret ). Por aqui, /dev/sda1 é bloco especial 8,1, então se você pudesse chamar mknod, por exemplo mknod ~/my_sda1 b 8 1 , então você poderia acessar qualquer coisa em /dev/sda1 através de seu próprio arquivo de dispositivo para /dev/sda1 , independentemente de quaisquer restrições do sistema de arquivos em /dev/sda1 . (Você obtém o dispositivo como um arquivo simples sem nenhuma estrutura, portanto, você precisaria saber o que fazer com ele, mas há bibliotecas para acessar arquivos de dispositivo de bloco.)

Da mesma forma, se você pudesse criar sua própria cópia de /dev/mem ou /dev/kmem , você poderia examinar qualquer coisa na memória principal; Se você pudesse criar sua própria cópia de /dev/tty* ou /dev/pts/* , você poderia gravar qualquer entrada de teclado - e assim por diante.

Portanto, o mknod na mão de usuários comuns é prejudicial e, portanto, seu uso deve ser restrito.

N.B. É por isso que a opção nodev mount é crucial para dispositivos móveis, caso contrário, você poderia trazer seus próprios arquivos de dispositivo em mídias móveis preparadas.

    
por 18.01.2016 / 16:16
4

Com mknod , você cria arquivos especiais de dispositivos que permitem o acesso bruto ao hardware. Ou seja, o kernel examina as permissões do arquivo especial do dispositivo para decidir se determinado usuário tem acesso bruto ao hardware, não a qualquer configuração ou algo assim.

Por exemplo, no Debian, dispositivos relacionados a unidades ópticas são criados com bits de permissão 0660, usuário root e grupo cdrom ; então qualquer um que seja root ou no grupo cdrom pode fazer coisas como "criar uma imagem usando dd de /dev/dvd em vez de usar um sistema de arquivos montado". Isso pode não significar muito para você até que você perceba que a mesma coisa acontece com seus discos rígidos (por exemplo, /dev/sda ) aos quais você também seria capaz de escrever.

Enquanto arquivos especiais de dispositivos são criados convencionalmente sob o diretório /dev , não há nada inerente no sistema Linux que o requeira; qualquer sistema de arquivos (que não esteja montado com a opção nodev ) pode conter nós de dispositivo. A única coisa que liga um nó de dispositivo ao dispositivo real é o tipo (bloco ou caractere) e os nós principais e secundários.

Assim, se usuários regulares pudessem criar arquivos especiais de dispositivos, eles poderiam ignorar toda a segurança do kernel e acessar todo o hardware diretamente simplesmente criando um arquivo especial do dispositivo (em seu diretório pessoal, digamos), e usando isso para nuke o disco rígido.

Como tal, a criação de arquivos especiais de dispositivos só pode ser feita por root .

    
por 18.01.2016 / 17:23
4

Após os tipos de arquivo FIFO e socket, o mknod também pode criar arquivos de dispositivos. Estes são usados para acessar dispositivos.

Conceder acesso a dispositivos é considerado uma operação privilegiada. Geralmente, não queremos criar nós de dispositivos arbitrários e torná-los acessíveis a usuários comuns. Isso seria ruim.

[Além disso: normalmente, o acesso ao dispositivo é concedido alterando as permissões em um nó de dispositivo existente. No Linux padrão, /dev/ é controlado por udev , então você usa regras extras do udev].

Exemplo

$ mount|grep -w /
/dev/mapper/vg_fossil-root on / type ext4 (rw,seclabel,data=ordered)

$  ls -l /dev/mapper/vg_fossil-root
lrwxrwxrwx. 1 root root 7 Jan 18 08:46 /dev/mapper/vg_fossil-root -> ../dm-0
$ ls -l /dev/dm-0
brw-rw----. 1 root disk 253, 0 Jan 18 08:46 /dev/dm-0

Como root:

# mknod root-partition b 253 0
# chmod a+rw root-partition  # make file available as if created as a normal user

Agora tenho acesso direto ao dispositivo que armazena seu sistema de arquivos.

$ ls -l root-partition 
brw-rw-rw-. 1 root root 253, 0 Jan 18 15:05 root-partition

Eu posso ler dados de arquivos que eu não teria permissões em

$ grep secret root-parition
Binary file root-partition matches

Ou remova o "echo" antes deste próximo comando e seu sistema de arquivos não existirá mais.

$ echo dd if=/dev/zero of=root-partition

Limpeza

Depois de criar arquivos de dispositivos extras para jogar, você pode removê-los com segurança sem danificar nada.

$ rm root-partition

A menos que você cometa um erro e remova o arquivo errado, ou talvez literalmente todos os arquivos. Este comando não fornecerá desfazer / desfazer a exclusão ou solicitar confirmação. A linha de comando é implacável :). A única proteção é que sem -r ou * , ele não removerá nenhum diretório.

    
por 18.01.2016 / 16:08
0

Você pode usar mknod para acessar os arquivos do dispositivo em chroot "prison" (por exemplo, o dispositivo para o sistema de arquivos raiz)

    
por 18.01.2016 / 15:50