Secondo 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).
Questo ha funzionato per me. (le righe che iniziano con '#' sono root, quelle con '$' non sono root) in questo caso l'utente non root è nel wheel
gruppo.
# 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': =
Dato ciò che la capacità garantisce, si adatta esattamente a ciò che desideri. Non ho verificato in modo esaustivo se find
ha una caratteristica che ti permette di leggere i byte all'interno dei file, ma cose ovvie come LD_PRELOAD
e gli attacchi shim alla libreria non dovrebbero funzionare a causa della natura dei controlli setuid in Linux, e nemmeno i bit di capacità vengono ereditati dai processi figli (a differenza del setuid grezzo), quindi questo è un altro vantaggio.
Tieni presente che ciò che vuoi fare solleva possibili problemi di privacy per quanto riguarda la creazione o l'accesso di file temporanei e il programma potrebbe essere utilizzato come base per montare una condizione di competizione / tentativo di escalation dei privilegi (contro programmi che creano nomi di file noti ma non eseguire controlli di sicurezza corretti).
Inoltre, alcune applicazioni scritte male possono fare affidamento sui metadati dei file o sulla struttura ad albero come un modo per trasmettere significato o nascondere i dati. Ciò potrebbe causare il rilascio di informazioni riservate o la rivelazione di documenti privilegiati di cui non si è altrimenti a conoscenza (la sicurezza attraverso l'oscurità lo so, ma purtroppo questa è una cosa che i fornitori closed-source in particolare amano fare).
Pertanto, fai attenzione e diffida nel farlo e comprendi che c'è ancora un rischio associato a questo anche se le cose ovvie non funzionano.
Oh, e sarei interessato a vedere se qualcuno ha un attacco proof of concept che utilizza questo meccanismo come base per l'escalation dei privilegi nei commenti!
Che ne dici di localizzare?
locate legge uno o più database preparati da updatedb(8) e scrive i nomi dei file corrispondenti ad almeno uno dei PATTERN sullo standard output, uno per riga. Se --regex non è specificato, i PATTERN possono contenere caratteri glob. Se un qualsiasi PATTERN non contiene caratteri glob,locate si comporta come se il pattern fosse PATTERN .
Per impostazione predefinita, locate non controlla se i file trovati nel database esistono ancora. locate non può mai segnalare i file creati dopo l'aggiornamento più recente del relativo database.
O forse anche slocate:
Secure Locate fornisce un modo sicuro per indicizzare e cercare rapidamente i file sul tuo sistema. Utilizza la codifica incrementale proprio come GNU locate per comprimere il suo database per velocizzare la ricerca, ma memorizzerà anche i permessi e la proprietà dei file in modo che gli utenti non vedano i file a cui non hanno accesso.
Questa pagina di manuale documenta la versione GNU di slocate. slocateConsente agli utenti del sistema di cercare interi filesystem senza visualizzare file non autorizzati.
Darei agli utenti i permessi appropriati.
Per impostazione predefinita, se umask è 022
, le directory vengono create in modo che tutti possano elencare e dichiarare i file in esse contenuti. In caso contrario, puoi modificare manualmente l'autorizzazione della directory in bit a bit o delle sue vecchie autorizzazioni e 0555
:
chmod +0555 foo
E se quegli utenti non hanno il permesso di esecuzione su tutti i genitori di quella directory (per esempio, la home directory di un altro utente), probabilmente significa che dovresti mettere la prima directory da qualche altra parte.
Se vuoi consentire solo ad alcuni utenti di leggere ed eseguire quella directory, puoi cambiarne la modalità in 0750
, inserisci quegli utenti in un gruppo e cambia il proprietario del gruppo della directory in quel gruppo:
groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo