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. (linhas que começam com '#' são raiz, aquelas com '$' são não-raiz) neste caso o usuário não-root está no grupo wheel
.
# 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
tem um recurso que permite que você leia bytes dentro de arquivos, mas coisas óbvias como LD_PRELOAD
e ataques shim da biblioteca não devem funcionar devido à natureza das verificações setuid no Linux, e os bits de capacidade não são herdados pelos processos filhos (ao contrário do setuid bruto), e isso é outro bônus.
Tenha em mente que o que você quer fazer aumenta as possíveis preocupações com privacidade em relação à criação ou acesso a arquivos temporários, e o programa poderia ser usado como base para montar uma tentativa de escalonamento de condição de corrida / privilégio (contra programas que criam bem nomes de arquivos conhecidos, mas não fazem verificações de segurança corretas).
Além disso, alguns aplicativos mal escritos podem depender de metadados de arquivos ou estrutura de árvore para transmitir significado ou ocultar dados. Isso pode causar a liberação de informações restritas ou revelar documentos privilegiados que não são conhecidos (segurança pela obscuridade que eu conheço, mas isso é algo que os fornecedores de código fechado, em particular, gostam de fazer, infelizmente).
Portanto, tome cuidado e seja cauteloso ao fazê-lo e entenda que ainda há risco associado a isso, mesmo que as coisas óbvias não funcionem.
Ah, e eu estaria interessado em ver se alguém tem um ataque de prova de conceito que usa esse mecanismo como base para o escalonamento de privilégios nos comentários!