
CVE-2026-0023을 시연하는 재현 가능한 Android 실험실 환경입니다. PackageInstaller에서 Update Ownership 신뢰 우회 취약점을 보여줍니다. 취약한 동작을 관찰하고 패치를 이해할 수 있는 세 개의 앱이 포함되어 있습니다.
CVE-2026-0023을 재현하고 연구하기 위한 완전한 Android 실험실 환경입니다.
이 저장소는 CVE-2026-0023이 일반 설치자가 시스템만 제어해야 하는 내부 Android 설치 플래그에 영향을 미칠 수 있게 하여, 앱 업데이트 중 Android의 업데이트 소유권 경고가 억제되는 방식을 보여줍니다.
이 프로젝트는 현실적인 업데이트 소유권 워크플로를 모델링하고 취약한 동작을 관찰할 수 있는 재현 가능한 환경을 제공하는 세 가지 Android 애플리케이션을 포함합니다.
Android는 앱, 앱 스토어 및 엔터프라이즈 환경이 신뢰할 수 있는 업데이트 체인을 유지할 수 있도록 업데이트 소유권을 도입했습니다.
앱에 등록된 업데이트 소유자가 있는 경우, 다른 설치자가 해당 앱을 업데이트하려고 하면 Android가 사용자에게 경고합니다.
정상적인 조건에서 이 경고는 사용자에게 앱이 일반적으로 다른 소스에서 업데이트를 수신한다는 것을 알립니다.
CVE-2026-0023은 PackageInstallerService#createSessionInternal 내부의 Android 패키지 설치 흐름에 영향을 미칩니다.
이 문제는 내부 INSTALL_FROM_MANAGED_USER_OR_PROFILE 설치 플래그의 처리와 관련이 있습니다.
취약한 빌드에서는 Android가 설치가 실제로 관리 사용자 또는 관리 프로필과 연결되었는지 확인하기 전에 이 플래그가 명시적으로 지워지지 않았습니다.
결과적으로 일반 설치자가 업데이트 소유권 동작에 영향을 미치고 Android가 예상된 업데이트 소유권 경고를 억제하도록 할 수 있었습니다.
이 저장소는 통제된 개념 증명 환경을 사용하여 예상 동작과 취약한 동작의 차이를 보여줍니다.
| 예상 동작 | 취약한 동작 |
|---|---|
| Android가 업데이트 소유권 경고를 표시합니다. | Android가 일반 업데이트 대화상자만 표시합니다. |
![]() | ![]() |
CVE-2026-0023은 2026년 3월 Android 보안 게시판의 2026-03-01 보안 패치 수준 취약점 세부 정보에 나열되어 있습니다.
2026-03-01 이상의 Android 보안 패치 수준은 2026-03-01 보안 패치 수준과 관련된 모든 문제를 해결합니다.
2026-03-05 이상의 Android 보안 패치 수준은 2026-03-05 보안 패치 수준 및 이전 모든 패치 수준과 관련된 모든 문제를 해결합니다.
취약한 동작은 내부 INSTALL_FROM_MANAGED_USER_OR_PROFILE 플래그의 처리와 관련이 있습니다.
이 플래그는 관리 사용자 또는 관리 프로필과 관련된 설치 동작을 나타내기 위한 것입니다.
공식 AOSP 패치는 Android가 설치가 실제로 조직 관리 사용자에 속하는지 확인하기 전에 이 플래그를 명시적으로 지웁니다.
수정된 로직은 DevicePolicyManagerInternal#isUserOrganizationManaged(userId)의 결과에 따라 시스템만 이 플래그를 설정할 수 있도록 보장합니다.
단순화된 패치 로직:
final var dpmi = LocalServices.getService(DevicePolicyManagerInternal.class);
+ // Only the system should be able to set this flag - so ensure it is unset when not needed.
+ params.installFlags &= ~PackageManager.INSTALL_FROM_MANAGED_USER_OR_PROFILE;
if (dpmi != null && dpmi.isUserOrganizationManaged(userId)) {
params.installFlags |= PackageManager.INSTALL_FROM_MANAGED_USER_OR_PROFILE;
}
패치 전에는 이 관리 프로필 확인 전에 플래그가 명시적으로 지워지지 않았습니다.
패치 후, Android는 먼저 플래그를 제거하고 시스템이 사용자가 실제로 조직 관리 대상이라고 판단하는 경우에만 다시 설정합니다.
이를 통해 일반 설치자가 이 내부 설치 세션 상태에 영향을 미치는 것을 방지합니다.
이 저장소는 세 가지 Android 애플리케이션을 포함합니다:
CVE-2026-0023-Update-Ownership-PoC
├── Safe Mart
├── Unsafe Mart
└── Ownership Inspector
Safe Mart는 참조 설치자 애플리케이션입니다.
대상 애플리케이션을 설치하고 초기 설치 중에 업데이트 소유권을 요청합니다.
그 목적은 대상 앱의 등록된 업데이트 소유자가 되는 합법적인 앱 스토어를 시뮬레이션하는 것입니다.
Unsafe Mart는 CVE-2026-0023을 재현하는 데 사용되는 두 번째 설치자 애플리케이션입니다.
두 가지 설치 경로를 지원합니다:
일반 경로는 Android의 예상 업데이트 소유권 경고를 트리거합니다.
CVE 경로는 소유권 경고를 억제하고 Android가 대신 일반 업데이트 확인 대화상자를 표시하도록 합니다.
Ownership Inspector는 데모에 사용되는 대상 애플리케이션입니다.
애플리케이션은 업데이트 소유권 지원을 선언하고 Android의 PackageManager가 보고하는 설치자 관련 메타데이터를 표시합니다.
그 목적은 개념 증명의 각 단계에서 대상 애플리케이션이 어떻게 설치 또는 업데이트되었는지 더 쉽게 관찰할 수 있도록 하는 것입니다.
| CVE-2026-0023 이전 | CVE-2026-0023 이후 |
![]() | ![]() |
개념 증명은 두 가지 다른 업데이트 흐름을 보여줍니다:
flowchart LR
A["Safe Mart<br/>Reference installer"] -->|"Installs target app<br/>+ requests update ownership"| B["Ownership Inspector<br/>Target app"]
C["Unsafe Mart<br/>Alternative installer"] --> D{"Update path"}
D -->|"Normal update path"| E["Android displays<br/>Update Ownership warning"]
D -->|"CVE-2026-0023 path"| F["Android displays only<br/>generic update dialog"]
E --> G["User is warned:<br/>Safe Mart is the update owner"]
F --> H["Ownership warning<br/>is suppressed"]
테스트 장치에 두 설치자 애플리케이션을 모두 설치합니다.
Android가 이 권한을 요청하면 두 애플리케이션 모두 알 수 없는 앱 설치를 허용합니다.
Safe Mart를 열고 Ownership Inspector APK를 선택합니다.
Safe Mart가 대상 애플리케이션을 설치하고 초기 설치 세션 중에 업데이트 소유권을 요청합니다.
이 시점에서 Safe Mart는 참조 설치자 역할을 하며 대상 앱의 예상 업데이트 소스가 됩니다.
Ownership Inspector를 엽니다.
애플리케이션은 Android의 PackageManager가 보고하는 설치자 관련 메타데이터를 표시합니다.
이 단계는 Unsafe Mart에서 업데이트를 시도하기 전에 초기 설치 상태를 확인하는 데 도움이 됩니다.
Unsafe Mart를 열고 Ownership Inspector APK를 선택합니다.
일반 업데이트 경로를 선택합니다.
Ownership Inspector가 원래 업데이트 소유권이 활성화된 상태로 Safe Mart를 통해 설치되었기 때문에 Android가 업데이트 소유권 경고를 표시합니다.
이것이 예상되는 Android 동작입니다.
경고는 사용자에게 애플리케이션이 일반적으로 Safe Mart에서 업데이트를 수신하지만 현재 업데이트 시도는 Unsafe Mart에서 오고 있음을 알립니다.
Unsafe Mart로 돌아가서 Ownership Inspector APK를 다시 선택합니다.
CVE-2026-0023 재현 경로를 선택합니다.
이 흐름에서 Android는 더 이상 업데이트 소유권 경고를 표시하지 않습니다.
대신 시스템은 일반 업데이트 확인 대화상자만 표시합니다.
이것이 개념 증명이 보여주는 취약한 동작입니다.
중요한 차이점은 대화상자의 시각적 변화만이 아닙니다.
등록된 업데이트 소유자에 대한 보안 신호가 업데이트 흐름에서 제거됩니다.
업데이트가 완료되면 Ownership Inspector를 다시 엽니다.
애플리케이션은 CVE-2026-0023 재현 경로가 완료된 후 설치자 관련 메타데이터를 관찰하는 데 사용할 수 있습니다.
이 개념 증명은 업데이트 소유권 신뢰 모델 우회를 보여줍니다.
보다 구체적으로, 다음을 보여줍니다:
PoC는 루트 액세스, 임의 코드 실행, 지속성, 은닉 또는 맬웨어와 유사한 동작을 제공하려고 시도하지 않습니다.
취약점은 Android 15에서 재현되었습니다.
개념 증명에는 다음이 필요하지 않습니다:
전체 데모는 표준 Android 애플리케이션 샌드박스에서 실행되는 일반 Android 애플리케이션을 통해 수행됩니다.
테스트된 장치 보안 정보는 애플리케이션 로그에서 관찰할 수 있습니다.
PoC가 수집한 예제 값은 다음과 같습니다:
Build.VERSION.SECURITY_PATCH
Build.VERSION.SDK_INT
Build.VERSION.RELEASE
Build.VERSION.INCREMENTAL
Build.FINGERPRINT
프로젝트를 빌드하고 실행하려면 다음이 필요합니다:
특별한 장치 수정이 필요하지 않습니다.
각 애플리케이션 프로젝트를 Android Studio에서 열고 디버그 APK를 빌드합니다:
그런 다음 테스트 장치에 Safe Mart 및 Unsafe Mart를 설치합니다.
Ownership Inspector는 재현 흐름 중에 Safe Mart를 통해 설치되어야 합니다.
PoC는 Android의 PackageInstaller API와 상호 작용하고 설치 세션 매개변수를 변경하여 취약한 동작을 재현합니다.
CVE 재현 경로 동안 PoC는 관리 사용자 또는 프로필 설치 동작과 관련된 시스템 플래그를 사용합니다:
INSTALL_FROM_MANAGED_USER_OR_PROFILE
취약점은 숨겨진 API 액세스 자체로 인해 발생하지 않습니다.
숨겨진 API 액세스는 일반 애플리케이션 컨텍스트에서 필요한 프레임워크 인터페이스에 도달하기 위한 구현 세부 사항으로만 사용됩니다.
중요한 보안 경계는 이 설치 플래그가 시스템이 관리 사용자 또는 관리 프로필 상태를 검증한 후에 설정된 경우에만 신뢰되어야 한다는 것입니다.
이 프로젝트는 개념 증명에 필요한 비 SDK Android 프레임워크 인터페이스에 액세스하기 위해 ChickenHook의 RestrictionBypass 라이브러리를 사용합니다.
숨겨진 API 액세스 메커니즘은 CVE-2026-0023의 근본 원인과 관련이 없으며 필요한 PackageInstaller API와 상호 작용하는 데만 사용됩니다.
RestrictionBypass: https://github.com/ChickenHook/RestrictionBypass
원저자들의 작업에 감사드립니다.
Google은 CVE-2026-0023을 높은 심각도의 권한 상승 취약점으로 분류했습니다.
이 문제는 루트 액세스나 임의 코드 실행을 제공하지 않습니다.
그러나 권한이 없는 설치자가 일반적으로 Android의 패키지 설치 보안 모델로 보호되어야 하는 작업을 수행할 수 있도록 허용합니다.
가장 관련성이 높은 영향은 기업 및 관리 장치 배포 시나리오에 있을 가능성이 높습니다.
조직은 애플리케이션이 승인된 앱 스토어 또는 엔터프라이즈 설치자를 통해 업데이트되도록 하기 위해 업데이트 소유권에 의존할 수 있습니다.
소유권 경고를 억제함으로써 CVE-2026-0023은 Android가 다른 소스의 업데이트를 허용하기 전에 일반적으로 제공하는 신뢰 신호를 약화시킵니다.
일반 소비자 장치의 경우 실제 영향은 사용자의 설치 동작, 장치 패치 수준 및 대상 애플리케이션이 업데이트 소유권 의미 체계에 의존하는지 여부에 크게 좌우됩니다.
이 저장소는 통제된 연구 환경에서 취약점을 시연하기 위한 것입니다.
다음을 시도하지 않습니다:
개념 증명은 특히 CVE-2026-0023과 관련된 업데이트 소유권 경고 우회 동작에 초점을 맞춥니다.
Android 보안 게시판 - 2026년 3월 https://source.android.com/docs/security/bulletin/2026/2026-03-01
CVE-2026-0023 - CVE 레코드 https://www.cve.org/CVERecord?id=CVE-2026-0023
CVE-2026-0023 - NVD https://nvd.nist.gov/vuln/detail/CVE-2026-0023
AOSP 패치 - INSTALL_FROM_MANAGED_USER_OR_PROFILE 플래그 명시적으로 해제
https://android.googlesource.com/platform/frameworks/base/+/09055276288a68cf35b0f84ba32e28822f74ecf9
ChickenHook의 RestrictionBypass https://github.com/ChickenHook/RestrictionBypass
이 저장소는 보안 연구, 교육 목적 및 취약점 분석을 위해 제공됩니다.
코드는 통제된 환경 및 테스트가 승인된 장치에서 CVE-2026-0023을 재현하고 연구하기 위한 전용입니다.
저자는 허가 없이 장치, 애플리케이션, 사용자, 조직 또는 시스템에 대한 무단 테스트를 권장하거나 지지하지 않습니다.
사용자는 Android 장치를 테스트하거나 수정할 때 모든 관련 법률, 정책 및 조직 요구 사항을 준수할 책임이 있습니다.
이 저장소를 책임감 있게 사용하십시오.
| 필드 | 값 |
|---|
| CVE | CVE-2026-0023 |
| 구성 요소 | Framework / PackageInstaller |
| 영향받는 파일 | PackageInstallerService.java |
| 영향받는 메서드 | createSessionInternal |
| 취약점 유형 | 권한 상승 |
| 심각도 | 높음 |
| CVSS v3.1 | 7.8 |
| CVSS 벡터 | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 공격 벡터 | 로컬 |
| 공격 복잡도 | 낮음 |
| 필요 권한 | 낮음 |
| 사용자 상호작용 | 없음 |
| 범위 | 변경되지 않음 |
| 영향 | 권한 상승 (무단 업데이트 소유권 동작을 통한) |
| Android 보안 게시판 | 2026년 3월 |
| Android 버그 참조 | A-459461121 |
| Google이 나열한 영향받는 AOSP 버전 | Android 14, 15, 16, 16-qpr2 |
| 이벤트 | 값 |
|---|
| Android 보안 게시판 | 2026년 3월 |
| 게시판 발행일 | 2026년 3월 2일 |
| 보안 패치 수준 섹션 | 2026-03-01 |
| 게시판 전체 완전 해결 패치 수준 | 2026-03-05 이상 |
| Android 버그 참조 | A-459461121 |
| AOSP 패치 | 09055276288a68cf35b0f84ba32e28822f74ecf9 |
| 패치 제목 | 명시적으로 해제 INSTALL_FROM_MANAGED_USER_OR_PROFILE 플래그 |