Potrzebuję tego do testu jednostkowego. Istnieje funkcja, która wykonuje lstat na ścieżce pliku przekazanej jako parametr. Muszę wyzwolić ścieżkę kodu w przypadku lstat
niepowodzenia (ponieważ pokrycie kodu musi osiągnąć 90%)
Test można uruchomić tylko dla jednego użytkownika, dlatego zastanawiałem się, czy w Ubuntu istnieje plik, który zawsze istnieje, ale normalni użytkownicy nie mają dostępu do odczytu ani do niego. (Więc lstat
nie powiedzie się, chyba że zostanie wykonany jako root.)
Nieistniejący plik nie jest rozwiązaniem, ponieważ istnieje osobna ścieżka do niego, którą już uruchamiam.
EDYCJA: Brak dostępu tylko do odczytu do pliku nie wystarczy. Dzięki temu lstat
nadal można wykonać. Udało mi się go uruchomić (na moim komputerze lokalnym, na którym mam dostęp do konta root), tworząc folder w katalogu / root i plik w nim. I ustawienie uprawnień 700 na folder. Więc szukam pliku, który znajduje się w folderze, który jest dostępny tylko przez root.
źródło
/etc/shadow
/proc/1/fd/0
powinno zrobić.Odpowiedzi:
W nowoczesnych systemach Linux powinieneś być w stanie korzystać
/proc/1/fdinfo/0
(informacje o deskryptorze pliku 1 (stdout) procesu o id 1 (init
w głównej przestrzeni nazw pid, która powinna działać jakoroot
)).Możesz znaleźć listę z (jako zwykły użytkownik):
(usuń,
-type f
jeśli nie chcesz ograniczać się do zwykłych plików)./var/cache/ldconfig/aux-cache
jest kolejnym potencjalnym kandydatem, jeśli potrzebujesz tylko rozważyć systemy Ubuntu. Powinien działać na większości systemów GNU, ponieważ/var/cache/ldconfig
jest tworzony odczyt + zapis + przeszukiwalny do rootowania tylko za pomocąldconfig
polecenia dostarczonego z GNU libc.źródło
/proc/1/fdinfo/0
działa na Ubuntu 16.04 i 18.04, to więcej niż wystarcza./proc/1/fdinfo/0
niekoniecznie działa w kontenerze (np. Kontenerze Docker) i często testy jednostkowe są przeprowadzane w takich kontenerach w CI.Patrząc na stronę podręcznika lstat (2) , możesz czerpać inspirację w przypadkach, które mogą sprawić, że zawiedzie z błędami innymi niż ENOENT (plik nie istnieje).
Najbardziej oczywistym z nich jest:
Potrzebujesz katalogu, z którego nie możesz wyszukiwać.
Tak, możesz poszukać takiego, który jest już w twoim systemie (być może,
/var/lib/private
jeśli istnieje?) Ale równie dobrze możesz sam go stworzyć, z odpowiednikiem:Operacja lstat (2) zakończy się tutaj niepowodzeniem z EACCES. (Usunięcie wszystkich uprawnień z katalogu to zapewnia. Może nawet nie potrzebujesz tak dużo i
chmod -x
usunięcie uprawnień do wykonania byłoby wystarczające, ponieważ uprawnienia dostępu do katalogu są potrzebne, aby uzyskać dostęp do plików w nim zawartych).Istnieje inny twórczy sposób, aby spowodować niepowodzenie lstat (2), patrząc na jego stronę podręcznika:
Próbuję uzyskać dostęp do pliku takiego jak
/etc/passwd/nonexistent
powinien wywołać ten błąd, który różni się od ENOENT („Brak takiego pliku lub katalogu”) i może odpowiadać Twoim potrzebom.Kolejny to:
Ale możesz potrzebować naprawdę długiej nazwy dla tego (uważam, że 4096 bajtów jest typowym limitem, ale twój system / system plików może mieć dłuższy).
Wreszcie, to trudno powiedzieć, czy któryś z nich będzie rzeczywiście przydatne dla Ciebie. Mówisz, że chcesz czegoś, co nie uruchamia scenariusza „plik nie istnieje”. Chociaż zazwyczaj oznacza to błąd ENOENT, w praktyce wiele kontroli wyższego poziomu po prostu interpretuje wszelkie błędy z lstat (2) jako „nieistniejące”. Na przykład
test -e
lub odpowiednik[ -e ...]
powłoki może po prostu zinterpretować wszystkie powyższe jako „nie istnieje”, zwłaszcza że nie ma dobrego sposobu na zwrócenie innego komunikatu o błędzie, a brak zwrócenia błędu oznaczałby, że plik istnieje, co z pewnością nie jest prawdą.źródło
Możesz
find
zrobić sam.Korzystanie
/etc
- katalog plików konfiguracyjnych jako punkt wyjścia:W moim systemie nic to nie zwraca.
Możesz być mniej restrykcyjny i zezwalać na grupę
root
(tylko użytkownikroot
powinien być członkiem grupyroot
) i zwracać uwagę na pozwolenie440
:W moim systemie zwraca to:
Edytować:
Na podstawie dokonanej edycji szukasz katalogu, który nie ma wystarczających uprawnień dla wywołującego użytkownika, aby zapobiec wyświetleniu katalogu:
tutaj szukam katalogów (
-type d
), które nie mają bitów perm read-write-execute dla innych (o-rwx
) i są własnościąroot:root
.Technicznie, tylko brak
x
bitu execute ( ) uniemożliwiłby listowanie katalogów (lstat(2)
) w katalogu.W danych wyjściowych znalazłem
/run/systemd/inaccessible/
w moim systemie opartym na inicjowaniu Systemd.Jeśli chodzi o pliki
/proc
,/sys
,/dev
:Te systemy plików to wirtualny FS, tzn. Rezydują w pamięci, a nie na dysku
Jeśli planujesz polegać
/proc
, użyj/proc/1/
np. Polegaj na czymś w ramach PID 1, a nie późniejszych PID, aby mieć niezawodność / spójność, ponieważ późniejsze PID (procesy) nie są gwarantowane.źródło
find / -type d -perm 0400 -user root
znalezieniu katalogu/proc/20/map_files/
, jeśli odwołuję się do gotowej nazwy pliku w tym folderze, na przykład/proc/20/map_files/asdasd
, to zawsze kończy się niepowodzeniem. Czy ten folder zawsze istnieje w systemie Ubuntu?/proc/1/
mogą być bezpieczniejsze, ponieważ init zawsze istnieje. Ale toproc
nie jest zwykły system plików, na wypadek, gdyby to miało znaczenie./proc/1/fdinfo/0
działa na nowoczesnym Ubuntusie.-perm o-rwx
jest jak-perm 0
, bity są na początek. Tutaj byś chciał! -perm -1
.