Как правильно удалить конфиденциальные данные из памяти в iOS? - PullRequest
11 голосов
/ 02 апреля 2012

Я хочу удалить конфиденциальные данные из памяти в моем приложении для iOS. В Windows я использовал SecureZeroMemory. Сейчас в iOS я использую старый старый memset, но я немного обеспокоен, что компилятор может его оптимизировать: https://buildsecurityin.us -cert.gov / BSI / статьи / знания / кодирование / 771-BSI.html

фрагмент кода:

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

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Перефразируя 771-BSI (ссылка см. В ОП):

Чтобы избежать оптимизации вызова memset компилятором, необходимо снова получить доступ к буферу после вызова memset таким способом, который заставит компиляторне оптимизировать местоположение.Это может быть достигнуто с помощью

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

после вызова memset().

Фактически, вы можете написать secure_memset() функцию

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

(Код принятот 771-BSI. Спасибо Даниэлю Треббиену за указание на возможный дефект предыдущего предложения кода.)

Почему volatile препятствует оптимизации?См. https://stackoverflow.com/a/3604588/220060

ОБНОВЛЕНИЕ Пожалуйста, прочитайте также Конфиденциальные данные в памяти , потому что если у вас есть злоумышленник в вашей системе iOS, вы уже более или менее облажались даже раньшеон пытается прочитать эту память.В итоге SecureZeroMemory () или secure_memset () не очень помогают.

0 голосов
/ 02 апреля 2012

Проблема в том, что NSData неизменна, и вы не можете контролировать происходящее.Если вы управляете буфером, вы можете использовать dataWithBytesNoCopy: length: и NSData будет действовать как оболочка.Когда закончите, вы можете установить свой буфер в память.

...