Капаясь в своем android телефоне я заметил, что в каталоге /mnt/sdcard есть директории и файлы — приложений, которые я давно удалил, поэтому я спросил на toster.ru Может ли одно приложение на Android читать временные файлы другого приложения?
Что же это за временные файлы и почему на них следует обратить внимание? Это ваши фотографии, записи телефонных разговоров, базы данных ваших ежедневников.
Смотрите, как это можно сделать (пример кода в конце статьи)
В андроид есть общая директория /mnt/sdcard. Туда пишут временные файлы все приложения, а когда приложение удаляешь, данные от него там остаются, если разработчик не позаботился о том чтобы их удалить.
Поэтому эти вопросы я задал на toster.ru:
1) By design система не удаляет эти временные файлы из этой директории?
2) Android не знает какие файлы какому приложению принадлежат?
3) Может ли одно приложение прочесть данные другого приложения из этой директории, тогда это дыра в безопасности?
Пользователь NeiroNx написал:
/data достаточно четко разделен по правам — не обладая root правами приложения не видят даже какие файлы там есть.
Я отвечаю NeiroNx: Погодите, вот я только что скачал файловый менеджер из google.play и читаю временные файлы из директории популярного мессенджера, а там фотографии, которые мне прислали лежат в незашифрованном виде, устройство у меня не рутованое.
Пользователь dobergroup написал:
По какому пути находятся эти файлы? Если они в произвольной директории на разделе, который в fat32, то к ним нельзя применить разделяемый доступ. Поэтому, надо уточнять, что именно Вы понимаете под «временными файлами»
Я отвечаю dobergroup: По пути /mnt/sdcard, не следует путать с /mnt/extSdCard, здесь «временные файлы» всех установленных приложений на моем устройстве: мессенджеров, sip телефонии с незашифрованными записями телефонных разговоров, браузеров с историей просмота страниц, плееров с их плейлистами, соц сетей, ежедневников, с личными записями неотложных дел.
Под временными файлами я понимаю одно, а разработчики приложений видимо другое, если разработчики мессенджера с многомиллионной аудиторией там хранят незашифрованные фотографии и зашифрованную переписку.
Этот мессенджер хранит фотографии которые Вам прислали в директории, к которой имеют доступ все приложения Вашего устройства, если у них есть разрешение на работу с хранилищем:
* фотографии из бесплатного фотохостинга под лицензией Creative Commons CC0. 1, 2, 3, 4.
А вот популярный клиент sip хранит там же настройки Вашего sip аккаунта:
Временные файлы может прочесть любое другое приложение?
То есть кто-то может разместить в google.play игру «2048 — играй по сети с друзьями» и таскать фотографии полуобнаженных девушек с вашего телефона?
Я решил это проверить и написал небольшую программу на java для android. Она отсылает структуру каталога /mnt/sdcard на email.
package android.com.testapp;
import android.content.Intent;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.File;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
Button emailButton;
EditText email;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
email = (EditText) findViewById(R.id.email);
emailButton = (Button) findViewById(R.id.emailButton);
emailButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getFileStrucure();
}
});
}
protected void getFileStrucure(){
Filewalker fw = new Filewalker();
fw.walk(new File(Environment.getExternalStorageDirectory().getAbsolutePath()));
}
private class Filewalker {
private int count = 0;
private String sked = "";
public void walk(File root) {
count++;
File[] list = root.listFiles();
for (File f : list) {
if (f.isDirectory()) {
sked += "time: " + new Date(f.lastModified()) + ", dir: " + f.getAbsoluteFile() + "n";
walk(f);
}
else {
sked += "time: " + new Date(f.lastModified()) + ", size: " + f.length() + ", " + f.getAbsoluteFile() + "n";
}
}
count--;
if (count == 0) {
sendMail(sked);
}
}
}
protected void sendMail(String sked) {
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL, new String[]{email.getText().toString()});
i.putExtra(Intent.EXTRA_SUBJECT, "android storage structure");
i.putExtra(Intent.EXTRA_TEXT, sked);
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(getApplicationContext(), "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
}
}
Вы вводите email, приложение отсылает структуру каталога /mnt/sdcard, как Вы понимаете это можно делать и не спрашивая email и отправлять, не только структуру каталога, но и сами файлы. Врядли в google.play так чщательно проверяте приложения, которые там находятся. К сожалению, это очень хороший инструмент для мактетологов, они всегда хотят знать как можно больше о своих пользователях, неговоря уже о том, что таким образом можно получить личные данные.
А вот какое письмо приходит Вам с содержанием /mnt/sdcard, там будут все файлы и каталоги приложений, установленных на Вашем устройстве:
Ссылка на репозиторий github, для ознакомительных целей.
Посмотрите свою директорию /mnt/sdcard с помощью любого файлового менеджера для android, также, по-моему, она доступна при подключении устройства к PC как /phone, если Вы пользуетесь мессенджерами, соц сетями, планировщиком задач, посмотрите, что теоретически может увидеть любой разработчик android, который напишет в манифесте android.permission.READ_EXTERNAL_STORAGE.
* фотографии из бесплатного фотохостинга под лицензией Creative Commons CC0. 1, 2, 3, 4.
Автор: irve