Necesito esto para una prueba unitaria. Hay una función que hace lstat en la ruta del archivo que se pasa como parámetro. Tengo que activar la ruta del código donde lstat
falla (porque la cobertura del código debe alcanzar el 90%)
La prueba puede ejecutarse solo con un solo usuario, por lo tanto, me preguntaba si hay un archivo en Ubuntu que siempre exista, pero los usuarios normales no tienen acceso de lectura a él ni a su carpeta. (Por lstat
lo tanto , fallaría a menos que se ejecute como root).
Un archivo inexistente no es una solución, porque hay una ruta de código separada para eso, que ya estoy activando.
EDITAR: La falta de acceso de lectura al archivo solo no es suficiente. Con eso lstat
todavía se puede ejecutar. Pude activarlo (en mi máquina local, donde tengo acceso de root), creando una carpeta en / root y un archivo en él. Y establecer el permiso 700 en la carpeta. Así que estoy buscando un archivo que esté en una carpeta a la que solo pueda acceder root.
fuente
/etc/shadow
/proc/1/fd/0
debería hacerlo.Respuestas:
En los sistemas Linux modernos, debería poder usar
/proc/1/fdinfo/0
(información para el descriptor de archivo 1 (stdout) del proceso de id 1 (init
en el espacio de nombres pid raíz que debería ejecutarse comoroot
)).Puede encontrar una lista con (como usuario normal):
(eliminar
-type f
si no desea restringir a archivos normales)./var/cache/ldconfig/aux-cache
es otro candidato potencial si solo necesita considerar los sistemas Ubuntu. Debería funcionar en la mayoría de los sistemas GNU, ya que/var/cache/ldconfig
se crea lectura + escritura + búsqueda en la raíz solo mediante elldconfig
comando que viene con la libc GNU.fuente
/proc/1/fdinfo/0
funciona en Ubuntu 16.04 y 18.04, eso es más que suficiente./proc/1/fdinfo/0
no necesariamente funciona en un contenedor (por ejemplo, un contenedor Docker), y a menudo las pruebas unitarias se ejecutan en dichos contenedores en CI.Mirando la página del comando man lstat (2) puede inspirarse en casos que podrían hacer que falle con errores distintos a ENOENT (el archivo no existe).
La más obvia es:
Por lo tanto, necesita un directorio desde el que no puede buscar.
Sí, puede buscar uno que ya esté en su sistema (¿tal vez
/var/lib/private
si existe?) Pero también podría crear uno usted mismo, con el equivalente de:La operación lstat (2) fallará con EACCES aquí. (Eliminar todos los permisos del directorio garantiza eso. Tal vez ni siquiera necesite tanto y
chmod -x
eliminar permisos de ejecución sería suficiente, ya que se necesitan permisos de ejecución en un directorio para acceder a los archivos que se encuentran debajo).Hay otra forma creativa de hacer que lstat (2) falle, mirando su página de manual:
Por lo tanto, intentar acceder a un archivo como
/etc/passwd/nonexistent
debería desencadenar este error, que de nuevo es diferente de ENOENT ("No existe tal archivo o directorio") y podría satisfacer sus necesidades.Otro es:
Pero es posible que necesite un nombre realmente largo para este (creo que 4.096 bytes es el límite típico, pero su sistema / sistema de archivos podría tener uno más largo).
Finalmente, es difícil saber si alguno de estos será realmente útil para usted. Dices que quieres algo que no active el escenario "el archivo no existe". Aunque normalmente eso significa un error ENOENT, en la práctica muchas verificaciones de nivel superior simplemente interpretarán cualquier error de lstat (2) como "no existe". Por ejemplo,
test -e
o el equivalente[ -e ...]
del shell podría simplemente interpretar todo lo anterior como "no existe", especialmente porque no tiene una buena manera de devolver un mensaje de error diferente y no devolver un error implicaría que el archivo existe, lo cual ciertamente no es el caso.fuente
Puedes
find
hacerlo tú mismo.Uso
/etc
: el directorio de archivos de configuración como punto de partida:En mi sistema, esto no devuelve nada.
Puede ser un grupo menos restrictivo y permitir
root
(solo el usuarioroot
debe ser miembro del gruporoot
), y busque un permiso de440
:En mi sistema esto devuelve:
Editar:
Según su edición, está buscando un directorio que no tenga permiso suficiente para que el usuario que lo invoca impida la inclusión del directorio:
Aquí estoy buscando directorios (
-type d
) que carecen de los bits permanentes de lectura-escritura-ejecución para otros (o-rwx
) y que es propiedad deroot:root
.Técnicamente, solo la ausencia de bit execute (
x
) evitaría una lista de directorio (lstat(2)
) en el directorio.En la salida que encontré
/run/systemd/inaccessible/
en mi sistema basado en init Systemd.En cuanto a los archivos en
/proc
,/sys
,/dev
:Estos sistemas de archivos son FS virtuales, es decir, residen en la memoria, no en el disco
Si planea confiar
/proc
, use,/proc/1/
es decir, confíe en algo bajo PID 1, no cualquier PID posterior para tener confiabilidad / consistencia ya que no se garantiza que existan los PID (procesos) posteriores.fuente
find / -type d -perm 0400 -user root
He encontrado el directorio/proc/20/map_files/
, si me refiero a un nombre de archivo inventado dentro de esa carpeta, como/proc/20/map_files/asdasd
, entonces siempre falla. ¿Esa carpeta siempre existe en Ubuntu?/proc/1/
pueden ser más seguros, ya que init siempre existe. Pero esoproc
no es un sistema de archivos normal, en caso de que importe./proc/1/fdinfo/0
funcione en Ubuntus moderno.-perm o-rwx
es como-perm 0
, para empezar, todos los bits están apagados. Aquí te gustaría! -perm -1
.