Skip to content

MASTG-KNOW-0071: iOS App Transport Security

A partir do iOS 9, a Apple introduziu o App Transport Security (ATS), que é um conjunto de verificações de segurança aplicadas pelo sistema operacional para conexões feitas usando o URL Loading System (normalmente via URLSession) para sempre usar HTTPS. Os aplicativos devem seguir as melhores práticas da Apple para proteger adequadamente suas conexões.

Assista ao vídeo introdutório sobre ATS da Apple WWDC 2015.

O ATS realiza a avaliação padrão de confiança do servidor e exige um conjunto mínimo de requisitos de segurança.

Avaliação Padrão de Confiança do Servidor:

Quando um aplicativo se conecta a um servidor remoto, o servidor fornece sua identidade usando um certificado digital X.509. A avaliação padrão de confiança do servidor do ATS inclui validar se o certificado:

  • Não está expirado.
  • Tem um nome que corresponde ao nome DNS do servidor.
  • Tem uma assinatura digital válida (não foi adulterada) e pode ser rastreada até uma Autoridade de Certificação (CA) confiável incluída no Trust Store do sistema operacional, ou foi instalado no cliente pelo usuário ou um administrador do sistema.

Requisitos Mínimos de Segurança para Conexões:

O ATS bloqueará conexões que não atendam a um conjunto de requisitos mínimos de segurança, incluindo:

  • TLS versão 1.2 ou superior.
  • Criptografia de dados com AES-128 ou AES-256.
  • O certificado deve ser assinado com uma chave RSA (2048 bits ou mais) ou uma chave ECC (256 bits ou mais).
  • A impressão digital do certificado deve usar SHA-256 ou superior.
  • O link deve suportar perfect forward secrecy (PFS) por meio de troca de chaves Elliptic Curve Diffie-Hellman Ephemeral (ECDHE).

Verificação de Validade do Certificado:

De acordo com a Apple, "a avaliação do status de confiança de um certificado TLS é realizada de acordo com os padrões estabelecidos da indústria, conforme definido no RFC 5280, e incorpora padrões emergentes como o RFC 6962 (Certificate Transparency). No iOS 11 ou posterior, os dispositivos Apple são atualizados periodicamente com uma lista atual de certificados revogados e restritos. A lista é agregada a partir de listas de revogação de certificados (CRLs), publicadas por cada uma das autoridades de certificação raiz integradas confiadas pela Apple, bem como por seus emissores de CA subordinados. A lista também pode incluir outras restrições a critério da Apple. Essas informações são consultadas sempre que uma função de API de rede é usada para fazer uma conexão segura. Se houver muitos certificados revogados de uma CA para listar individualmente, uma avaliação de confiança pode exigir uma resposta de status de certificado online (OCSP) e, se a resposta não estiver disponível, a avaliação de confiança falhará."

Quando o ATS não se aplica?

  • Ao usar APIs de nível inferior: O ATS aplica-se apenas ao URL Loading System, incluindo URLSession e APIs construídas sobre eles. Não se aplica a aplicativos que usam APIs de nível inferior (como BSD Sockets), incluindo aqueles que implementam TLS sobre essas APIs de nível inferior (consulte a seção "Using ATS in Apple Frameworks" da Documentação de Desenvolvedor da Apple arquivada).

  • Ao conectar-se a endereços IP, nomes de domínio não qualificados ou hosts locais: O ATS aplica-se apenas a conexões feitas para nomes de host públicos (consulte a seção "Availability of ATS for Remote and Local Connections" da Documentação de Desenvolvedor da Apple arquivada). O sistema não fornece proteção ATS para conexões feitas para:

    • Endereços de protocolo de Internet (IP)
    • Nomes de host não qualificados
    • Hosts locais que empregam o domínio de nível superior (TLD) .local
  • Ao incluir exceções do ATS: Se o aplicativo usar as APIs compatíveis com ATS, ainda pode desativar o ATS para cenários específicos usando Exceções do ATS).

Saiba mais:

Exceções do ATS

As restrições do ATS podem ser desativadas configurando exceções no arquivo Info.plist sob a chave NSAppTransportSecurity. Essas exceções podem ser aplicadas para:

  • permitir conexões inseguras (HTTP),
  • reduzir a versão mínima do TLS,
  • desativar Perfect Forward Secrecy (PFS) ou
  • permitir conexões para domínios locais.

As exceções do ATS podem ser aplicadas globalmente ou por domínio. O aplicativo pode desativar o ATS globalmente, mas optar por ativá-lo para domínios individuais. A listagem a seguir da documentação da Apple Developer mostra a estrutura do dicionário NSAppTransportSecurity.

NSAppTransportSecurity : Dictionary {
    NSAllowsArbitraryLoads : Boolean
    NSAllowsArbitraryLoadsForMedia : Boolean
    NSAllowsArbitraryLoadsInWebContent : Boolean
    NSAllowsLocalNetworking : Boolean
    NSExceptionDomains : Dictionary {
        <domain-name-string> : Dictionary {
            NSIncludesSubdomains : Boolean
            NSExceptionAllowsInsecureHTTPLoads : Boolean
            NSExceptionMinimumTLSVersion : String
            NSExceptionRequiresForwardSecrecy : Boolean   // Valor padrão é YES
            NSRequiresCertificateTransparency : Boolean
        }
    }
}

Fonte: Documentação do Apple Developer.

A tabela a seguir resume as exceções globais do ATS. Para mais informações sobre essas exceções, consulte a tabela 2 na documentação oficial do Apple developer.

Chave Descrição
NSAllowsArbitraryLoads Desativa as restrições do ATS globalmente, exceto para domínios individuais especificados em NSExceptionDomains
NSAllowsArbitraryLoadsInWebContent Desativa as restrições do ATS para todas as conexões feitas a partir de visualizações da web
NSAllowsLocalNetworking Permite conexão com nomes de domínio não qualificados e domínios .local
NSAllowsArbitraryLoadsForMedia Desativa todas as restrições do ATS para mídia carregada através do framework AV Foundation

A tabela a seguir resume as exceções do ATS por domínio. Para mais informações sobre essas exceções, consulte a tabela 3 na documentação oficial do Apple developer.

Chave Descrição
NSIncludesSubdomains Indica se as exceções do ATS devem se aplicar a subdomínios do domínio nomeado
NSExceptionAllowsInsecureHTTPLoads Permite conexões HTTP para o domínio nomeado, mas não afeta os requisitos de TLS
NSExceptionMinimumTLSVersion Permite conexões com servidores com versões de TLS inferiores a 1.2
NSExceptionRequiresForwardSecrecy Desativa o perfect forward secrecy (PFS)

Justificando Exceções:

A partir de 1º de janeiro de 2017, a revisão da App Store da Apple exige justificativa se uma das seguintes exceções do ATS for definida.

  • NSAllowsArbitraryLoads
  • NSAllowsArbitraryLoadsForMedia
  • NSAllowsArbitraryLoadsInWebContent
  • NSExceptionAllowsInsecureHTTPLoads
  • NSExceptionMinimumTLSVersion

Isso deve ser cuidadosamente revisado para determinar se é de fato parte do propósito pretendido do aplicativo. A Apple alerta sobre exceções reduzindo a segurança dos aplicativos e aconselha a configurar exceções apenas quando necessário e preferir correções no servidor quando enfrentar uma falha do ATS.

Exemplo:

No exemplo a seguir, o ATS está globalmente habilitado (não há NSAllowsArbitraryLoads global definido), mas uma exceção é definida explicitamente para o domínio example.com (e seus subdomínios). Considerando que o domínio é de propriedade dos desenvolvedores do aplicativo e há uma justificativa adequada, essa exceção seria aceitável, pois mantém todos os benefícios do ATS para todos os outros domínios. No entanto, sempre seria preferível corrigir o servidor, conforme indicado acima.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
        </dict>
    </dict>
</dict>

Para mais informações sobre exceções do ATS, consulte a seção "Configure Exceptions Only When Needed; Prefer Server Fixes" do artigo "Preventing Insecure Network Connections" na Documentação do Apple Developer e a publicação de blog sobre ATS.