Достаточно ли proguard для прохождения тестирования на проникновение? - PullRequest
0 голосов
/ 09 мая 2018

Для нашего мобильного приложения для Android мы должны выбрать инструмент запутывания, чтобы наше приложение прошло тесты на проникновение. Достаточно ли Proguard для того же или мы должны использовать Dexguard?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Обфускации недостаточно, чтобы пройти тест на проникновение

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

Но, учитывая исключительно статический анализ, который вам предстоит пройти, вы далеко не в безопасности

Я приведу вам простой практический пример, потому что различия между двумя предложенными вами инструментами уже описаны в другом ответе

Скажите, что у вас есть оригинальный необъяснимый MainActivity, заданный:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //...

    // lines for adding the shortcut in the home screen
    appPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    isAppInstalled = appPreferences.getBoolean("isAppInstalled", false);

    if(isAppInstalled == false)
        addShortcut();

где:

private void addShortcut() {
    //Adding shortcut

    // ...

    addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    // ...

    SharedPreferences.Editor editor = appPreferences.edit();
    editor.putBoolean("isAppInstalled", true);
    editor.commit();
}

Это составные части, запутанные ProGuard и взятые через онлайн-декомпилятор Java

decompiled_obfuscated_onCreate()

enter image description here

Выводы:

1) как вы можете видеть - несмотря на запутывание proguard - вы находитесь в положении, когда злоумышленник может легко изменить поток кода [например, превращая if (!this.f2293p) в if (this.f2293p)], и вы легко поймете, что вам нужно сделать, чтобы изменить значение в вашем приложении, несмотря на запутывание. В этом случае это было просто глупое предпочтение «isAppInstalled», но, конечно, это могло быть что-то более чувствительное, например:

public boolean appIsPurchased(){
    return settings.getBoolean(keyPurchase,false);
}

PS Хранение незашифрованных общих настроек [особенно если они содержат конфиденциальные данные] - очень плохая практика, это лишь быстрый пример для демонстрационных целей. В корневых устройствах получение этого файла равнозначно просмотру системной папки и поиску XML-файла

2) кроме того, в общем, это чистое запутывание не скрывает ничего, что жестко закодировано. Мы уже видели, что:

editor.putBoolean("isAppInstalled", true);

было преобразовано в:

this.f2293p = this.f2292o.getBoolean("isAppInstalled", false);

Другим простым примером может быть:

if (barcode.equals("123456")) {
    return "Hat";
}
if (barcode.equals("234567")) {
    return "Jumper";
}
if (barcode.equals("345678")) {
    return "Pants";
}
return "Troubles detecting the new item";

становится после запутывания:

return str.equals("123456") ? "Hat" : str.equals("234567") ? "Jumper" : str.equals("345678") ? "Pants" : "Troubles detecting the new item";

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

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

Это пример окончательного результата от ProGuard + стороннего инструмента безопасности [У меня нет DexGuard, я использую другой, где защита автоматически применяется через перетаскивание исходного незащищенного apk]

Это новый onCreate() метод:

protected void onCreate(Bundle bundle) {
    //...
    this.f1859o = PreferenceManager.getDefaultSharedPreferences(this);
    this.f1860p = this.f1859o.getBoolean(k09kcah9u6scvhh4ab059fbmtq.itg7jcg3c4din73t0cib8n7eau("~"), false);
    if (!this.f1860p) {
        m3099j();
    }
}

в то время как это второй пример с жестко закодированными строками, которые были полностью скрыты от вида хакера:

public String m3101a(String str) {
    PrintStream printStream = System.out;
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(k09kcah9u6scvhh4ab059fbmtq.itg7jcg3c4din73t0cib8n7eau("}}"));
    stringBuilder.append(str);
    String stringBuilder2 = stringBuilder.toString();
    return str.equals(k09kcah9u6scvhh4ab059fbmtq.itg7jcg3c4din73t0cib8n7eau("}|")) ? k09kcah9u6scvhh4ab059fbmtq.itg7jcg3c4din73t0cib8n7eau("}s") : str.equals(k09kcah9u6scvhh4ab059fbmtq.itg7jcg3c4din73t0cib8n7eau("}r")) ? k09kcah9u6scvhh4ab059fbmtq.itg7jcg3c4din73t0cib8n7eau("~{") : str.equals(k09kcah9u6scvhh4ab059fbmtq.itg7jcg3c4din73t0cib8n7eau("~z")) ? k09kcah9u6scvhh4ab059fbmtq.itg7jcg3c4din73t0cib8n7eau("~y") : k09kcah9u6scvhh4ab059fbmtq.itg7jcg3c4din73t0cib8n7eau("~x");
}

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

Наконец, в качестве дополнительной меры безопасности - этот вид профессиональных инструментов может также обнаруживать изменения в защищенном «нечитабельном» коде и останавливать выполнение приложения, если обнаруживается несанкционированное действие в защищенной версии. А также, в отличие от простого [но красивого] ​​ProGuard, реализует обнаружение для эмуляторов, корневых устройств и других потенциально опасных сценариев

Пожалуйста, обратите внимание, как код был усилен в ходе этих шагов. Никто не на 100% безопасен от взлома. Ваша работа только делает это настолько трудным, насколько это возможно, вот и все

0 голосов
/ 09 мая 2018

ProGuard - универсальный оптимизатор для байт-кода Java. DexGuard - это специализированный инструмент для защиты приложений Android.

ProGuard предлагает базовую защиту от статического анализа. DexGuard защищает приложения от статического и динамического анализа.

ProGuard обеспечивает минимальное запутывание. DexGuard применяет несколько уровней шифрования и запутывания.

ProGuard фокусируется на байт-коде. DexGuard обрабатывает все компоненты приложения.

Источник: DexGuard vs. ProGuard

...