Evita la manipolazione dei dati da parte dell'utente

1

Ho un programma C # (potrebbe essere qualsiasi linguaggio di programmazione) che salva i dati in un file su una memoria (disco rigido, unità USB, ecc.). Il programma utilizza questi dati per monitorare il tempo di funzionamento, ma potrebbe essere qualsiasi scopo.
All'avvio del programma, legge i dati dal file in modo da sapere per quanto tempo ha funzionato prima. Aggiorna i dati nel file ogni minuto, quindi c'è un errore di massimo 1 minuto se il programma non viene spento correttamente.

Il mio problema è una domanda abbastanza generale: Come posso impedire all'utente di manipolare il file?

Voglio evitare che qualcuno modifichi il tempo dell'operazione mentre il programma non è in esecuzione, o almeno voglio essere in grado di rilevare la manipolazione.

  • Per prima cosa ho un checksum, ma ho anche bisogno di impedirlo dalla manipolazione.
  • L'utente può sostituire i file correnti con i backup ogni volta, quindi i file stessi non vengono salvati se sa dove cercare.
  • Pertanto, ho bisogno di memorizzare i dati in un luogo che non è facilmente modificabile. Su un sistema Windows, questo potrebbe essere il registro. In alternativa, potrei creare un file di sistema nascosto in una directory speciale. Tuttavia, penso che l'unica possibilità sia quella di nascondere il file o qualsiasi informazione sui dati dell'utente.
  • L'utente potrebbe sostituire l'intero sistema operativo, inclusi tutti i dati di un'immagine. Pertanto anche una posizione nascosta non è sicura, ma a) Non posso evitare questo rischio, e b) l'utente avrebbe bisogno di attrezzature e conoscenze speciali, quindi il sistema è sicuro per la maggior parte degli utenti.

Qualche altra idea su come proteggere i dati su un computer tipico?

    
posta Tobias Knauss 01.08.2015 - 00:17
fonte

2 risposte

1

Suggerirei la seguente implementazione.

Se il programma viene inizialmente avviato, creare un file crittografato e autenticato contenente un timestamp o un contatore per avere un valore iniziale. È importante non utilizzare l'utente di base visualizzato e l'ora / ora modificabile, altrimenti il cliente potrebbe semplicemente impostare l'ora del sistema nel passato. Quando esegui il programma, avvia un timer o incrementa il contatore per misurare l'utilizzo e aggiorna periodicamente il file autenticato crittografato.

Il luogo in cui è archiviato il file non è importante, ma per ottenere una sicurezza ragionevole è necessario utilizzare quanto segue:

  • Utilizza le funzioni di crittografia esistenti, che sono ben testate e forniscono sia la crittografia che l'autenticazione. Per dirla in modo semplice, la crittografia ti protegge da qualcuno che cerca di capire il contenuto, l'autenticazione dalla manipolazione

  • Genera una chiave casuale per la crittografia, senza hard coding. Tutto ciò che è hard coded può essere trovato attraverso il reverse engineering con più o meno sforzo. Anche riutilizzare le chiavi è sempre una cattiva idea

  • Memorizza la chiave in un posto dove non è possibile accedere automaticamente al tuo programma. Questa è la parte difficile, in quanto devi fidarti del sistema operativo per gestirlo correttamente, poiché le cose devono funzionare senza che tu inserisca manualmente le cose. Il mio suggerimento sarebbe utilizzare DPAPI (supponendo che si sviluppi per C # .NET su Windows). Puoi facilmente memorizzare la tua chiave, e potrebbe anche cambiare la tua chiave di tanto in tanto senza grossi problemi.

Quindi, se l'utente cancella, scambia il file con una versione precedente o manipola il file, sei in grado di riconoscerlo.

Spero che questo dia alcune idee su come potresti farlo.

Modifica

Non ero corretto per quanto riguarda l'attacco di replay, se l'utente è in grado di accedere a entrambi i file, in effetti sarebbe in grado di sostituire entrambi con vecchie versioni.

Il mio suggerimento riguardante il tuo commento sarebbe il seguente :
Avere un file che contiene un timestamp, il contatore per l'utilizzo, il flag di spegnimento.

Avrai bisogno di un servizio Windows in esecuzione all'avvio. Imposta una voce di registro al primo avvio.

Il servizio verifica se il file è esistente e se è la prima volta che viene eseguito il servizio. Se c'è una voce di registro che viene eseguita per la prima volta, creare il file contenente il timestamp corrente (non dipendente dall'orologio di sistema, se possibile), il contatore per l'uso dovrebbe essere zero e il flag di arresto falso. Il file è crittografato e la chiave crittografata tramite DPAPI (utilizza un'entità aggiuntiva fissa). La voce di registro viene aggiornata come d'ora in poi, tutte le scritture consecutive saranno aggiornamenti.

Ora il servizio deve aggiornare il file in un intervallo fisso, ad es. ogni 10 minuti. Ciò significa non proteggere la chiave con DPAPI e decifrare il file. Qui è dove proteggiamo contro gli attacchi di replay. Il timestamp nel file è controllato e potrebbe non deviare più di ad es. 30 minuti (dovrebbe essere superiore all'intervallo di aggiornamento in caso di aggiornamento non riuscito). Se devia di più, si sospetta una manipolazione (o un grave errore dall'applicazione o dall'hardware o dal sistema operativo). Altrimenti, se tutto è a posto, il timestamp viene aggiornato all'ora corrente. Se il tuo servizio / programma è stato utilizzato nel frattempo, anche il contatore di utilizzo viene aggiornato. Genera una nuova chiave, cripta il file e memorizza la chiave dopo averla protetta con DPAPI.

Quando l'utente arresta il computer e lo avvia in un secondo momento, si avrebbe il problema, che il timestamp supera il limite consentito. Questo è il motivo per cui il file dovrebbe contenere il flag di spegnimento. Questo flag deve essere impostato quando l'utente arresta i computer. Quando il servizio viene interrotto, l'azione finale è aggiornare il file, con il flag di spegnimento impostato su true. All'avvio il file viene letto e se il flag di spegnimento è true, impostalo su false e aggiorna nuovamente il timestamp.

Ecco come lo farei. Non è a prova di proiettile ma è più che sufficiente per proteggere dai clienti fraudolenti. Non andrei nemmeno così lontano e semplicemente utilizzo la combinazione DPAPI e file e memorizzerò l'output di DPAPI nel registro . Nessuna persona normale è la sua mente giusta passerebbe il suo tempo a cercare l'intero registro. Dopo tutto, sono i tuoi clienti non prigionieri. Con l'accesso fisico al computer non c'è modo di proteggerlo assolutamente.

Anche l'archivio isolato non è molto utile, ne ho appena letto la prima volta. L'utente e anche altri programmi con privilegi di amministratore / sistema saranno in grado di leggere questi file.

    
risposta data 01.08.2015 - 13:33
fonte
0

"dati protetti su un computer tipico". Dai tuoi commenti è chiaro che le tue vittime non usano "computer tipici" ma sono schiavi di un dipartimento IT irrazionale di cui fai parte.

L'unico modo per fare ciò che vuoi è non memorizzare i dati sul computer, ma memorizzarli su un altro computer da qualche parte sulla rete a cui gli utenti non hanno accesso. Ovviamente ciò richiede che tutti i loro computer siano collegati in rete a una LAN, ma lo avrete comunque, come senza dubbio avete scoperto che gli amministratori di rete possono avviare, spegnere e riavviare i computer in remoto e caricare e rimuovere forzatamente il software su di loro e regolarmente tormentano le vostre vittime con questo solo per infastidirli e per motivi legittimi (sì, ho lavorato in aziende con tali dipartimenti IT più di quanto mi interessi ricordare, l'ho sperimentato da entrambe le parti, anche se io non sono mai stato uno di quegli amministratori che ho lavorato negli stessi reparti di cui facevano parte).

    
risposta data 01.08.2015 - 08:29
fonte

Leggi altre domande sui tag