Извлечение пароля SSID из файла конфигурации запрашивающего устройства в Android

Я пытаюсь написать приложение Android SYSTEM, которое извлекает пароль Wi-Fi из файла конфигурации запрашивающего (/data/misc/wifi/wpa_supplicant.conf).

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

Однако, когда я пытаюсь открыть файл программно, я получаю сообщение об ошибке EACCES (Отказано в доступе). Это происходит даже несмотря на то, что мое приложение работает как «системный» пользователь (я определяю android:sharedUserId="android.uid.system" в манифесте), приложение подписано закрытым ключом системы и помещено в /system/app.

Я точно знаю, что это можно сделать с помощью системных разрешений, потому что в исходном коде Android в frameworks/base/wifi/java/android/net/wifi/WifiConfigStore.java есть код, который читает этот файл. Этот код выполняется в рамках процесса «system_server», который использует пользователя «system», как и мое приложение.

Мой код для открытия файла, который не работает:

reader = new BufferedReader(new FileReader(SUPPLICANT_CONFIG_FILE));

Если оба приложения работают с системным пользователем и имеют системные разрешения, почему system_server может прочитать этот файл, а мое приложение не работает? Что мне не хватает?

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


person greenmind    schedule 31.03.2014    source источник
comment
Дополнительная информация, которую я узнал: кажется, что пользователь «система» не может прочитать этот файл, только пользователь «wifi». Однако на ps это показывает, что system_server работает под «системным» пользователем и все еще может читать файл. Итак, я предполагаю, что system_server каким-то образом выдает себя за пользователя «wifi», но я не вижу ни одного фрагмента кода, намекающего на это.   -  person greenmind    schedule 31.03.2014
comment
Поскольку Android на самом деле является Linux, он может делать то же самое. wifi может быть group, к которому принадлежит пользователь system, а не полноправным пользователем... хотя это не поможет решить вашу проблему.   -  person Mike Ounsworth    schedule 12.11.2014


Ответы (1)


Вам нужна подпись платформы, добавьте свойство android:sharedUserId="android.uid.system" в раздел манифеста и добавьте свойство android:process="system" в раздел приложения.

person reker    schedule 12.11.2014
comment
Я уже делаю это, мое приложение работает с разрешениями системного пользователя. Это не проблема. - person greenmind; 13.11.2014
comment
Только системная подпись не решает проблему, вам нужно добавить android:process=system. Я тестировал на AOSP 4.2.0-4.4.4. - person reker; 17.11.2014
comment
Хорошо, теперь я понимаю разницу. Попробую. Спасибо! - person greenmind; 18.11.2014
comment
Это работает! Большое спасибо. Я бы проголосовал за вас, если бы у меня было достаточно репутации;) - person greenmind; 23.11.2014