Come rilevare se il file viene modificato mentre il mio programma lo legge?

1

Sto scrivendo uno strumento di auto-aggiornamento che viene eseguito con le autorizzazioni di amministratore. Il suo compito è scaricare e installare file da un archivio tat.

Il problema è risolto al punto in cui posso verificare l'identità del file con la firma ecdsa. Tuttavia non c'è nulla che impedisca la modifica del file dopo che la firma è stata verificata ma prima che venga letta.

Una soluzione è leggere il file in memoria e quindi verificare la firma di quei dati. Tuttavia, i file di aggiornamento possono essere di diverse centinaia di MB e vorrei evitare di consumare così tanta RAM.

Un'altra soluzione a cui posso pensare è di cambiare i permessi (almeno scrivere) per essere accessibile solo da admin. Non sono sicuro se apre comunque un altro vettore di attacco.

Tuttavia, un'altra soluzione è quella di rilevare se il file è stato modificato dopo la verifica della firma ma prima della lettura completa dei dati. Non so se il SO fornisca un metodo affidabile e affidabile per farlo.

Il mio updater funzionerà su Windows e OSX.

Aggiorna

A quanto pare, la modifica del proprietario o dell'autorizzazione file non è di aiuto se l'autore dell'attentatore ha già aperto il file.

UPDATE 2 Vengo con la seguente soluzione:

L'archiviazione:

  1. Per ogni file archiviato viene memorizzata anche la sua firma ecdsa del digest sha256
  2. Insieme all'archivio archivia la sua firma ecdsa del suo digest sha256

Estrazione:

  1. Apri archivio, verifica la sua firma
  2. Senza chiuderlo, inizia l'annullamento dell'archiviazione
  3. Crea una directory temporanea con accesso rwx solo da root / administrator. Vieta a tutti gli altri utenti
  4. Estrai il file in quella directory, verifica la sua firma, installalo nella posizione di destinazione. Ripeti per ogni file
  5. Elimina la directory temporanea
posta Kentzo 14.08.2015 - 01:10
fonte

2 risposte

1

Dato che stai già utilizzando un metodo di verifica della firma sul file stesso, modifica leggermente quel sistema:

  • Firma singoli blocchi del file e archivia le firme in linea. Se la firma richiede 32 byte e si utilizza una dimensione di blocco di 4.096 byte, è possibile avere 4.064 byte di dati + 32 byte di firma in ogni blocco.
  • Firma l'elenco delle firme e memorizza anche quella firma.
  • Per verificare l'intero file, verificare tutte le firme del blocco e la firma finale. Se mantieni le firme nella RAM mentre stai leggendo il tuo file, puoi essere sicuro che non è cambiato dal momento in cui lo hai verificato. Qualsiasi modifica comporterà una firma non valida o valida ma non corrispondente.

In alternativa, se non è possibile memorizzare le firme in linea, utilizzare un file solo a tale scopo. Ad ogni modo, puoi dimostrare che il file non è stato modificato da quando hai verificato il suo contenuto.

    
risposta data 14.08.2015 - 12:47
fonte
0

Non l'ho provato, ma so che ci sono API per la notifica della modifica del file:

risposta data 14.08.2015 - 08:43
fonte

Leggi altre domande sui tag