
최근 주요 Android 버전의 중요한 보안 개선 사항
Android 5.0 Lollipop(API 21)부터 시작하는 최근 주요 Android 버전의 주요 보안 강화 사항.
WebView는 별도의 패키지입니다. Android 5.0의 보안 강화 및 Android 5.0 Lollipop의 업데이트 가능한 WebView: 그것은 무엇이며 왜 신경 써야 하나? 참조isInsideSecureHardware). KeyInfo의 isInsideSecureHardware 메서드 참조WebView에서 JavaScript 평가가 별도의 프로세스로 실행되어 JavaScript 코드가 앱 메모리에 쉽게 접근할 수 없습니다. WebView 보안의 새로운 기능 및 모든 앱에 대한 Android 8.0 동작 변경의 보안 섹션 참조WebView는 네트워크 보안 구성 및 cleartextTrafficPermitted 플래그를 준수합니다(이전 Android 버전에서는 구성에서 _일반 텍스트 트래픽_이 허용되지 않아도 HTTP 사이트를 로드함). Android 8.0을 대상으로 하는 앱의 Android 8.0 동작 변경의 보안 섹션 참조WebView에 세이프 브라우징 API가 추가되어, 사용자가 잠재적으로 안전하지 않은 웹사이트로 이동하려고 할 때(Google 세이프 브라우징으로 확인) 경고를 받을 수 있습니다(활성화된 경우). Android 8.0 기능 및 API의 WebView API 섹션 참조FLAG_SECURE Window 플래그가 더 많이 지원되어 설정된 화면의 스크린샷을 허용하지 않습니다.cleartextTrafficPermitted를 true로 명시적으로 설정해야 합니다. API 레벨 28+ 앱의 동작 변경: 기본적으로 네트워크 TLS 활성화 섹션 및 Android: 일반 텍스트 HTTP 트래픽이 Android 9에서 허용되지 않음 참조WebView에서 파일 접근이 기본적으로 비활성화됩니다. WebSettings의 setAllowFileAccess 메서드 참조taskAffinity를 설정하여 사용자가 대상 앱을 실행하려는 의도였더라도 해당 앱의 합법적인 앱 아이콘을 사용해 속여 실행하게 하는 공격)이 더 이상 불가능합니다. StrandHogg 공격 / Task Affinity 취약점 및 Strandhogg 취약점 참조requestLegacyExternalStorage를 통해 옵트아웃할 수 있습니다. Android 11의 저장소 업데이트 및 Android 저장소 사용 사례 및 모범 사례의 프로덕션 앱 옵트아웃 섹션 참조setView로 설정)가 있는 Toast는 더 이상 백그라운드에서 실행할 수 없습니다. 이는 피해자 앱의 UI를 가려서 공격하는 특정 공격을 완화하기 위한 것입니다. 참고로 메서드 전체는 Android 11(API 30)에서 더 이상 사용되지 않습니다. 참조android:exported 플래그는 Intent Filters를 선언하는 구성 요소(Activities, Content Providers 등)의 Manifest에서 명시적으로 정의해야 하며, Android 12를 대상으로 하는 앱의 동작 변경: 더 안전한 구성 요소 내보내기 섹션을 참조하세요.requestLegacyExternalStorage를 통한 선택 해제는 더 이상 불가능합니다. Android 저장소 사용 사례 및 모범 사례: 프로덕션 앱에서 선택 해제 섹션을 참조하세요.BiometricPrompt를 사용하는 앱에 지역화된 문자열을 제공하는 API 도입POST_NOTIFICATIONS 런타임 권한이 추가되었습니다. 알림 런타임 권한 및 android.permission.POST_NOTIFICATIONS을 참조하세요.targetSdk 요구 사항 도입: Android 6(API 23)보다 오래된 Android 버전을 대상으로 하는 앱은 더 이상 설치할 수 없습니다. 즉, Android 6(API 23)에서 도입된 보안 제한(특히 이 경우 런타임 권한 처리)이 이제 기기에 설치된 모든 앱에 적용된다고 간주할 수 있습니다(이 최소값은 향후 Android 버전마다 높아질 것으로 예상됩니다). 동작 변경(모든 앱): 최소 설치 가능 target API 수준 섹션을 참조하세요.QUERY_ALL_PACKAGES 권한이 부여된 경우는 제외 — 이 권한을 얻으려면 Google Play의 특별 수동 검토가 필요합니다). 동작 변경(모든 앱): 미디어 소유자 패키지 이름이 가려질 수 있음 섹션을 참조하세요.Exception을 발생시킵니다. Android 14 이상을 대상으로 하는 앱의 동작 변경: 더 안전한 동적 코드 로딩 섹션을 참조하세요.PendingIntent 생성자는 기본적으로 백그라운드 Activity 실행을 차단합니다. Android 15 이상을 대상으로 하는 앱의 동작 변경: 기타 변경 사항 섹션을 참조하세요.PendingIntent 생성자가 백그라운드 액티비티 실행 권한을 허용하거나 발신자에게 백그라운드 액티비티 실행 권한이 없는 한 작업 스택을 포그라운드로 가져올 수 없습니다. Android 15 이상을 대상으로 하는 앱의 동작 변경: 기타 변경 사항 섹션을 참조하세요.Android 16 보안 릴리스 노트* 일반적인 Intent 리디렉션 공격에 대한 기본 보안이 추가되었으며, 다른 앱에서 수신한 Intent(예: 현재 앱을 시작하는 Intent에 extra로 래핑된 Intent)의 실행을 차단합니다. Behavior changes: all apps의 Improved security against Intent redirection attacks 섹션을 참조하세요.
companion device pairing 흐름 중에 악성 앱으로부터 사용자의 위치 정보를 보호하는 새로운 보호 기능이 추가되었습니다. Android 16 에서 실행되는 모든 컴패니언 앱은 더 이상 RESULT_DISCOVERY_TIMEOUT을 사용하여 검색 시간 초과를 직접 통보받지 않습니다. 대신 사용자에게 시각적 대화상자로 시간 초과 이벤트를 알립니다. 사용자가 대화상자를 닫으면 앱에 RESULT_USER_REJECTED로 연결 실패가 통보됩니다. Behavior changes: all apps의 Companion apps no longer notified of discovery timeouts 섹션을 참조하세요.
MediaStore#getVersion()는 이제 앱마다 고유하게 됩니다. 이로 인해 버전 문자열에서 식별 속성을 제거하여 남용 및 지문(fingerprinting) 기술 사용을 방지합니다. Behavior changes: Apps targeting Android 16 or higher의 MediaStore version lockdown 섹션 및 MediaStore의 getVersion 메서드를 참조하세요.
앱은 앱 매니페스트를 사용하여 엄격한 Intent 해석에 opt-in(선택적으로 참여)할 수 있습니다. Safer Intents(원래 Android 15의 StrictMode의 일부로 도입됨)는 Intent가 전달되려면 action이 null이 아니어야 하고 대상 앱의 Intent filter와 일치해야 함을 의미합니다. 이 두 규칙을 모두 적용하거나 Intent filter 일치만 적용하도록 선택할 수 있습니다. Behavior changes: Apps targeting Android 16 or higher의 Safer Intents 섹션 및 보다 구체적으로 Implementation 섹션을 참조하세요.
앱이 사진 및 동영상 권한을 요청할 때 선택한 미디어로 접근을 제한하도록 선택한 사용자는 사진 선택기에서 앱이 소유한 사진이 미리 선택되어 표시됩니다. 사용자는 미리 선택된 항목을 선택 해제할 수 있으며, 이렇게 하면 해당 사진 및 동영상에 대한 앱의 접근이 취소됩니다. Behavior changes: Apps targeting Android 16 or higher의 App-owned photos 섹션을 참조하세요.
KeyMint(이전 Keymaster) 버전 4.0 증명 인증서에 대한 지원이 추가되었습니다. KeyMint 4.0 인증서에는 구조에 새로운 필드가 포함되어 있으며, 이를 사용하여 로드된 APEX 모듈의 무결성을 확인할 수 있습니다. 및 을 참조하세요.
Android Contact Picker를 도입했습니다. 이는 사용자가 READ_CONTATCS 권한 없이도 앱과 연락처를 공유할 수 있는 표준화된 탐색 가능한 인터페이스입니다. Features and APIs의 Android contacts picker 섹션을 참조하세요.
크로스 프로필 루프백 트래픽을 더 이상 허용하지 않습니다. Behavior changes: all apps의 Block cross profile loopback traffic 섹션을 참조하세요.
Android Keystore에서 앱이 생성할 수 있는 키 수에 제한(Android 17을 대상으로 하는 비시스템 앱의 경우 50,000개)을 적용하여 이 공유 리소스를 보호합니다. 이 저장소는 제한적이며 앱 간에 공유되기 때문입니다. 앱이 한도를 초과하여 키를 생성하려고 하면 KeyStoreException과 함께 생성이 실패합니다. Behavior changes: all apps의 Per-app keystore limits 섹션을 참조하세요.
StrictMode에 대한 새로운 탐지 기능(이 기능은 Android 18에서 기본적으로 적용됩니다): 현재 앱이 ACTION_SEND, ACTION_SEND_MULTIPLE 또는 ACTION_IMAGE_CAPTURE 액션을 가진 URI로 Intent를 실행하면 시스템이 대상 앱에 읽기 및 쓰기 URI 권한을 자동으로 부여합니다. Android 18부터 시스템은 더 이상 이러한 권한을 자동으로 부여하지 않습니다. Behavior changes: all apps의 Restrict implicit URI grants 섹션을 참조하세요.
Android 17 이상을 대상으로 하는 앱에 대해 Certificate Transparency를 기본적으로 활성화합니다. Behavior changes: Apps targeting Android 17 or higher의 Enable CT by default 섹션을 참조하세요.
setViewFLAG_SECURE 플래그가 생체 인식 또는 기기 자격 증명(PIN, 패턴 또는 비밀번호) 프롬프트에 추가되었으며, 기기 잠금 해제와 앱 내 BiometricPrompt 모두에 적용됩니다. 즉, 이러한 화면의 스크린샷을 찍을 수 없으며 화면 공유에서도 검게 표시됩니다. Android Code Search의 com.android.systemui.biometrics.AuthContainerView 소스를 참조하세요.apksigner를 사용하는 모든 새로운 키 교체는 Android 13 이상을 대상으로 하는 교체를 위해 기본적으로 v3.1 서명 체계를 사용합니다.nullPendingIntent의 생성자는 _포함 인텐트의 발신자_로 간주되며, _보류 중인 인텐트의 발신자_로 간주되지 않습니다. Android 15 이상을 대상으로 하는 앱의 동작 변경: 더 안전한 인텐트 섹션을 참조하세요.BiometricPrompt의 동작에도 변화가 생깁니다. 생체 인식 실패 후 기기 자격 증명으로 "폴백"하여 사용자 인증을 완료할 수 없습니다. 사용자는 해당 인증 수단이 허용되는 경우 프롬프트의 버튼을 통해 선택적으로 기기 자격 증명을 여전히 사용할 수 있습니다(이미 너무 많이 실패하지 않은 경우). 기기가 잠기면 프롬프트가 취소되며, 인증에 성공하려면 기기 잠금 해제 후 새 프롬프트를 트리거해야 합니다. Android 15, 도둑이 잠금 해제된 휴대폰을 훔쳐도 은행 계좌를 비우지 못하도록 보장을 참조하세요.KeyDescriptionmoduleHash기본적으로 비활성화되어 있지만 Android 17에서 활성화될 Certificate Transparency에 선택적으로 참여(opt in)할 수 있습니다. Network security configuration의 Opt out of certificate transparency 섹션을 참조하세요.