En Linux, ¿el programa de línea de comandos mktemp es menos seguro que la función C mkstemp?

StackOverflow https://stackoverflow.com/questions/499450

  •  20-08-2019
  •  | 
  •  

Pregunta

Ambas operaciones crean un archivo vacío y devuelven el nombre del archivo, pero mkstemp deja el archivo abierto en modo exclusivo y le da el identificador. ¿Hay algún beneficio de seguridad para la función C? ¿Esto implica que hay un agujero de seguridad en la versión de línea de comandos?

Como comentario aparte, es interesante que haya varias funciones relacionadas en la API de C en Linux y la mayoría de ellas dicen " ¡No utilices esta función " (o similar) en su página de manual.

¿Fue útil?

Solución

Como puede ver fácilmente desde mktemp(1) código fuente, esencialmente no hace nada más que llamar a mkstemp(3).

El modo exclusivo en Linux significa que la función fallará si el archivo ya existe, no garantiza el bloqueo. Otro proceso puede eliminar este archivo, volver a crearlo y llenarlo con datos, a pesar de que el proceso del archivo sea open(3) por su proceso.

No hay seguridad adicional en la función C en comparación con la utilidad de línea de comandos.

Otros consejos

Un truco con archivos temporales en sistemas operativos tipo Unix (incluidos Linux y Mac OS) es tan pronto como abra el archivo, elimínelo. Todavía puede acceder al archivo, pero nadie más puede verlo o hacerle nada, y desaparecerá tan pronto como cierre el archivo, incluso si su programa muere de una muerte horrible.

La diferencia más obvia entre una llamada al sistema y una función de línea de comando es que las personas o sus scripts de shell utilizan las funciones de la línea de comando, mientras que las llamadas al sistema siempre las realizan los programas.

Sería bastante difícil darle a una persona un identificador de archivo.

Con respecto a " safety " ;, debe pensar en las condiciones de carrera: varias instancias de un programa llaman a mkstemp al mismo tiempo, pero se garantiza que cada una tiene un archivo temporal único. Si el programa se desvaneció y llamó a la versión de línea de comandos, sería casi imposible garantizarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top