Перейти к содержанию

Небезопасная конфигурация App Transport Security

Критичность: ВЫСОКИЙ
Способ обнаружения: SAST, NETWORK

Описание

Приложение использует небезопасно настроенную конфигурацию сетевого взаимодействия App Transport Security. С выходом iOS 9.0 Apple представил настройку App Transport Security (ATS) как обязательную для всех приложений. ATS-конфигурация — это отдельная секция внутри основного Info.plist-файла приложения, в котором настраиваются параметры сетевого взаимодействия. Она имеет следующую структуру.

NSAppTransportSecurity : Dictionary {
    NSAllowsArbitraryLoads : Boolean
    NSAllowsArbitraryLoadsForMedia : Boolean
    NSAllowsArbitraryLoadsInWebContent : Boolean
    NSAllowsLocalNetworking : Boolean
    NSExceptionDomains : Dictionary {
        : Dictionary {
            NSIncludesSubdomains : Boolean
            NSExceptionAllowsInsecureHTTPLoads : Boolean
            NSExceptionMinimumTLSVersion : String
            NSExceptionRequiresForwardSecrecy : Boolean   
            NSRequiresCertificateTransparency : Boolean
        }
    }
}

Некорректная реализация сетевого взаимодействия упрощает атаки Man In The Middle (человек посередине) и снижает безопасность приложения.

Рекомендации

Ниже представлено описание каждого параметра и рисков, которые может повлечь отключение каждого из них.

Рекомендациями в данном случае является включение ATS в полном объеме на уровне всего приложения и без исключений для доменов.

Рекомендуемая конфигурация:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSAllowsArbitraryLoadsForMedia</key>
<false/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<false/>
</dict>

Изначально Apple планировала потребовать, чтобы все приложения, представленные в App Store, поддерживали ATS в январе 2017 года, однако они продлили крайний срок, но еще не объявили дату.

NSAllowArbitraryLoads

Ключ NSAllowArbitraryLoads определяет состояние ATS в целом, включено или выключено оно для приложения. По умолчанию для NSAllowArbitraryLoads установлено значение NO. Установка ключа в значение YES приведет к полному отключению ATS. Это означает, что система не будет запрещать приложению взаимодействовать с любыми доменами по протоколу HTTP и не будет применено никаких проверок безопасности. Крайне не рекомендуется отключать ATS, особенно для всего приложения.

Если по какой-то причине необходимо отключение ATS, рекомендуется дополнительно проверить:

  • Шифры, используемые для сетевого взаимодействия приложения (и их надежность).
  • Протоколы, используемые для отправки и получения данных (и их безопасность).
  • Есть ли в приложении уязвимости для перехода на более раннюю версию протокола шифрования.
  • Проверяет ли приложение сертификаты, используемые для TLS-подключений.

NSAllowsLoadsForMedia

Это исключение относится к мультимедийному контенту, защищенному системой управления цифровыми правами (DRM) или шифрованием. По умолчанию для NSAllowsLoadsForMedia установлено значение NO. Если для ключа NSAllowsLoadsForMedia установлено значение YES, ATS отключается для контента, отправляемого с использованием фреймворка AVFoundation (обычно это происходит с приложениями, которые включают возможность работы с видео/аудиоконтентом).

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

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

NSAllowsArbitraryLoadsInWebContent

Ключ NSAllowsArbitraryLoadsInWebContent определяет, возможно ли соединение по небезопасным протоколам из компонентов WebView.

По умолчанию для ключа NSAllowsArbitraryLoadsInWebContent установлено значение NO. Если для ключа установлено значение YES, ATS будет отключен для WebView.

Неправильное использование WebView может привести к различным уязвимостям в приложении, поэтому крайне важно обеспечить их безопасность. Например, WebView могут быть уязвимы для ряда распространенных веб-уязвимостей, таких как внедрение SQL (SQL-injection), подделка межсайтовых запросов (CSRF) и атаки межсайтовых сценариев (XSS). Чтобы получить дополнительную информацию о безопасности при использовании WebView, ознакомьтесь с дополнительными рекомендациями.

NSAllowsLocalNetworking

Ключ NSAllowsLocalNetworking определяет работу ATS в локальной сети. По умолчанию для ключа NSAllowsLocalNetworking установлено значение NO. Обычно это исключение используют приложения, которые подключаются к локальному устройству для обеспечения сети Интернета вещей (IoT). При отключении ATS убедитесь, что при взаимодействии в локальной сети не передаются конфиденциальные данные, а также использует безопасное TLS-соединение.

NSExceptionDomains

Используя ключ NSExceptionDomains, есть возможность настраивать исключения ATS для отдельных доменов. Стоит помнить, что подразделы ATS внутри NSExceptionDomains заменяют другие первичные ключи. Например, если приложение загружает мультимедиа из определенного домена и для этого конкретного домена используются и исключение NSAllowsLoadsForMedia на верхнем уровне и конфигурация NSExceptionDomains, то параметры NSExceptionDomains имеют приоритет (то есть заменяют NSAllowsLoadsForMedia верхнего уровня для конкретно этого домена).

Вторая особенность, если домен в исключениях указан без какой-либо конфигурации, он получит полную защиту ATS, даже если для параметра NSAllowsArbitraryLoads установлено значение YES. То есть, разработчик может отключить ATS глобально, но включить его для определенных доменов, указав их в ключе NSExceptionDomains. Отключение ATS для всего приложения и включение только для определенных доменов является ошибкой конфигурации. При необходимости использования небезопасных протоколов для известных доменов необходимо именно их добавлять в исключения и включать ATS на глобальном уровне для всего приложения.

Если указываются исключения для доменов, ATS игнорирует любые ключи глобальной конфигурации для этого домена, такие как NSAllowsArbitraryLoads. Это работает, даже если оставить словарь для домена пустым и полностью положиться на значения его ключей по умолчанию.

NSIncludesSubdomains

Данный ключ определяет, будет ли применяться политика ATS для всех поддоменов.

По умолчанию для ключа NSIncludesSubdomains установлено значение NO. Если установлено значение YES, любая конфигурация ATS, включенная для определенного домена, будет использоваться для всех поддоменов. И, если установлен домен, но не настроено никаких дополнительных ключей, кроме NSIncludesSubdomains, этот домен и его поддомены будут использовать ATS.

NSExceptionAllowsInsecureHTTPLoads

Ключ NSExceptionAllowsInsecureHTTPLoad определяет, возможна ли передача незащищенного трафика HTTP на указанный домен.

По умолчанию для этого ключа установлено значение NO. Если установлено значение YES, приложению будет разрешено отправлять HTTP-трафик на этот домен.

NSExceptionMinimumTLSVersion

Этот ключ позволяет снизить минимально допустимую версию TLS. По умолчанию допустимыми версиями являются TLS 1.2 и выше.

NSExceptionRequiresForwardSecrecy

Данный ключ определяет использование свойства Forward Secrecy для конкретного домена.

По умолчанию для этого ключа установлено значение YES. Если значение выставлено в NO свойство Forward Secrecy будет отключено для конкретного домена.

NSRequiresCertificateTransparency

Данный ключ определяет использование свойства Certificate Transparency (прозрачность сертификатов) для конкретного домена.

По умолчанию для этого ключа установлено значение NO. Если для ключа установлено значение YES, для сертификата домена потребуется метка времени Certificate Transparency. Certificate Transparency — это проект Google, направленный на повышение безопасности системы выпуска сертификатов SSL. Если ваша организация или рассматриваемый домен поддерживает Certificate Transparency, рекомендуется включить данную опцию. Certificate Transparency помогает выявлять мошеннические центры сертификации (ЦС), а также помогает предотвратить атаки типа «человек посередине», уведомляя владельца, если его сертификат был скомпрометирован. Когда этот ключ включен, проверки сертификатов, связанные с Certificate Transparency, будут выполнены до установления соединения.

ATS — это не серебряная пуля

ATS — это мера безопасности на стороне клиента, которая не заменяет безопасность на стороне сервера. Безопасность на стороне клиента можно обойти, если злоумышленник имеет физический доступ к устройству. Таким образом, хотя ATS защищает приложения iOS и их пользователей, помогая предотвратить атаки на более раннюю версию SSL и использование слабых шифров, компаниям по-прежнему необходимо защищать серверную часть приложения, например путем реализации HTTP Strict Transport Security (HSTS), отключая слабые шифры и т. д. Безопасность на стороне клиента усиливает безопасность на стороне сервера и является всего лишь одним из уровней комплексной защиты мобильного приложения.

Ссылки

  1. https://developer.apple.com/documentation/security/preventing_insecure_network_connections

  2. https://books.nowsecure.com/secure-mobile-development/en/webviews/

  3. https://developer.apple.com/documentation/security/preventing_insecure_network_connections

  4. https://www.certificate-transparency.org/

  5. https://developer.apple.com/documentation/avfoundation

  6. https://developer.apple.com/news/?id=12212016b

  7. https://www.owasp.org/index.php/Mobile_Top_10_2016-M3-Insecure_Communication

  8. https://cwe.mitre.org/data/definitions/319.html

К началу