¿Cómo detectar si el archivo se está modificando mientras mi programa lo lee?

1

Estoy escribiendo una herramienta de actualización automática que se ejecuta con permisos de administrador. El trabajo es descargar e instalar archivos desde un archivo tat.

El problema se resuelve hasta el punto en el que puedo verificar la identidad del archivo con la firma ecdsa. Sin embargo, no hay nada que impida que el archivo se modifique después de verificar la firma, pero antes de que se lea.

Una solución es leer el archivo en la memoria y luego verificar la firma de esos datos. Sin embargo, los archivos de actualización pueden tener varios cientos de MB y me gustaría evitar comer tanta RAM.

Otra solución que se me ocurre es cambiar los permisos (al menos escribir) para que solo sean accesibles por el administrador. Sin embargo, no estoy seguro de si abre algún otro vector de ataque.

Una solución más es detectar si el archivo se modificó después de verificar la firma pero antes de que los datos se leyeran por completo. No sé si el sistema operativo proporciona un método confiable y confiable para hacer esto.

Mi actualizador funcionará en Windows y OSX.

ACTUALIZAR

Aparentemente, cambiar el permiso del propietario o del archivo no ayudará si el atacante ya abrió el archivo.

ACTUALIZACIÓN 2 Se me ocurre la siguiente solución:

Archivado:

  1. Para cada archivo archivado, también almacene su firma ecdsa del resumen sha256
  2. Junto con la tienda de archivos, la firma ecdsa de su resumen sha256

Extracción:

  1. Abrir archivo, verificar su firma
  2. Sin cerrarlo, comienza a desarchivar
  3. Cree un directorio temporal con acceso rwx solo por root / administrador. Prohibir todos los demás usuarios
  4. Extraiga el archivo en ese directorio, verifique su firma, instálelo en la ubicación de destino. Repita para cada archivo
  5. Eliminar directorio temporal
pregunta Kentzo 14.08.2015 - 01:10
fuente

2 respuestas

1

Como ya está utilizando un método de verificación de firma en el archivo, modifique un poco ese sistema:

  • Firme fragmentos individuales del archivo y almacene las firmas en línea. Si su firma toma 32 bytes, y usa un tamaño de fragmento de 4,096 bytes, puede tener datos de 4,064 bytes + firma de 32 bytes en cada fragmento.
  • Firme la lista de firmas y almacene esa firma también.
  • Para verificar todo el archivo, verifique todas las firmas de fragmentos y la firma final. Si luego mantiene las firmas en la memoria RAM mientras lee su archivo, puede estar seguro de que no ha cambiado desde el momento en que lo verificó. Cualquier cambio resultará en una firma inválida o válida pero no coincidente.

Alternativamente, si no puede almacenar las firmas en línea, use un archivo solo para ese propósito. De cualquier manera, básicamente puedes probar que el archivo no se ha modificado desde que verificaste su contenido.

    
respondido por el Michael Trausch 14.08.2015 - 12:47
fuente
0

No he intentado esto, pero sé que hay API para la notificación de cambio de archivo:

respondido por el StackzOfZtuff 14.08.2015 - 08:43
fuente

Lea otras preguntas en las etiquetas