Приложение Android не должно работать на рутированных устройствах

Я пишу приложение, которое не должно работать на рутированных устройствах. Я хочу сохранить некоторые защищенные данные, а это возможно только на устройствах без root-доступа, поскольку никто не может получить доступ к файлам в /data/data/package-name.

Кто-нибудь знает:

1) Можно ли предотвратить установку приложения на корневые устройства? Я читал что-то о «механизме защиты от копирования» Android Market. Эта функция кажется устаревшей и заменена функцией лицензирования. Однако лицензирование возможно только для платного приложения, а у меня оно бесплатное...

2) Можно ли программно проверить, рутировано устройство или нет? Если бы это было возможно, я мог бы просто остановить приложение, если устройство рутировано.

Любая помощь по этой теме приветствуется!


person Peter    schedule 22.01.2011    source источник
comment
Маркет говорит, что он скоро будет устаревшим, но это еще не так, если у вас нет других решений, вы можете использовать его сейчас.   -  person Ray Britton    schedule 22.01.2011
comment
Это много оттенков невозможного.   -  person rook    schedule 23.01.2011


Ответы (7)


Выполнять

Runtime.getRuntime().exec("su");

и проверьте код результата.

Другими словами, если вы можете выполнить su, то у вас есть root-доступ. неважно, разрешает это пользователь или запрещает, у вас есть ответ.

person Jeffrey Blattman    schedule 22.01.2011
comment
Звучит как хорошая идея, но, к сожалению, метод exec() не определен для типа Runtime... Единственный метод, который существует на Android, это getInstanceCount... - person Peter; 22.01.2011
comment
Runtime.exec() определен, я его использовал. см.: developer.android.com/reference/java/lang/Runtime.html< /а> - person Jeffrey Blattman; 23.01.2011
comment
Это, вероятно, не сработает. Когда вы запрашиваете root, использование может просто отказать в этом вашему приложению, и вы не станете мудрее. Если они предоставят это, и вы скажете им, хе-хе-хе, что вы не можете использовать мое приложение на рутированном устройстве, они просто будут в порядке, у вас не будет рута, и вы снова не станете мудрее. - person John; 25.05.2012
comment
Вот почему глупо писать приложение для устройства без рута. Доступ с правами root регулируется самим пользователем, что почти так же безопасно, как и управление им со стороны поставщика услуг. Безопасность заключается в том, чтобы быть умным и делать логический выбор, а не в ПО или аппаратном обеспечении. - person SineSwiper; 17.09.2012
comment
@BrendanByrd на корневом устройстве невозможно защитить конфиденциальные данные из других приложений, и для другого приложения тривиально получить доступ к данным других приложений, которые в противном случае являются конфиденциальными и безопасными. другими словами, вся модель песочницы скомпрометирована. есть много ситуаций, когда этого нельзя допустить. - person Jeffrey Blattman; 17.09.2012
comment
@John, просто запросите защищенную операцию ... чтение защищенного файла или что-то еще, если это не удается, вы знаете, что вам отказали. - person Jeffrey Blattman; 17.09.2012
comment
@JeffreyBlattman Вы упускаете суть. Даже если устройство рутировано, пользователь должен предоставить ВАШЕМУ приложению доступ к root. Если пользователь корневого устройства отказывает вашему приложению в доступе к root, вы прочитаете защищенный файл, и вам будет отказано. Затем пользователь развернется и перейдет к своему корневому файловому браузеру и прочитает все, что захочет, и вы не будете иметь ни малейшего понятия. - person John; 18.09.2012
comment
Процесс P = Runtime.getRuntime().exec(su); работает на меня. Это комментарий к ответу, а не разговор. - person Steven_BDawg; 04.06.2014
comment
я думаю, что @Steven_BDawg говорит, что тот простой факт, что вы можете выполнить su, означает, что вы укоренены. пользователь может отрицать это или принять, это не имеет значения, у вас есть свой ответ. - person Jeffrey Blattman; 05.06.2014

Я думаю, что ваш подход немного ошибочен. Прежде всего, пользователь может сначала установить ваше приложение и данные, а затем «рутировать» устройство (даже если рутирование стирает данные, можно сначала сделать резервную копию). Далее, общее правило заключается в том, что все, что находится в руках пользователя, больше не принадлежит вам. Хакер рано или поздно найдет способ добраться до ваших данных.

Если вы заботитесь о безопасности данных, не переносите их на устройство. Поскольку Android — сетецентрическое устройство (да, я знаю, это субъективно, но он изначально разрабатывался и позиционировался именно так), доступ к данным в сети — не редкость.

person Eugene Mayevski 'Callback    schedule 22.01.2011
comment
Не говоря уже о том, что наличие root означает, что вы, вероятно, все равно сможете обойти большинство мер безопасности. - person Kevin Coppock; 22.01.2011
comment
Вот почему я ищу способ, чтобы приложение не устанавливалось на рутированные устройства... - person Peter; 22.01.2011
comment
@Peter: здесь своего рода круговой аргумент. Под этим я подразумеваю, что любую меру безопасности, которую вы принимаете, чтобы избежать установки на рутированные устройства, можно обойти, имея привилегии root. - person Kevin Coppock; 25.01.2011
comment
@kcoppock: Хорошо, теперь я понял вашу точку зрения :-) Я думаю, что использование runtime.exec(su) очень поможет. Проверка при каждом запуске приложения на наличие root-прав на устройстве кажется мне разумной. Даже если устройство было рутировано, root все равно не может изменить исходный код приложения, чтобы отключить проверку... Или я что-то упустил? - person Peter; 25.01.2011
comment
@Peter: я не хакер, но на самом деле все, что можно заблокировать, можно разблокировать. Я бы предположил, что функцию Runtime.exec() можно изменить, чтобы она всегда возвращала значение, которое заставит ваше приложение полагать, что устройство не имеет root-прав. Защиту от копирования, которую вы указали в исходном вопросе, легко обойти с помощью рутированного телефона. Когда я впервые обновил свой Droid до пользовательского ПЗУ Froyo, многие приложения, которые я ранее купил, не отображались в Market, потому что некоторые идентификаторы не совпадали должным образом. Просто потребовалось изменить один файл (build.prop, я полагаю?), Чтобы заставить его думать, что я запускаю Eclair. - person Kevin Coppock; 25.01.2011
comment
Действительно, как сказал Зер, стоит ли тратить время на его взлом? Если это так, то кто-то обязательно будет, независимо от того, какую безопасность вы реализуете. Это не означает, что вы не должны использовать меры безопасности (например, запирать дверь автомобиля, если кто-то хочет войти, он может разбить окно), но если взломать сложнее, чем стоит потратить время на взлом, этого, вероятно, достаточно. Опять же, IANASE (эксперт по безопасности: P) - person Kevin Coppock; 25.01.2011
comment
@Peter, если кто-то рутирует устройство, он может получить ваш код и ваши данные и проанализировать их на рабочем столе (включая извлечение ключа шифрования), не запуская ваше приложение. - person Eugene Mayevski 'Callback; 25.01.2011

Я бы посоветовал запустить su, а затем проверить вывод. Если пользователь разрешает вашему приложению иметь root, используйте root для удаления вашего собственного приложения (один из способов может состоять в том, чтобы поместить скрипт в init.d, а затем принудительно перезагрузить компьютер).

Если пользователь НЕ разрешает запуск вашего приложения от имени пользователя root, то:

  1. Они ОТКАЗАЛИ разрешения вашего приложения.
  2. Они не укоренены.

Теперь отказ в разрешениях (и рутирование) означает, что у них есть какое-то приложение для управления СУПЕРПОЛЬЗОВАТЕЛЕМ, и именно здесь начинается следующая часть.

Затем я использовал бы PackageManager для получения списка всех пакетов, а затем сравнивал бы их с несколькими доступными приложениями для управления суперпользователями, а именно с приложениями Koush, ChainsDD и Chainfire.

Соответствующие имена пакетов:

  1. com.noshufou.android.su
  2. eu.chainfire.supersu
  3. com.koushikdutta.superuser
person user1010101010101    schedule 14.05.2013

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

public static boolean findBinary(String binaryName) {
        boolean found = false;
        if (!found) {
            String[] places = { "/sbin/", "/system/bin/", "/system/xbin/",
                    "/data/local/xbin/", "/data/local/bin/",
                    "/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/" };
            for (String where : places) {
                if (new File(where + binaryName).exists()) {
                    found = true;

                    break;
                }
            }
        }
        return found;
    }

    private static boolean isRooted() {
        return findBinary("su");
    }

Теперь попробуйте проверить, рутировано ли устройство.

if (isRooted() == true){
//Do something to prevent run this app on the device

}
else{
//Do nothing and run app normally
}

Например, вы можете принудительно остановить приложение, если устройство рутировано.

person noobProgrammer    schedule 30.05.2014

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

Чтобы ответить на ваш вопрос, они контролируют машину, поэтому ожидайте, что они смогут перехватить любой вызов API, проверяющего «Это укоренено?» и лгать тебе. Вместо этого зашифруйте данные на клиенте ключом, известным клиенту, но сделайте неочевидным, где и как вы это делаете. Как правило, делайте вещи раздражающими для тех, кто смотрит.

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

Не боритесь со свободой — зачем вообще отказывать клиентам с бесплатными устройствами? - вместо этого, если вы хотите получить конкретный результат, сделайте это так: «Беспокоиться о получении данных»> «Значение получения данных». Тогда этого не произойдет. Если вы действительно должны обеспечить надежную защиту, храните данные на стороне сервера.

person Zer    schedule 23.01.2011
comment
На самом деле я создаю пару ключей (общедоступную и приватную) на устройстве и хочу сохранить ее в собственном хранилище ключей. Пароль для доступа к этому хранилищу ключей должен храниться в максимально безопасном месте, чтобы даже на рутированном телефоне никто, владеющий телефоном, не мог получить закрытый ключ... - person Peter; 23.01.2011
comment
Вы храните пароль для доступа к ключу вместе с ключом? Ужасно небезопасно, тебе не кажется? .. Почему бы просто не зашифровать пару ключей с помощью парольной фразы, чтобы она правильно расшифровывалась только в том случае, если они введут правильный пароль? Это то, что делают SSH и друзья. - person Zer; 23.01.2011
comment
Если вы пытаетесь защитить данные пользователя, его дело — беспокоиться о других приложениях. без обид, это наивный подход к безопасности. по этой логике мой браузер должен просто хранить все мои пароли в текстовом файле в c:/passwords.txt, верно? в конце концов, это проблема пользователя, если ему случится установить вредоносное приложение. - person Jeffrey Blattman; 23.01.2011

Я считаю, что одним из «недостатков» традиционной защиты от копирования было то, что она не позволяла устанавливать приложение на рутированные устройства, но у нее также есть свои проблемы, и она скоро будет объявлена ​​устаревшей.

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

person Learn OpenGL ES    schedule 08.04.2012

1) нет. как бы вы отказались от установки? почему рутованное устройство отказывает в установке чего-то, что пользователь хочет установить на fs? весь смысл рутирования в том, что вы можете заставить устройство делать что угодно.

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

Кроме того, то, что вы спрашиваете, можете ли вы создать идеальную систему drm для защиты от копирования - вы также можете упустить момент, что пользователь может изменить ваше приложение, удалив вашу корневую проверку. если у вас есть какая-то проверка контрольной суммы/CRC, пользователь также может подделать результат этого.

person Lassi Kinnunen    schedule 07.06.2017