가. 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 진단] - 아이폰 버프슈트 프록시 연결 및 인증서 설치 방법
메인메뉴 좌측 상단 메뉴 클릭 > Network Layer Security 클릭 > 값 입력 후 SEND OVER HTTP 클릭 > PC의 버프슈트에 HTTP 패킷이 잡히는것을 확인.
본문 상단에 적힌 대응방법 중 모든 HTTP 차단 적용 > 애플리케이션 재시작 >
Network Layer Security 클릭 > 값 입력 후 SEND OVER HTTP 클릭 > PC의 버프슈트에 HTTP 패킷이 잡히는 않는 것을 확인.
마. 참고 URL
- 애플 공식 ATS 설정 가이드 문서
'Mobile App 취약점 진단 · 모의해킹 > iOS App 취약점 진단 · 모의해킹' 카테고리의 다른 글
페어플레이 DRM 복호화 방법 - Frida-iOS-Dump (0) | 2023.02.26 |
---|---|
페어플레이 DRM 복호화 방법 - CRACKERXI+ (0) | 2023.02.26 |
[iOS 취약점 진단] 09강 - 중요정보 메모리 저장(메모리 덤프) (0) | 2023.02.22 |
아이폰 버프슈트 프록시 연결 및 인증서 설치 방법 (0) | 2023.02.13 |
[iOS 취약점 진단] 08강 - SSL 인증서 고정 우회(SSL Certificate Pinning) (0) | 2023.02.12 |