Безопасный способ удаления файлов в Android-разработке

Проанализировав мое приложение для Android с помощью инструмента безопасности, он обнаружил уязвимость высокого уровня «Проверка небезопасного удаления файла». Я исследовал это, и кажется, что проблема в том, что приложение использует «file.delete ()».

Эта функция считается небезопасной, поскольку теоретически данные можно получить с помощью инструмента, сканирующего все запоминающее устройство. Итак, если этот способ удаления «небезопасен»… каков «безопасный» способ удаления файлов в Android? (чтобы избежать этой «ошибки безопасности», которая предположительно является «высокоуровневой»). Как правильно удалить файлы в Android Development?

Я получаю одно и то же предупреждение о безопасности в двух разных приложениях, одно из которых создано с помощью родной Java, а другое — с Xamarin Forms. Большое спасибо!


person androto    schedule 10.11.2018    source источник


Ответы (3)


каков «безопасный» способ удаления файлов в Android?

Для подавляющего большинства устройств Android его нет. Вы используете delete() на File.

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

Если в устройстве Android используется классический жесткий диск (вращающийся магнитный носитель), вы можете перезаписать данные перед их удалением. На любом флэш-носителе это будет неэффективно, поскольку физическое место, куда записываются данные, может меняться в зависимости от каждой операции записи («выравнивание износа»).

Итак, это действительно сводится к вашей цели:

  • Если вы считаете, что пользователю будет причинен вред, если эти данные будут доступны для чтения, сохраните их в зашифрованном виде с помощью введенной пользователем парольной фразы.

  • Если вы просто пытаетесь избежать этого предупреждения, спросите разработчиков этого «инструмента безопасности», чего они от вас ожидают. Или найти лучший инструмент.

person CommonsWare    schedule 10.11.2018

Это не специфичная для Android проблема. Это связано с тем, как работают файловые системы и сами физические носители данных.

Когда вы удаляете файл, независимо от API, фактически удаляется запись в таблице файлов.

Фактические данные на диске или флэш-накопителе остаются.

Есть способ безопасного удаления: Перед удалением файла несколько раз перезапишите его содержимое мусором или нулями.

Но этот метод работает только для магнитных носителей, таких как жесткие диски. Устройства Android используют флэш-память NAND для хранения.

Поскольку количество операций записи, которое может выполнить чип NAND, прежде чем он выйдет из строя, намного меньше, чем у магнитной памяти, эти чипы обычно поставляются с механизмом, который распределяет команды записи.

Это означает, что даже если вы попытаетесь записать случайные данные или нули в свой файл, нет гарантии, что фактические данные будут перезаписаны. Записи могут идти в другой сектор, чтобы избежать износа.

Итак, с одной стороны, для флешки достаточно один раз перезаписать файл, а с другой стороны, на уровне приложения это сделать корректно невозможно.

Если вы хотите сделать свое приложение безопасным, вы должны хранить конфиденциальные данные в зашифрованном виде. Тогда, даже если кто-то попытается прочитать необработанное хранилище, он не сможет восстановить данные.

Не храните учетные данные пользователя (например, пароли) в обычных файлах на Android. Используйте Android API аккаунтов и позвольте ОС управлять безопасностью.

Если вам все еще нужно хранилище файлов, но вы хотите защитить данные, зашифруйте их в памяти, а затем запишите в файл.

person Lev M.    schedule 10.11.2018
comment
Более того, нет никакой гарантии, что фактические данные будут перезаписаны, данные не будут перезаписаны. Это связано с тем, что на самом деле при записи происходит стирание всего блока NAND (около 128 КБ), а затем его заполнение новыми данными и окружающими данными из старого блока. Затем выполняется сравнение для проверки записи. прошла успешно, и старый блок будет возвращен в книгу свободных блоков без стирания. Причина отказа от стирания заключается в том, что стирание потребляет много энергии. - person zaph; 11.11.2018
comment
продолжение: Есть несколько контроллеров флэш-памяти NAND, которые гарантируют стирание старого блока. Например, у Apple есть часть флэш-памяти, которая используется для обеспечения безопасности, например, для хранения ключей. - person zaph; 11.11.2018

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

Если это действительно так, шифрование — это реальный способ гарантировать надлежащую безопасность. Файлы будут защищены не только от восстановления после удаления, но и в течение их известного срока службы на устройстве.

Тем не менее, в случае оценки уязвимости, т. е. статического анализа кода, не сразу можно будет обнаружить, что вы требуете удаления [через file.delete()] зашифрованных файлов. Или, может быть, вы просто вызываете удаление файлов, которым нечего скрывать

В обоих этих случаях обнаруженная уязвимость будет просто ложным срабатыванием. Это часть игры, потому что вы можете догадаться, что автоматизированному инструменту довольно сложно понять, действительно ли что-то «заслуживает» защиты или нет.

Что вы можете сделать, чтобы избавиться от уязвимости, так это добавить логику для очистки файлов перед вызовом file.delete(). У вас есть образец здесь для этой цели. Это устранит обнаружение уязвимости, с которой вы столкнулись.

person Quixxi    schedule 24.06.2019
comment
Quixxi добавил логику для очистки файла с пустым текстом, но это не решает задачу, я все еще получаю ту же уязвимость - person livemaker; 29.06.2020