일반적인 보안 허점으로부터 iOS 앱을 보호하세요.
앱이 알 수 없는 실행 환경에서 실행되고 알 수 없는 전송 네트워크를 통해 데이터를 교환한다면 사용자 뿐만 아니라 앱의 중요 데이터를 보호할 수 있도록 항상 보안을 최우선 우선순위로 유지하는 것이 중요합니다.
앱을 보호하는 데 필요한 악의적인 공격과 관심을 기울여야 할 영역을 꼽자면 아마 끝이 없을 것입니다. iOS 앱의 보안을 점검할 때는 다음과 같은 체크리스트를 검토해봐야 합니다.
정적 코드 분석
-
NSLog를 사용합니까?
-
NSLog를 사용한다면, NSLog를 디버그 빌드에만 사용합니다
-
모든 URL은 HTTPS입니다
-
로컬 파일에 대한 경로가 하드코딩돼 있지 않습니다
-
의존성이 최신 버전 및 패치입니다
-
비공개 API는 사용되지 않습니다
-
비공개 키 또는 비밀스러운 내용이 코드에 포함돼 있지 않습니다
-
비공개 키 또는 비밀스러운 내용이 자원에 포함돼 있지 않습니다
-
도달할 수 없거나 사용되지 않는 코드가 없습니다
-
권한이 올바르게 설정돼 있습니다(누락된 권한이나 불필요하게 추가된 권한이 없음)
-
connection:willSendRequestForAuthenticationChallenge: 메서드를 사용할 경우 useCredential:forAuthenticationChallenge:를 사용하는 직접적인 브랜치(아무 코드도 없는)가 없습니다
-
앱에서 IDFV를 사용합니다
-
앱에서 IDFA를 사용합니다
-
올바른 프로비저닝 프로파일/인증서가 앱 서명에 설정돼 있습니다
-
SQL 인젝션을 검사합니다
런타임 분석 - 로그
-
로깅이 파일에만 이뤄집니다
-
로그 파일이 주기적으로 삭제됩니다
-
로그 로테이션이 구현돼 있습니다
-
로그에 비밀스러운 내용이나 민감한 정보가 없습니다
-
스택 트레이스가 출력될 때 민감한 정보가 로깅되지 않습니다 [1]
런타임 분석 - 네트워크
-
HTTPS URL만 사용됩니다
-
서버가 CRIME 공격에 대비해 구현돼 있습니다
-
서버 및 클라이언트 앱이 BREACH 공격에 대비해 구현돼 있습니다
-
클라이언트 앱에서 인증서 피닝(certificate pinning)을 사용합니다
-
올바른 캐싱 정책이 수립돼 있습니다
런타임 분석 - 인증
-
앱에서 타사 인증을 사용합니다
-
앱에서 별도의 인증 수단을 사용합니다
-
타사 인증 SDK가 이 체크리스트의 나머지 부분에 대해 잘 감사받고 있습니다
-
로그인 UI에서 비밀번호를 마스킹합니다.
-
비밀번호를 복사할 수 없게 돼 있습니다
-
접근 토큰이 키체인에 저장됩니다
-
앱에서 패스코드를 구현합니다
-
암호가 키체인에 저장됩니다
-
서버 설정을 통해 인증 워크플로우를 변경하는 것이 가능합니다 [2]
런타임 분석 - 로컬 스토리지
-
앱에서 로컬 스토리지를 사용합니다
-
모든 민감한 정보는 암호화됩니다
-
저장소가 주기적으로 정리됩니다
런타임 분석 - 데이터 공유
-
앱에서 공유 키 저장소를 이용해 공통 설정을 보관합니다
-
딥 링크 URL의 유효성을 검사합니다
-
모든 인입 데이터의 유효성을 검사합니다
-
민감한 데이터를 알 수 없는 앱과 공유하지 않습니다
-
앱 확장 기능을 사용할 경우 올바른 그룹 ID가 설정됩니다
이 체크리스트는 보안 업무에서 얻은 경험과 다음과 같은 참고자료를 토대로 만들어졌습니다.
-
iOS 보안(애플)
-
OWASP 보안 보안 프로젝트 - 보안 점검 가이드
-
OWASP iOS 애플리케이션 보안 점검 체트시트
-
OWASP iOS 개발자 치트시트
-
스택오버플로우, “iOS 6용 보안 분석 도구”
-
아이폰 애플리케이션의 침투 테스트: 1부, 2부
본 체크리스트를 따른다면 널리 알려진 보안 취약점을 예방할 수 있으며, 최소한 앱과 서버, 그리고 앱과 서버 사이에 위치한 계층에 대해 잘 정의된 보안 기준을 마련할 수 있을 것입니다.
[1] 예외 처리 또는 그 밖의 경우
[2] 로그인 프로세스가 침해될 경우 인증 흐름을 변경하는 것이 가능합니다. 예를 들어, 2FA를 수행하거나 CAPTCHA을 추가하거나, 또는 극단적인 경우 네이티브 로그인 UI에서 웹 로그인으로 전환할 수도 있습니다.
가우라브 바이쉬(Gaurav Vaish)
가우라브는 12살 때 GW-BASIC에 입문한 이후로 GW-BASIC의 단순함에 매료됐다. 그 이후로 20년 넘게 대부분의 언어로, 널리 사용되는 모든 운영체제와 기기에서 프로그래밍해오고 있다. 그는 야후! 본사에서 모바일 및 신제품(MEP) 그룹에서 일하고 있으며, 좀 더 구체적으로 설명하자면 야후! 모바일 앱과 통합되고 다양한 기기에서 실행되며, 수억명의 사용자가 사용하는, 최적화되고 재사용 가능한 솔루션을 개발하는 것을 목표로 하는 모바일 SDK 팀에서 일하고 있다.
***
원문 : Security checklist for high-performance iOS apps
번역 : 이대엽