Questão O dd requer o CAP_SYS_RAWIO?


Há pouco tempo, descobri esta que costumava haver uma maneira de desativar semi-permanentemente a capacidade de até mesmo o root de modificar flags imutáveis ​​e somente anexados (lcap CAP_LINUX_IMMUTABLE) ou executar operações de leitura / gravação brutas (lcap CAP_SYS_RAWIO). Eu queria tentar isso, mas desde que o conjunto delimitador de recursos de todo o sistema foi removido, eu atualizei o kernel do Linux de tal maneira que os comandos que requerem qualquer recurso são sempre negados. Como tal, eu assumi que isso renderia dd inútil como uma maneira de contornar e desativar essas restrições desde lcap CAP_SYS_RAWIO "não permite que o root grave no disco bruto ou na memória bruta".

Para ver se minhas modificações foram bem-sucedidas, eu corri sudo dd if=/dev/sda of=mbr.img bs=512 count=1. A operação foi bem-sucedida, então presumi que isso fosse permitido porque era apenas uma operação de leitura. Então eu corri sudo dd if=/dev/null of=/dev/sda bs=512 count=1mas, para meu espanto, isso também foi bem-sucedido. Eu verifiquei se eu tinha perdido algum teste de código para CAP_SYS_RAWIO no kernel do Linux, descobri que eu tinha, modifiquei conforme necessário, reconstruí-lo, reinstalado e tentei novamente. Mais uma vez, sudo dd if=/dev/null of=/dev/sda bs=512 count=1 foi bem sucedido.

Estou curioso para saber agora se dd não requer CAP_SYS_RAWIO ou se não contar como "raw I / O", para o caso de eu não perder mais nada.


1


origem




Respostas:


man 7 capabilities lista as coisas que CAP_SYS_RAWIO controles, e ler e escrever arquivos de dispositivos de bloco não é um deles. dd faz o seu trabalho usando o normal read e write chamadas do sistema; Ele possui recursos sofisticados para escolher o tamanho dos buffers de entrada e saída e transformar os dados durante a cópia, mas não faz nada de especial para a própria E / S.


1



Na página da web que eu dei dd if=/dev/zero of=/dev/kmem seek=1740644 bs=1 count=1 está implícito para ser acesso a memória bruta. - Melab
Isso é porque /dev/kmem representa a memória bruta, e você precisa CAP_SYS_RAWIO para abrir esse arquivo específico. O uso de dd é irrelevante; qualquer programa tentando escrever (ou ler) /dev/kmem necessidades CAP_SYS_RAWIO. - Wyzard