Руководство по безопасности
В данном руководстве приведены лучшие практики безопасности, которые следует учитывать при разработке приложения Cordova. Пожалуйста, имейте в виду, что безопасность — очень сложная тема, поэтому данное руководство не является исчерпывающим. Если вы считаете, что можете внести вклад в это руководство, пожалуйста, отправьте вопрос в систему отслеживания ошибок Cordova по адресу "Документация". Данное руководство предназначено для общей разработки Cordova (все платформы), но будут отмечены особые платформенно-специфичные моменты.
В данном руководстве рассматриваются следующие темы:
- Белый список
- IFrame и механизм идентификаторов обратного вызова
- Закрепление сертификатов
- Самозаверяемые сертификаты
- Зашифрованное хранилище
- Общие рекомендации
- Рекомендованные статьи и другие ресурсы
Белый список
Прочитайте и поймите Руководство по белому списку
Белый список доменов не работает на Android API 10 и ниже, а также на WP8 для iframe и XMLHttpRequest. Это означает, что злоумышленник может загрузить любой домен в iframe, а любой скрипт на этой странице внутри iframe может напрямую получить доступ к объектам Cordova JavaScript и соответствующим нативным объектам Java. Это следует учитывать при создании приложений для этих платформ. На практике это означает, что необходимо использовать Android API, более высокую чем 10, и по возможности не использовать iframe для загрузки внешнего содержимого — используйте плагин InAppBrowser или другие плагины сторонних разработчиков.
IFrame и механизм идентификаторов обратного вызова
Если содержимое подаётся в iframe с домена, включённого в белый список, этот домен получит доступ к нативному мосту Cordova. Это означает, что если вы включите в белый список стороннюю рекламную сеть и отобразите эти объявления через iframe, злонамеренное объявление потенциально сможет выйти за пределы iframe и выполнить вредоносные действия. По этой причине, как правило, не следует использовать iframes, если вы не контролируете сервер, на котором размещается содержимое iframe. Обратите также внимание, что существуют плагины сторонних разработчиков для поддержки рекламных сетей. Обратите внимание, что это утверждение неверно для iOS, которая перехватывает всё, включая подключения iframe.
Закрепление сертификатов
Cordova не поддерживает истинное закрепление сертификатов. Основным препятствием является отсутствие нативных API в Android для перехвата SSL-соединений с целью проверки сертификата сервера. (Хотя закрепление сертификатов на Android возможно в Java с использованием JSSE, веб-вью Android написан на C++, а подключения к серверам обрабатываются для вас веб-вью, поэтому использование Java и JSSE там невозможно.) Поскольку Apache Cordova предназначен для обеспечения согласованных API на нескольких платформах, отсутствие возможности на одной из основных платформ нарушает эту согласованность.
Существуют способы приближённого закрепления сертификатов, такие как проверка того, что открытый ключ сервера (отпечаток) соответствует ожидаемому значению при запуске приложения или в другие моменты во время его работы. Существуют плагины сторонних разработчиков для Cordova, которые могут это делать. Однако это не то же самое, что истинное закрепление сертификатов, которое автоматически проверяет ожидаемое значение при каждом подключении к серверу.
Также существуют плагины, которые могут выполнять истинное закрепление сертификатов для некоторых платформ, если ваше приложение способно выполнять все сетевые запросы с помощью плагина (т.е. без традиционных запросов XHR/AJAX и т.д.).
Самозаверяемые сертификаты
Использование самозаверяемых сертификатов на вашем сервере не рекомендуется. Если вам нужен SSL, настоятельно рекомендуется, чтобы ваш сервер имел сертификат, надлежащим образом подписанный известным центром сертификации (ЦС). Невозможность истинного закрепления сертификатов делает это важным.
Причина в том, что принятие самозаверяемых сертификатов обходит проверку цепочки сертификатов, что позволяет считать действительным любой сертификат сервера. Это открывает коммуникацию для атак «человек посередине». Злоумышленнику становится очень легко не только перехватывать и читать всю коммуникацию между устройством и сервером, но и изменять её. Устройство никогда не узнает об этом, потому что не проверяет, подписан ли сертификат сервера доверенным ЦС. У устройства нет доказательств того, что сервер — тот, за кого себя выдаёт. Из-за лёгкости атак «человек посередине», принятие самозаверяемых сертификатов лишь незначительно лучше, чем просто использование http вместо https в ненадежной сети. Да, трафик будет зашифрован, но он может быть зашифрован ключом «человека посередине», поэтому «человек посередине» может получить доступ ко всему, так что шифрование бесполезно, за исключением пассивных наблюдателей. Пользователи доверяют SSL, что он безопасен, и это намеренно делало бы его небезопасным, поэтому использование SSL становится вводящим в заблуждение. Если это будет использоваться в надёжной сети (например, вы полностью находитесь внутри контролируемой корпоративной сети), то самозаверяемые сертификаты по-прежнему не рекомендуются. Две рекомендации в надёжной сети — просто использовать http, потому что сама сеть доверяет, или получить сертификат, подписанный доверенным ЦС (не самозаверяемый). Либо сеть надёжна, либо нет.
Описанные принципы не специфичны для Apache Cordova, они применимы ко всем коммуникациям клиент-сервер.
При использовании Cordova на Android использование android:debuggable="true" в файле манифеста приложения позволит разрешить ошибки SSL, такие как ошибки валидации цепочки сертификатов при использовании самозаверяемых сертификатов. Таким образом, вы можете использовать самозаверяемые сертификаты в этой конфигурации, но это не та конфигурация, которую следует использовать при работе приложения в производстве. Она предназначена только для разработки приложения.
Зашифрованное хранилище
(В процессе)
Общие рекомендации
Не используйте Android Gingerbread!
- Установите уровень min-target-sdk выше 10. API 10 — Gingerbread, и Gingerbread больше не поддерживается Google или производителями устройств, поэтому не рекомендуется командой Cordova.
- Gingerbread показал себя небезопасным, и это одна из самых уязвимых мобильных ОС http://www.mobilemag.com/2012/11/06/andriod-2-3-gingerbread-security/.
- Белый список на Android не работает с Gingerbread и ниже. Это означает, что злоумышленник может загрузить вредоносный код в iframe, который затем получит доступ ко всем API Cordova и сможет использовать этот доступ для кражи личных данных, отправки SMS-сообщений на платные номера и совершения других вредоносных действий.
Используйте InAppBrowser для внешних ссылок
- Используйте InAppBrowser при открытии ссылок на любые внешние веб-сайты. Это намного безопаснее, чем включение домена в белый список и непосредственное включение содержимого в ваше приложение, потому что InAppBrowser будет использовать средства безопасности родственного браузера и не предоставит веб-сайту доступ к вашей среде Cordova. Даже если вы доверяете стороннему веб-сайту и включаете его напрямую в своё приложение, этот сторонний веб-сайт может ссылаться на вредоносное веб-содержимое.
Проверяйте все входные данные пользователя
- Всегда проверяйте все входные данные, которые принимает ваше приложение. Это включает имена пользователей, пароли, даты, загружаемые медиа и т.д. Поскольку злоумышленник может манипулировать вашими HTML- и JS-активами (либо путем дизассемблирования вашего приложения, либо с помощью инструментов отладки, таких как chrome://inspect), эта проверка также должна выполняться на вашем сервере, особенно перед передачей данных любому бэкенд-сервису.
- Другие источники, где данные должны быть проверены: пользовательские документы, контакты, push-уведомления
Не кэшируйте чувствительные данные
- Если имена пользователей, пароли, данные геолокации и другие конфиденциальные данные кэшируются, то их потенциально может получить неавторизованный пользователь или приложение.
Не используйте eval(), если вы не знаете, что делаете
- Функция JavaScript eval() имеет долгую историю злоупотребления. Неправильное использование может сделать ваш код уязвимым для атак с внедрением кода, проблем с отладкой и замедленного выполнения кода.
Не предполагайте, что ваш исходный код безопасен
- Поскольку приложение Cordova построено из HTML- и JavaScript-активов, упакованных в нативную оболочку, не следует считать ваш код безопасным. Возможно обратное проектирование приложения Cordova.
Рекомендованные статьи и другие ресурсы
- Лист хитростей по безопасности HTML5, подробно описывающий, как обезопасить ваше HTML5-приложение
- Статья Phonegap о безопасности устройства, например, об использовании зашифрованных данных
- Документ о известных уязвимостях в веб-вью-приложениях гибридной архитектуры
© 2012, 2013, 2015 The Apache Software Foundation
Licensed under the Apache License 2.0.
https://cordova.apache.org/docs/en/6.x/guide/appdev/security/index.html