본문으로 바로가기

가. ATS 보안 설정 이란?

1. ATS(App Transport Security) 정의

- 애플리케이션과 웹 서비스 사이의 통신 시 보안 향상을 위한 기능으로 iOS 9.0부터 적용 가능하다.

- 모든 인터넷 통신 시 안전한 프로토콜을 사용하도록 보장하는 것으로, *스니핑과 같은 공격으로 부터 중요정보가 유출되는 것을 방지한다.

* 스니핑(Sniffing) : 네트워크 상에서 자신이 아닌 다른 상대방들의 패킷 교환을 엿듣는 것을 의미

- 즉, HTTP 통신을 허용하지 않거나, 버전이 낮은 취약한 TLS를 사용하여 HTTPS 통신을 하지 못하게 하는 등의 역할을 한다. 

 

2. ATS 기본 구성

- ATS는 3개의 딕셔너리(Dictionary)와 9개의 하위 키(Key)로 이루어져있다.

NSAppTransportSecurity : Dictionary {
    NSAllowsArbitraryLoads : Boolean
    NSAllowsArbitraryLoadsForMedia : Boolean
    NSAllowsArbitraryLoadsInWebContent : Boolean
    NSAllowsLocalNetworking : Boolean
    NSExceptionDomains : Dictionary {
        <domain-name-string> : Dictionary {
            NSIncludesSubdomains : Boolean
            NSExceptionAllowsInsecureHTTPLoads : Boolean
            NSExceptionMinimumTLSVersion : String
            NSExceptionRequiresForwardSecrecy : Boolean   // Default value is YES
            NSRequiresCertificateTransparency : Boolean
        }
    }
}

 

- 각 딕셔너리(Dictionary)에 대한 설명은 아래와 같다.

Dictionary 설명
NSAppTransportSecurity 앱의 전반적인 네트워크 연결에 대한 ATS 보호를 구성하거나, 명명된 도메인에 대한 사용자 지정 구성을 할 수 있다.
NSExceptionDomains 도메인 별로 ATS를 구성할 수 있으며, NSAppTransportSecurity Dictionary에서 설정한 전역 설정값과 관계없이 모든 ATS 보호를 받게 된다.
<domain-name-string> 연결 구성을 지정하려는 도메인을 식별하는 곳으로, NSExceptionDomains Dictionary에 도메인 이름을 원하는 만큼 지정할 수 있다. 하위키 중 하나 이상을 포함하도록 각 Dictionary을 구성하여야 한다.

 

- NSAppTransportSecurity 딕셔너리의 하위 키는 아래와 같다.

- 아래의 키를 사용할 경우 App Store 심사 시, 왜 사용하여야 하는지 근거자료를 제출하여야 한다.

Key 설명
NSAllowsArbitraryLoads YES로 설정할 경우, NSExceptionDomains을 통해 개별적으로 구성하는 도메인에 대한 연결을 제외하고 모든 네트워크 연결에 대한 ATS 제한이 비활성화된다. (기본값 NO)
NSAllowsArbitraryLoadsForMedia YES로 설정할 경우, AV Foundation 프레임워크를 사용하여 앱이 로드하는 미디어에 대한 모든 ATS 제한이 비활성화됩니다. (기본값 NO)
NSAllowsArbitraryLoadsInWebContent YES로 설정할 경우, 웹 보기에서 이루어진 요청에 대한 모든 ATS 제한이 비활성화된다. (기본값 NO)
NSAllowsLocalNetworking YES로 설정할 경우, 앱의 나머지 부분에 대해 ATS를 비활성화하지 않고도 로컬 리소스를 로드할 수 있음. (기본값 NO)

 

- <domain-name-string> 딕셔너리 하위 키는 아래와 같다.

- 아래의 키를 사용할 경우 App Store 심사 시, 왜 사용하여야 하는지 근거자료를 제출하여야 한다.

Key 내용
NSIncludesSubdomains YES로 설정할 경우, 명명된 도메인의 ATS 구성을 모든 하위 도메인에 적용한다. (기본값 NO)
NSExceptionAllowsInsecureHTTPLoads YES로 설정할 경우, 명명된 도메인에 대해 안전하지 않은 HTTP 로드를 허용하지만 TLS(Transport Layer Security) 요구 사항을 변경하지 않으며 명명된 도메인에 대한 HTTPS 로드에 영향을 주지 않음. (기본값 NO)
NSExceptionMinimumTLSVersion 명명된 도메인의 네트워크 연결을 위한 최소 TLS 버전을 지정하여 덜 안전한 이전 버전의 Transport Layer Security를 ​​사용한 연결을 허용한다.
NSExceptionRequiresForwardSecrecy NO로 설정할 경우, 명명된 도메인에 대해 PFS(Perfect Forward Secrecy)를 지원하지 않는 TLS 암호화를 허용한다. (기본값 YES)
NSRequiresCertificateTransparency YES로 설정할 경우, 명명된 도메인에 대한 서버 인증서에 대해 유효하고 서명된 투명한 인증서의 타임스탬프가 필요하다. (기본값 NO)

 

나. 잘못된 보안설정으로 인한 ATS 취약점

- ATS를 잘못 설정할 경우 HTTP 통신이 허용되어 중요 정보가 평문으로 통신될 수 있음.

- 낮은 TLS 버전을 사용하도록 설정되어 취약점을 이용한 공격이 이루어질 수 있음.

 

예시) 아래와 같이 설정되어 있을경우 HTTP를 허용하는 방식이므로 매우 위험하다.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

 

다. 대응 방법

- HTTP 프로토콜로 전송되는 모든 데이터를 암호화하거나 HTTPS를 사용하여 암호화 통신을 한다.

- HTTPS를 사용하도록 설정해도 애플리케이션의 설정이 잘못되어 있을 경우, 예기치 못한 HTTP 통신으로 인해 중요 데이터가 유출될 수 있으므로 아래의 두 가지 방법을 통해 HTTP 통신을 사전에 차단하여야 한다.

 

1. 전체 HTTP 통신 차단.

- 애플리케이션이 HTTP 통신을 사용하지 않을 경우 아래와 같이 설정을 변경한다.

※ NSTemporaryExceptionAllowsInsecureHTTPLoads : HTTP 통신을 허용하지 않음.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
    <true/>
</dict>

 

2. 특정 도메인만 HTTP 통신 허용

- 애플리케이션이 HTTP 통신을 사용해야 할 경우, 전체 허용이 아닌 특정 도메인만 통신을 허용하도록 아래와 같이 설정을 변경한다.

※ Exception Domain : 특정 도메인만 HTTP 통신을 허용.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

 

라. DVIA-v2 앱을 통한 실습

애플리케이션이 HTTP 통신을 허용하고 있는지 확인하기 위해 아래의 과정을 수행한다.

 

/var/containers/Bundle/Application/$uuid/DVIA-v2.app

위 경로로 이동하여 info.plist 파일을 더블클릭한 다음 NSAppTransportSecurity 키가 있는 위치로 이동한다.

※ NSAppTransportSecurity : HTTP 연결의 보안 설정에 대한 내용을 볼 수 있는 키.

 

보안에 취약한 NSAllowsArbitraryLoads 키를 사용 중인 것으로 확인됨. 

※ NSAllowsArbitraryLoads : HTTP 통신을 허용하는 키, HTTP는 평문 통신이기 때문에 위험함.

 

HTTP 통신이 되는지 확인하기 위해 DVIA-v2 애플리케이션을 실행.

 

디바이스와 PC의 버프슈트(BurpSuite)를 연결.

※ 디바이스와 PC의 BurpSuite를 연결하는 방법은 아래의 글을 참고하길 바람.

2023.02.13 - [Mobile App 취약점 진단/iOS App 진단] - 아이폰 버프슈트 프록시 연결 및 인증서 설치 방법

 

아이폰 버프슈트 프록시 연결 및 인증서 설치 방법

아이폰과 PC의 프록시(Proxy)를 연결하기 위해서는 네트워크 환경 구성부터, 프록시 설정, SSL 인증서 설치까지 많은 과정이 따른다. 좀 복잡하지만 아래의 방법을 따라하여 성공적으로 환경을 구

hagsig.tistory.com

 

메인메뉴 좌측 상단 메뉴 클릭 > Network Layer Security 클릭 > 값 입력 후 SEND OVER HTTP 클릭 > PC의 버프슈트에 HTTP 패킷이 잡히는것을 확인.

 

본문 상단에 적힌 대응방법 중 모든 HTTP 차단 적용 > 애플리케이션 재시작 >

Network Layer Security 클릭 > 값 입력 후 SEND OVER HTTP 클릭 > PC의 버프슈트에 HTTP 패킷이 잡히는 않는 것을 확인. 

 

마. 참고 URL

- 애플 공식 ATS 설정 가이드 문서

https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW59

 

Cocoa Keys

Cocoa Keys Cocoa and Cocoa Touch are the environments used to define apps that run in macOS, iOS, tvOS, and watchOS. The keys associated with the Cocoa environments provide support for Interface Builder nib files and provide support for other user-facing f

developer.apple.com