Ionic — это гибридная среда на основе WebView. Недавно команда Ionic Team выпустила свою версию 4. Традиционно приложения Ionic зависят от Cordova Framework для доступа к собственным API.

В этой статье будут рассмотрены некоторые лучшие методы обеспечения безопасности при разработке приложений Ionic.

Анализ приложений Cordova

Проще говоря, приложения Cordova — это веб-сайты, работающие на смартфонах WebView внутри отдельных контейнеров приложений. Файлы IPA/APK приложений представляют собой простые архивы, которые можно распаковать. Если мы проверим папку с ресурсами, мы увидим связанные файлы. Что делает код легко читаемым. Гипотетически, перенеся код в контейнер отладки APK, мы получим доступ к режиму code+inspect.

По сути, безопасные приложения Cordova должны разрабатываться с учетом того, что:

  • Код виден невооруженным глазом;
  • Код можно отлаживать и локальное хранилище доступно.

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

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

Разделим статью на следующие разделы

Защита подключения приложения к серверу

Приложение для смартфона взаимодействует с внутренним сервером через API или веб-сервисы. Традиционно веб-сервисы использовали протокол HTTP. Протокол HTTPS добавляет значительный уровень безопасности. Через HTTPS связь между приложением и сервером шифруется.

Кроме того, Apple представила безопасность передачи приложений (ATS) в iOS 9. ATS заставляет приложения iOS подключаться по протоколу HTTPS. Точно так же Android 9 Pie блокирует трафик открытого текста (HTTP). Устройства с Android Pie будут выдавать ошибку при обмене данными по HTTP, если приложение явно не разрешит это в конфигурации сетевой безопасности.

Закрепление SSL

Пользователи/приложения зависят от центров сертификации (CA) и серверов доменных имен (DNS) для проверки доменов для TLS. Небезопасные сертификаты могут быть установлены на пользовательское устройство, тем самым открывая устройство для атаки «человек посередине».

С помощью закрепления SSL сертификаты могут быть объединены внутри приложения, поэтому приложению не нужно полагаться на хранилище доверенных сертификатов устройства. В Cordova мы можем реализовать закрепление на основе сертификатов через расширенный HTTP-плагин.

Предотвращение выполнения внешнего кода

Как упоминалось ранее, приложения Cordova — это веб-сайты, работающие в локальных контейнерах WebView. Таким образом, они подвержены XSS-уязвимостям. Чтобы предотвратить такое выполнение, приложение можно защитить с помощью плагина Cordova Whitelist и строгого CSP.

Плагин Cordova Whitelist и политика безопасности контента

Плагин белого списка позволяет нам определить безопасность приложения с помощью параметров в confix.xml. Мы можем разрешать/блокировать внешнюю навигацию, контролировать доступ к сети и ограничивать намерения приложений.

Тег access позволяет нам ограничивать доступ к доменам в приложении. По умолчанию разрешено все:

<access origin="*" />

Мы можем внести домены в белый список, заменив * на отдельные домены. давайте предположим, что нам нужно ограничить трафик до trusteddomain.com. Тег access не разрешает внесение веб-сокетов в белый список.

<access origin="https://trusteddomain.com" />
<access origin="https://api.trusteddomain.com" />

Тег allow-intent позволяет нам ограничить вызовы внешних приложений через гиперссылки. По умолчанию гиперссылки на веб-браузер, телефон, SMS, электронную почту и карты включены.

<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />

Другой способ применения белого списка — добавление тега Content Security Policy (CSP) на страницу index.html. CSP — это стандарт безопасности, используемый для предотвращения XSS-атак. Подробнее о CSP можно прочитать здесь. Вот пример тега:

<meta http-equiv="Content-Security-Policy" 
    content="default-src 'self' https://trusteddomain.com data: gap: https://ssl.gstatic.com; 
    style-src 'self' 'unsafe-inline'; 
    media-src *;
    >

Значение gap: требуется для приложений iOS, а https://ssl.gstatic.com — для Android для обратной связи. Кроме этого, большинство ресурсов занесены в белый список trusteddomain.com. Кроме того, мы можем ограничить WebSockets и XHR, используя атрибут connect-src. Прямо сейчас он неявно заблокирован через файл default-src.

Защита локального хранилища

Локальное хранилище и подключаемый модуль SQLite — распространенные методы хранения постоянных данных в приложении Cordova. Кроме того, у Ionic есть привязка к хранилищу, которая позволяет нам использовать IndexedDB, SQLite и локальное хранилище в приложении Ionic с помощью одного метода. Однако данные в IndexedDB и локальном хранилище можно легко просмотреть в приложении отладки с помощью инструментов отладки браузера. После извлечения базы данных SQLite можно просматривать с помощью средств просмотра баз данных. Мы можем защитить данные, используя два плагина в Cordova.

Безопасное хранилище

Плагин безопасного хранения позволяет нам безопасно хранить данные типа ключ-значение. В iOS данные хранятся в связке ключей через библиотеку цепочки ключей SAMS. На Android случайный ключ AES шифрует данные. Затем зашифрованный ключ AES сохраняется в SharedPreferences.

SQL-шифр

В некоторых сценариях нам требуются таблицы SQL в нашем приложении. В этом случае мы можем использовать SQLCipher для защиты базы данных.

SQL Cipher — это плагин для библиотеки шифров SQLite. Данные в SQLCipher шифруются с помощью 256-битного AES, такого как безопасное хранилище. База данных не читается без ключа. Однако ключ SQL можно легко получить, разархивировав APK/IPA. В качестве меры предосторожности рекомендуется сгенерировать уникальный ключ для пользователя на внутреннем сервере. Сгенерированный ключ можно получить из серверной части, когда необходимо открыть базу данных. В качестве альтернативы ключ можно хранить в безопасном хранилище.

Расширенные проверки целостности

Это отдельные проверки, которые можно выполнять в приложении. Корневые проверки используются для определения того, является ли устройство рутированным. Аттестация SafetyNet используется для проверки целостности устройства и APK. Jscrambler обеспечивает блокировку кода, самозащиту и обфускацию, которые действуют как проверка целостности JavaScript.

Проверка Root и Jailbreak

Устройства с рутом, джейлбрейком или устройства с пользовательскими ПЗУ следует считать небезопасными. Как правило, пользовательские ПЗУ позволяют пользователям использовать более качественную и новую прошивку на Android. Однако корневое устройство имеет доступ для чтения/записи к папкам /data и /system. Это фактически позволяет пользователю или приложению обходить собственные ограничения безопасности приложения. Рекомендуется запускать корневую проверку при выполнении критических функций.

В iRoot plugin есть проверки Jailbreak и Root. Для пользователей Android вы также можете проверить Плагин RootBeer. Это встраиваемая оболочка для популярной библиотеки rootbeer.

Защитная сетка

SafetyNet — это специфичная для Android библиотека для подтверждения целостности APK и устройства. Эта функция доступна только на устройствах с сертификацией Play или на устройствах с установленными службами PlayServices. API Аттестация — это функция с ограниченной скоростью, которая обеспечивает выборочную проверку устройства и APK. VerifyApps предоставляет функции для обнаружения вредоносных приложений и включения функции проверки приложений.

Вот плагин для SafetyNet API.

Обфускация и защита кода (Jscrambler)

Как упоминалось ранее, код приложений Cordova можно легко восстановить. Таким образом, это позволяет злоумышленникам копировать (повторно распространять) код, реконструировать конфиденциальную логику или даже вмешиваться в код, чтобы злоупотреблять приложением (например, разблокировать функции или нарушать лицензионные соглашения).

Эту уязвимость лучше всего свести к минимуму с помощью решения Защита приложений JavaScript, такого как Jscrambler. Jscrambler обеспечивает четыре основных уровня безопасности:

Защищая исходный код приложений Ionic Cordova, попытки обратного проектирования и подделки становятся чрезвычайно трудными, как можно наблюдать в примере ниже.

// Original Code Example
function startTime() {
    var today = new Date();
    var h = today.getHours();
    var m = today.getMinutes();
    var s = today.getSeconds();
    m = checkTime(m);
    s = checkTime(s);
    document.getElementById('txt').innerHTML =
    h + ":" + m + ":" + s;
    var t = setTimeout(startTime, 500);
}
// Code Protected with Jscrambler (just a portion)
B100.P=function (){return typeof B100.H.C==='function'?B100.H.C.apply(B100.H,arguments):B100.H.C;};B100.H8=function(){var u8=2;while(u8!==1){switch(u8){case 2:return{C8:function W8(n8,S8){var F8=2;while(F8!==10){switch(F8){case 11:return f8;break;case 14:f8[U8][(c8+S8*U8)%n8]=f8[c8];F8=13;break;case 5:F8=i8<n8?4:9;break;case 3:i8+=1;F8=5;break;case 8:F8=U8<n8?7:11;break;case 4:f8[(i8+S8)%n8]=[];F8=3;break;case 9:var U8=0;F8=8;break;case 13:c8-=1;F8=6;break;case 7:var c8=n8-1;F8=6;break;case 1:var i8=0;F8=5;break;case 6:F8=c8>=0?14:12;break;case 12:U8+=1;F8=8;break;case 2:var f8=[];F8=1;break;}}}(14,6)};break;}}}();B100.x8=function (){return typeof B100.H8.C8==='function'?B100.H8.C.apply(B100.H8,arguments):B100.H8.C;};function startTime(){var I0=B100;var B,K,g,T,d,Y,r,I;B=new Date();K=B[I0.b0(1)]();g=B[I0.b0(7)]();T=583587531;d=-1024664412;Y=2;for(var o=1;I0.q(o.toString(),o.toString().length,44684)!==T;o++){r=B[I0.v0(4)]();g=checkTime(g);Y+=2;}if(I0.q(Y.toString(),Y.toString().length,49201)!==d){r=B[I0.v0(4)]();g=checkTime(g);}r=B[I0.v0(6)]();g=checkTime(g);r=checkTime(r);I0.C1(I0.x8()[8][12]);var o0=I0.w1(4,67,18);I0.B1(I0.x8()[4][8]);var c0=I0.w1(93,10,7,10,8);document[I0.v0(3)](I0.b0(2))[I0.v0(0)]=K+I0.b0(o0)+g+I0.b0(c0)+r;I=setTimeout(startTime,500);}

Чтобы начать защищать исходный код Ionic/Cordova с помощью Jscrambler, ознакомьтесь с официальным руководством.

Последние мысли

В этой статье представлен обзор методов повышения безопасности приложений Ionic на основе Cordova. В зависимости от вашего варианта использования вы можете создать жизнеспособную архитектуру для своих нужд безопасности.

Если вы хотите, чтобы ваши собственные приложения Cordova/Ionic не отображались на стороне клиента, запросите демонстрацию Jscrambler или попробуйте бесплатно.

Первоначально опубликовано Караном Ганди в блоге Jscrambler.