Безопасный способ удаления файлов в разработке Android
Проанализировав мое приложение Android с помощью инструмента безопасности, оно обнаружило уязвимость высокого уровня "Проверка небезопасного удаления файла". Я исследовал это, и кажется, что проблема в том, что приложение использует "file.delete()".
Эта функция считается небезопасной, поскольку теоретически данные могут быть получены с помощью инструмента, который сканирует все запоминающее устройство. Итак, если этот способ удаления является "небезопасным"... каков "безопасный" способ удаления файлов в Android? (чтобы избежать той "ошибки безопасности", которая предположительно является "высокоуровневой"). Как правильно удалять файлы в Android Development?
Я получаю одно и то же предупреждение о безопасности в 2 разных приложениях, одно из которых написано на нативной Java, а другое на Xamarin Forms. Большое спасибо!
2 ответа
Что такое "безопасный" способ удаления файлов в Android?
Там нет ни одного для подавляющего большинства устройств Android. Ты используешь delete()
на File
,
Эта функция считается небезопасной, потому что данные теоретически могут быть получены с помощью инструмента, который сканирует все устройства хранения
Если устройство Android использует классический жесткий диск (вращающийся магнитный носитель), вы можете перезаписать данные перед их удалением. На любом виде флэш-носителей это будет неэффективно, так как физическое местоположение, в которое записываются данные, может варьироваться в зависимости от каждой операции записи ("выравнивание износа").
Итак, это действительно сводится к вашей цели:
Если вы чувствуете, что пользователю будет нанесен вред, если эти данные будут доступны для чтения, сохраните их в зашифрованном виде с помощью предоставленной пользователем парольной фразы.
Если вы просто пытаетесь избежать этого предупреждения, спросите разработчиков этого "инструмента безопасности", что они ожидают от вас. Или найдите лучший инструмент.
Это не проблема для Android. Это связано с тем, как работают файловые системы, и с физическими носителями данных.
Когда вы удаляете файл, независимо от API, на самом деле удаляется запись в таблице файлов.
Фактические данные на диске или флеш-памяти остаются.
Существует метод безопасного удаления: перед удалением файла перезаписать его содержимое мусором или нулями несколько раз.
Но этот метод работает только для магнитных носителей, таких как жесткие диски. Устройства Android используют NAND flash для хранения.
Поскольку число операций записи, которые может выполнить чип NAND до того, как оно выйдет из строя, намного меньше, чем у магнитной памяти, эти чипы обычно поставляются с механизмом, который распределяет команды записи.
Это означает, что даже если вы попытаетесь записать случайные данные или нули поверх файла, нет гарантии, что фактические данные будут перезаписаны. Записи могут идти в другой сектор, чтобы избежать износа.
Таким образом, с одной стороны, для флэш-памяти достаточно один раз перезаписать файл, но с другой стороны, это невозможно сделать правильно на уровне приложения.
Если вы хотите обезопасить свое приложение, вы должны хранить конфиденциальные данные в зашифрованном виде. Затем, даже если кто-то попытается прочитать исходное хранилище, он не сможет восстановить данные.
Не храните учетные данные пользователя (например, пароли) в обычных файлах на Android. Используйте API учетных записей Android и позвольте ОС управлять безопасностью.
Если вам все еще нужно хранилище файлов, но вы хотите защитить данные, зашифруйте их в памяти и затем запишите в файл.
Как сказано в других ответах, первое, что следует рассмотреть с теоретической точки зрения, это то, есть ли необходимость хранить какую-либо конфиденциальную информацию в файлах для хранения на стороне клиента.
Если это действительно так, шифрование - это реальный способ гарантировать надлежащую безопасность. Файлы будут защищены не только от восстановления после удаления, но и во время их известной жизни на устройстве.
Тем не менее, в случае оценки уязвимости - то есть статического анализа кода - было бы не сразу обнаружить, что вы вызываете удаление [через file.delete()
] зашифрованных файлов. Или, может быть, вы просто вызываете удаление файлов, которым нечего скрывать
В обоих этих случаях найденная уязвимость была бы просто ложным срабатыванием. Что является частью игры, потому что вы можете догадаться, что автоматизированному инструменту довольно сложно понять, действительно ли что-то "заслуживает" защиты или нет
Чтобы избавиться от этой уязвимости, вы можете добавить логику для очистки файлов перед вызовом. file.delete()
, У вас есть образец здесь для этой цели. Это решит проблему обнаружения уязвимостей, которую вы испытываете