2012-04-02 9 views
10

Desidero cancellare i dati sensibili dalla memoria nella mia app iOS. In Windows usavo SecureZeroMemory. Ora, in iOS, io uso pianura vecchio memset, ma io sono un po 'preoccupato il compilatore potrebbe ottimizzarlo: https://buildsecurityin.us-cert.gov/bsi/articles/knowledge/coding/771-BSI.htmlQual è il modo corretto per cancellare i dati sensibili dalla memoria in iOS?

frammento di codice:

NSData *someSensitiveData; 
memset((void *)someSensitiveData.bytes, 0, someSensitiveData.length); 

risposta

3

Parafrasare 771-BSI (link vedi OP):

Un modo per evitare la chiamata memset ottimizzato dal compilatore è di accedere nuovamente buffer dopo la chiamata memset in modo tale da forzare il compilatore non per ottimizzare la posizione. Ciò può essere ottenuto da

*(volatile char*)buffer = *(volatile char*)buffer; 

dopo la chiamata memset().

In realtà, si potrebbe scrivere una funzione

void* secure_memset(void *v, int c, size_t n) { 
    volatile char *p = v; 
    while (n--) *p++ = c; 
    return v; 
} 
secure_memset()

(codice preso da 771-BSI. Grazie a Daniel Trebbien per indicare un possibile difetto della proposta di codice precedente.)

Perché volatile impedisce l'ottimizzazione? Vedere https://stackoverflow.com/a/3604588/220060

UPDATE Si prega di leggere anche Sensitive Data In Memory perché se si dispone di un avversario sul sistema iOS, il tuo sono già più o meno avvitato prima ancora che tenta di leggere che la memoria. In una sintesi SecureZeroMemory() o secure_memset() non sono di grande aiuto.

+0

Ho pensato che forse c'è un equivalente a SecureZeroMemory() in iOS. La tua soluzione sembra buona, ma che ne dite di "La soluzione dovrebbe essere efficace sulla maggior parte delle piattaforme, ma consultare la documentazione della piattaforma per verificare che sia sufficiente fare riferimento a un personaggio in questo modo." – HyBRiD

+0

Penso che questo sia solo con cautela ondeggiando avanti e indietro. È dettato dallo standard che l'accesso alle variabili volatili NON deve essere ottimizzato. In realtà potrebbe essere che l'unico carattere è una porta hardware e un accesso in lettura innesca qualcosa a livello hardware. Con volatile dichiari al compilatore che sai meglio di lui e che non pensa nemmeno di cercare di ottimizzare quell'accesso. E poiché tale accesso dipende dal memset() che lo precede, il memset() non verrà ottimizzato. – nalply

+0

La funzione 'secure_memset' potrebbe non essere sufficiente. Secondo http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1381.pdf ci sono ottimizzatori di compilatori che azzereranno solo il primo byte. –

0

Il problema è NSData è immutabile e tu no avere il controllo su ciò che accade. Se il buffer è controllato dall'utente, è possibile utilizzare dataWithBytesNoCopy: length: e NSData fungerà da wrapper. Al termine, è possibile memorizzare il buffer.