Ich brauche das für einen Unit-Test. Es gibt eine Funktion, die lstat auf dem Dateipfad ausführt, der als Parameter übergeben wird. Ich muss den Codepfad auslösen, in dem das lstat
fehlschlägt (weil die Codeabdeckung 90% erreichen muss)
Der Test kann nur unter einem einzelnen Benutzer ausgeführt werden. Daher habe ich mich gefragt, ob es in Ubuntu eine Datei gibt, die immer existiert, aber normale Benutzer haben keinen Lesezugriff darauf oder auf den Ordner. (Also lstat
würde es fehlschlagen, wenn es nicht als root ausgeführt wird.)
Eine nicht existierende Datei ist keine Lösung, da es dafür einen eigenen Codepfad gibt, den ich bereits auslöse.
BEARBEITEN: Der fehlende Lesezugriff auf die Datei allein reicht nicht aus. Damit lstat
kann noch ausgeführt werden. Ich konnte es auslösen (auf meinem lokalen Computer, auf dem ich Root-Zugriff habe), indem ich einen Ordner in / root und eine Datei darin erstellte. Und Festlegen der Berechtigung 700 für den Ordner. Ich suche also nach einer Datei in einem Ordner, auf den nur root zugreifen kann.
quelle
/etc/shadow
/proc/1/fd/0
sollte dies getan werden.Antworten:
Auf modernen Linux-Systemen sollten Sie in der Lage sein
/proc/1/fdinfo/0
(Informationen für den Dateideskriptor 1 (stdout) des Prozesses von ID 1 (init
im Root-PID-Namespace, der als ausgeführt werden soll)root
)).Sie finden eine Liste mit (als normaler Benutzer):
(Entfernen
-type f
Sie diese Option, wenn Sie nicht auf normale Dateien beschränken möchten.)/var/cache/ldconfig/aux-cache
ist ein weiterer potenzieller Kandidat, wenn Sie nur Ubuntu-Systeme in Betracht ziehen müssen. Es sollte auf den meisten GNU-Systemen funktionieren, da/var/cache/ldconfig
es mit demldconfig
Befehl read + write + searchable to root erstellt wurde, der mit der GNU libc geliefert wird.quelle
/proc/1/fdinfo/0
auf Ubuntu 16.04 und 18.04 läuft, ist das mehr als genug./proc/1/fdinfo/0
funktioniert nicht unbedingt in einem Container (z. B. einem Docker-Container), und in CI werden häufig Komponententests in solchen Containern ausgeführt.In der Manpage von lstat (2) finden Sie Anregungen zu Fällen, in denen es zu Fehlern kommen kann, die nicht ENOENT entsprechen (Datei existiert nicht).
Das offensichtlichste ist:
Sie benötigen also ein Verzeichnis, in dem Sie nicht suchen können.
Ja, Sie können nach einem suchen, der bereits in Ihrem System vorhanden ist (möglicherweise,
/var/lib/private
wenn es vorhanden ist?). Sie können jedoch auch selbst einen erstellen, mit dem Äquivalent von:Die lstat (2) -Operation schlägt hier mit EACCES fehl. (Das Entfernen aller Berechtigungen aus dem Verzeichnis stellt dies sicher. Möglicherweise benötigen Sie nicht einmal so viel und das
chmod -x
Entfernen der Ausführungsberechtigungen würde ausreichen, da Ausführungsberechtigungen für ein Verzeichnis erforderlich sind, um auf Dateien darunter zuzugreifen.)Es gibt eine andere kreative Möglichkeit, lstat (2) zum Scheitern zu bringen, indem Sie die Manpage lesen:
Der Versuch, auf eine Datei wie
/etc/passwd/nonexistent
diese zuzugreifen, sollte diesen Fehler auslösen, der sich wiederum von ENOENT ("Keine solche Datei oder Verzeichnis") unterscheidet und möglicherweise Ihren Anforderungen entspricht.Ein anderer ist:
Möglicherweise benötigen Sie einen wirklich langen Namen für diesen Namen. (Ich glaube, 4.096 Byte sind das typische Limit, aber Ihr System / Dateisystem hat möglicherweise einen längeren.)
Letztendlich ist es schwer zu sagen, ob eines davon tatsächlich für Sie nützlich sein wird. Sie möchten etwas, das das Szenario "Datei existiert nicht" nicht auslöst. Während dies normalerweise einen ENOENT-Fehler bedeutet, interpretieren in der Praxis viele Überprüfungen höherer Ebenen Fehler aus lstat (2) einfach als "nicht vorhanden". Zum Beispiel
test -e
oder das Äquivalent[ -e ...]
aus der Shell könnte einfach alles oben Genannte als "nicht vorhanden" interpretieren, zumal es keine gute Möglichkeit gibt, eine andere Fehlermeldung zurückzugeben, und wenn kein Fehler zurückgegeben wird, bedeutet dies, dass die Datei vorhanden ist. Das ist mit Sicherheit nicht der Fall.quelle
Du kannst
find
es selbst.Verwenden Sie
/etc
- das Verzeichnis der Konfigurationsdateien als Ausgangspunkt:Auf meinem System gibt dies nichts zurück.
Sie können eine weniger restriktive und zulässige Gruppe sein
root
(nur Benutzerroot
sollten Mitglied der Gruppe seinroot
) und auf die Erlaubnis von achten440
:Auf meinem System gibt dies Folgendes zurück:
Bearbeiten:
Basierend auf Ihrer Bearbeitung suchen Sie nach einem Verzeichnis, das für den aufrufenden Benutzer nicht über die erforderlichen Berechtigungen verfügt, um die Auflistung von Verzeichnissen zu verhindern:
Hier suche ich nach Verzeichnissen (
-type d
), denen die Perm-Bits zum Lesen, Schreiben und Ausführen für andere (o-rwx
) fehlen und die Eigentum von sindroot:root
.Technisch gesehen würde nur das Fehlen des execute (
x
) -Bits eine Verzeichnisauflistung (lstat(2)
) im Verzeichnis verhindern.In der Ausgabe habe ich
/run/systemd/inaccessible/
auf meinem Systemd Init-basierten System gefunden.In Bezug auf Dateien in
/proc
,/sys
,/dev
:Diese Dateisysteme sind virtuelle Dateisysteme, dh sie befinden sich im Arbeitsspeicher und nicht auf der Festplatte
Wenn Sie sich darauf verlassen möchten
/proc
, verwenden Sie,/proc/1/
dh verlassen Sie sich auf etwas unter PID 1, und verwenden Sie keine späteren PIDs, um Zuverlässigkeit / Konsistenz zu gewährleisten, da die späteren PIDs (Prozesse) nicht garantiert existieren.quelle
find / -type d -perm 0400 -user root
mir das Verzeichnis gefunden habe/proc/20/map_files/
, wenn ich in diesem Ordner zu einem konfektionierten Dateinamen beziehen, wie/proc/20/map_files/asdasd
, dann scheitert es immer. Existiert dieser Ordner immer auf Ubuntu?/proc/1/
könnten sicherer sein, da init immer existiert. Aber dasproc
ist kein reguläres Dateisystem, falls es darauf ankommt./proc/1/fdinfo/0
auf dem modernen Ubuntus funktioniert.-perm o-rwx
ist wie-perm 0
, Bits sind alle aus, um mit zu beginnen. Hier würdest du wollen! -perm -1
.