De acordo com man 7 capabilities
CAP_DAC_READ_SEARCH
* Bypass file read permission checks and directory read and execute permission checks;
* Invoke open_by_handle_at(2).
Isso funcionou para mim. (as linhas que começam com '#' são raiz e aquelas com '$' não são raiz). Nesse caso, o usuário não raiz está no wheel
grupo.
# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root
find: ‘/root’: Permission denied
$ sudofind /root
/root /root
/root/Testbed
...
...
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec 4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =
Dado o que a capacidade concede, ela se encaixa exatamente no que você deseja. Eu não verifiquei exaustivamente se find
há um recurso que permite ler bytes dentro de arquivos, mas coisas óbvias como LD_PRELOAD
ataques de calibração de bibliotecas não devem funcionar devido à natureza das verificações de setuid no Linux, e os bits de capacidade não são herdado pelos processos filhos (ao contrário do setuid bruto), então esse é outro bônus.
Lembre-se de que o que você deseja fazer suscita possíveis preocupações com a privacidade em relação à criação ou acesso temporário a arquivos, e o programa pode ser usado como base para montar uma tentativa de escalação de condição / privilégio de corrida (contra programas que criam nomes de arquivos conhecidos mas não faça as verificações de segurança corretas).
Além disso, alguns aplicativos mal escritos podem contar com metadados de arquivo ou estrutura de árvore como uma maneira de transmitir significado ou ocultar dados. Isso pode causar a liberação de informações restritas ou revelar documentos privilegiados desconhecidos (segurança pela obscuridade, eu sei, mas isso é algo que os fornecedores de código fechado, em particular, gostam de fazer, infelizmente).
Portanto, tome cuidado e tenha cuidado ao fazê-lo e entenda que ainda há riscos associados a isso, mesmo que as coisas óbvias não funcionem.
Ah, e eu ficaria interessado em ver se alguém tem uma prova de ataque de conceito que usa esse mecanismo como base para a escalada de privilégios nos comentários!