상세 컨텐츠

본문 제목

안드로이드 7.0 누가(Nougat)의 보안기능 소개

국내외 보안동향

by 알약(Alyac) 2016. 9. 20. 13:47

본문

안드로이드 누가(Nougat)의 보안기능 소개

Keeping Android safe: Security enhancements in Nougat


DirectBoot Mode


Android N 이전의 안드로이드 OS에서는 사용자가 암호화 보호기능을 활성화시키면 디바이스가 부팅되는 과정에서 비밀번호(패턴 혹은 문자열)를 입력해야 했습니다. 


디바이스 부팅이 성공하면, 디바이스 중에 저장되어있던 DB 역시 복호화가 완료됩니다. Android 7.0 누가(Nougat)는 이러한 암호화 매커니즘을 업데이트하였으며, 디바이스 부팅 시간을 줄여 부팅속도를 향상시켰습니다. 현재 휴대폰에 탑재된 전화 앱이나 알람 앱등은 사용자가 비밀번호를 입력하기 전에 이미 부팅이 완료될 수 있습니다. 


이런 모드에서는 시스템이 정상적으로 동작되었지만, 여전히 몇몇 특정 정보들에 대한 접근을 제한할 수 있습니다. 이는 사용자가 부팅 후 비밀번호를 입력하지 않은 상황에서 정상적으로 전화를 받거나, 알람앱이 울릴 수 있다는 의미입니다. 이런 모드를 "DirectBoot Mode"라고 부릅니다. 


만약 개발자가 개발한 앱이 사용자가 휴대폰 암호를 풀기 전에 동작하고 싶게 만들고 싶다면, AndroidManifest.xml 파일 중 명시된 정보를 보고, "DirectBoot Mode"를 적용할 app그룹을 추가합니다. 


<activity|provider|receiver|service ...  

android:directBootAware=”true”>


개발한 앱이 DirectBoot Mode에서 동작할 때에는 다음과 같이 새로 추가된 broadcast를 사용해야 합니다. 


Intent.ACTION_LOCKED_BOOT_COMPLETED


여기서 주의해야할 점은, 사용자가 기기 암호를 해제한 직후 모든 app들은 여전히 다음 broadcast를 받을 수 있다는 것입니다. 


Intent.ACTION_BOOT_COMPLETED



이번에 구글이 채택한 암호화 매커니즘은 시스템 저장공간과 사용자 설정공간을 분리해서 암호화하는 것입니다. 이것과 디바이스의 모든 데이터를 한번에 암호화 하는 풀 디스크 암호화와는 차이가 있습니다. 


파일에 기반한 암호화 매커니즘은 더 세세한 암호를 통해 사용자 데이터를 안전하게 보호하며, 암호화된 파일들의 독립성을 향상시켜 줍니다. 사용자 디바이스 중의 파일들은 모두 유일한 암호화 키를 갖고 있으며, 이 파일들을 복호화 할 때에는 사용자의 디바이스 비밀번호가 필요합니다. 


이 밖에도, 최근 안드로이드는 다양한 방법으로 보안을 강화해 왔습니다. Marshmallow(Android 6.0)부터 암호화 기능은 이미 안드로이드에 필수적인 기능이 되었습니다. 또한 Nexus5X 와 6P 처럼 단독 비밀키를 사용하게 하였으며, 이러한 암호화 키에는 신뢰할 수 있는 하드웨어(예를들어 ARMTrustZone 등)만 접근이 가능합니다.


Nougat(Android 7.0)부터는 모든 디바이스들이 반드시 암호화 키를 저장하는 하드웨어와 호환되어야 합니다. 또한 이러한 암호화 키가 사용되기 전 사용자가 암호를 해제할 경우, 임의로 이 보안 매커니즘을 해제할 수 없도록 보호 프로세스가 동작합니다. 이를 통해 사용자의 모든 데이터는 특정한 디바이스 상에서 사용자에 의해서만 복호화 될 수 있도록 했습니다.



미디어 스택 및 플랫폼의 강화


안드로이드 7.0 누가(Nougat)에서는 mediaserver의 전체 프레임워크를 새로 설계하였으며, MediaStack의 보안성을 향상시켰습니다. 


첫번째로 Clang의 undefinedBehaviorSanitizer의 일부인 정수 오버 플로우를 제거하는 것을 포함하여, 지금까지 발견된 libstagefright 버그들로 이루어진 이 종류의 취약점 전체를 모두 예방하였습니다. 또한 정수오버플로우가 탐지되면 프로세스를 셧다운시켜 공격이 멈추도록 했습니다. 


두번째로 미디어 스택을 모듈화 하여 서로 다른 컴포넌트들을 각각의 샌드박스에 넣고, 각 샌드박스의 권한은 꼭 필요한 최소한의 권한만을 가지도록 했습니다. 이러한 에방기법으로 스택의 많은 부분이 공격을 받았을 경우에도 공격자가 얻을 수 있는 권한을 최소화 시킬 수 있습니다. 이 밖에도 플랫폼을 위해 여러 보호장치를 추가하였습니다. 


- Verified Boot : 해킹된 기기들이 부팅이 되는 것을 막기 위해 Verified Boot가 엄격히 실시되도록 하였으며, Error correction도 지원합니다. 


- SELinux : SELinux이 설정을 업데이트하고 Seccomp의 범위를 더욱 넓혀 어플리케이션 샌드박스를 잠그고, 공격에 노출된 부분을 감소시킵니다. 


- 커널 강화 : 새로운 메모리 보호기능이 추가되었습니다. 커널 메모리의 일부분을 읽기 전용으로 표시하여, 커널이 유저 영역의 주소에 접근하는 것을 제한하고 공격에 노출된 부분을 감소시켰습니다. 


- APK 서명 scheme v2 : 인증속도를 개선하고, 인증서의 보증을 강화할 수 있는 전체 파일 서명 scheme를 진행했습니다. 



앱 보안의 향상


안드로이드 7.0 누가(Nougat)는 현존하는 안드로이드 시스템 중 가장 안전한 시스템이며, 개발이 가장 쉬운 시스템입니다. 


1. 만약 어떠한 앱이 또 다른 앱의 데이터를 공유하고 싶다면 반드시 FileProvider와 같은 콘텐츠 제공자를 통해 파일을 공유해야 합니다. 앱 자신의 디렉토리(일반적으로 /data/data/)의 Linux권한이 "0700"으로 설정됩니다(APILevel 24이상).


2. 앱이 보안네트워크 트래픽에 대해 접근하는 것을 제한하기 위해서, 사용자가 설치해 놓은 인증기관과 그들이  Device Admin APIs를 통해 설치되는 앱들에 대한 제어를 할 수 있도록 합니다. 또한 API Level 24+ 이상인 앱들에 대해서는 더이상 기본적으로 신뢰하지 않습니다. 모든 안드로이드 디바이스들은 반드시 동일한 CA store를 탑재해야 합니다. 


3. 디바이스의 네트워크 보안설정을 통하여, 개발자들은 간편하게 네트워크 보안 설정을 할 수 있습니다. 



시스템 업데이트


OTA업데이트 시스템을 강화시켰습니다. JIT 컴파일러를 최적화시켜 OTA의 설치시간을 빠르게 만들었으며, 보안 업데이트를 위한 OTA의 사이즈를 줄였습니다. 




출처 :

https://security.googleblog.com/2016/09/keeping-android-safe-security.html

관련글 더보기

댓글 영역