---
title: "구글 프로젝트 제로, 픽셀 10에서 제로클릭으로 루트까지 가는 익스플로잇 체인 공개"
published: 2026-05-15T13:39:54.000Z
canonical: https://jeff.news/article/2792
---
# 구글 프로젝트 제로, 픽셀 10에서 제로클릭으로 루트까지 가는 익스플로잇 체인 공개

구글 프로젝트 제로가 픽셀 10에서도 제로클릭 취약점에서 시작해 안드로이드 루트 권한까지 도달하는 익스플로잇 체인을 만들 수 있었다고 공개했다. 핵심은 기존 돌비 취약점과 픽셀 10의 새 VPU 드라이버 취약점을 이어 붙인 체인인데, VPU 쪽은 커널 메모리를 사용자 공간에서 거의 그대로 만질 수 있게 만드는 수준의 심각한 버그였다.

## 픽셀 10도 제로클릭에서 루트까지 뚫렸다

- 구글 프로젝트 제로가 픽셀 10용 익스플로잇 체인을 공개함. 출발점은 돌비 0-click 취약점, 도착점은 안드로이드 루트 권한임.
  - 프로젝트 제로는 앞서 픽셀 9에서 익스플로잇 2개만으로 제로클릭 컨텍스트에서 루트까지 가는 체인을 보여줬음.
  - 이번엔 같은 아이디어가 픽셀 10에서도 가능한지 확인했고, 결론은 “가능했다”에 가까움.
  - 돌비 취약점은 2026년 1월 패치 전까지 안드로이드 전반에 존재했던 이슈였고, 픽셀 10용 체인은 패치되지 않은 기기에서만 동작함.

- 돌비 익스플로잇을 픽셀 10에 맞추는 작업은 생각보다 단순했음. 대부분은 라이브러리 버전 차이 때문에 오프셋을 다시 맞추는 일이었음.
  - 픽셀 9에서 쓰던 CVE-2025-54957 익스플로잇을 픽셀 10 라이브러리 구조에 맞게 조정함.
  - 다만 픽셀 10은 `-fstack-protector` 대신 RET PAC을 써서 `__stack_chk_fail`을 덮어쓰는 기존 방식이 안 먹혔음.
  - 연구진은 대신 `dap_cpdp_init`을 덮어썼음. 이 초기화 코드는 디코더가 처음 초기화될 때 한 번만 호출되고 이후엔 다시 호출되지 않아 기능상 문제가 적었기 때문임.

> [!IMPORTANT]
> 이 체인은 최신 패치가 적용된 기기용이 아님. 돌비 쪽 익스플로잇은 2025년 12월 또는 그 이전 보안 패치 수준의 미패치 기기에서만 동작함.

## 진짜 문제는 새 VPU 드라이버였다

- 픽셀 9 체인에서 권한 상승에 쓰였던 BigWave 드라이버는 픽셀 10에 없었음. 그래서 연구진은 픽셀 10에서 새 공격 표면을 찾아야 했음.
  - 픽셀 10의 `mediacodec` SELinux 컨텍스트에서 `/dev/vpu`라는 새 드라이버가 보였음.
  - 이 드라이버는 텐서 G5 칩 안의 Chips&Media Wave677DV 실리콘과 통신하는 데 쓰이고, 비디오 디코딩 가속을 담당함.
  - 오픈소스 C 파일 주석을 보면 이 드라이버는 과거 BigWave 드라이버를 만든 개발자들이 개발·유지한 것으로 보였음.

- 연구진은 Jann Horn과 함께 VPU 드라이버를 2시간 감사했고, 바로 치명적인 취약점을 찾았음. 이 대목이 꽤 세다.
  - upstream 리눅스의 WAVE521C 드라이버는 V4L2, 즉 Video for Linux API와 통합되어 있음.
  - 그런데 픽셀의 WAVE677DV 드라이버는 V4L2를 거치지 않고 칩의 하드웨어 인터페이스를 사용자 공간에 직접 노출함.
  - 심지어 사용자가 칩의 MMIO 레지스터 인터페이스를 매핑할 수 있게 해둠.

- 문제의 핵심은 `mmap` 핸들러가 매핑 크기를 제대로 제한하지 않았다는 점임. 드라이버 보안에서 “이건 진짜 안 된다” 싶은 패턴임.
  - 원래는 VPU 하드웨어의 MMIO 레지스터 영역만 사용자 공간에 매핑해야 함.
  - 그런데 구현은 실제 레지스터 영역 크기로 제한하지 않고, 호출자가 넘긴 VMA 크기를 기준으로 `remap_pfn_range`를 호출했음.
  - 공격자가 `mmap` syscall에서 레지스터 영역보다 훨씬 큰 크기를 지정하면, VPU 레지스터 물리 주소에서 시작해 원하는 만큼의 물리 메모리를 사용자 공간에 매핑할 수 있었음.

> [!WARNING]
> 이 버그의 파급력이 큰 이유는 “일부 데이터 노출” 수준이 아니라 커널 이미지의 `.text`, `.data` 영역까지 사용자 공간에서 접근·수정 가능해졌다는 점임.

## 왜 이게 ‘커널 취약점의 성배’급인가

- 픽셀에서는 커널이 항상 같은 물리 주소에 올라가서 공격 난이도가 더 낮아졌음. 랜덤하게 뒤져볼 필요도 없었다는 얘기임.
  - 커널 이미지는 VPU 레지스터 영역보다 높은 물리 주소에 위치함.
  - VPU 영역과 커널 사이의 오프셋이 항상 알려진 값이라서, 충분히 큰 길이로 `mmap`만 하면 커널 위치를 바로 계산할 수 있음.
  - 커널을 메모리에서 스캔할 필요 없이, 반환된 매핑 주소 기준으로 정확히 어디를 건드려야 하는지 알 수 있었음.

- 여기까지 오면 임의 커널 읽기·쓰기는 거의 공짜에 가까움. 연구진 표현대로면 진짜 간단한 버그였음.
  - 커널 함수 아무거나 덮어써서 커널 코드 실행을 얻을 수 있음.
  - 원하는 primitive를 만드는 것도 가능함. 즉, 단순 크래시가 아니라 공격자가 원하는 방식으로 커널을 조작할 수 있음.
  - 임의 커널 읽기·쓰기를 얻는 데 필요한 코드는 5줄이었고, 전체 익스플로잇 작성도 하루가 안 걸렸음.

```mermaid
sequenceDiagram
    participant 공격자
    participant 돌비디코더
    participant 사용자공간
    participant VPU드라이버
    participant 커널
    공격자->>돌비디코더: 제로클릭 입력으로 코드 실행 유도
    돌비디코더->>사용자공간: 제한된 컨텍스트에서 실행 흐름 확보
    사용자공간->>VPU드라이버: 큰 길이로 mmap 요청
    VPU드라이버->>사용자공간: VPU 레지스터 이후 물리 메모리까지 매핑
    사용자공간->>커널: 고정 오프셋으로 커널 이미지 접근
    사용자공간->>커널: 함수 또는 데이터 덮어써 루트 권한 확보
```

## 패치 과정은 나아졌지만, 코드 품질은 여전히 숙제

- 이 취약점은 2025년 11월 24일 신고됐고, 안드로이드 취약점 보상 프로그램(Android VRP)은 심각도를 High로 평가했음.
  - 픽셀 9의 BigWave 권한 상승 버그는 보안 영향이 사실상 같았는데도 처음엔 Moderate로 평가됐음.
  - 이번엔 High로 바로 잡힌 만큼, 이런 유형의 드라이버 취약점을 분류하고 대응하는 태도는 개선된 셈임.

- 패치는 신고 후 71일 만에 나왔고, 2026년 2월 픽셀 보안 공지에 포함됐음.
  - 연구진은 자신이 신고한 안드로이드 드라이버 버그 중 벤더가 처음 인지한 뒤 90일 안에 패치된 첫 사례라고 언급함.
  - 개별 버그 대응 속도만 보면 긍정적임. 적어도 이번에는 “언젠가 고치겠지”가 아니라 실제 보안 공지까지 빠르게 이어졌음.

- 하지만 더 찝찝한 건, BigWave 이후 5개월이나 지났는데 같은 개발자들이 관리하는 다른 드라이버에서 너무 얕은 취약점이 또 나왔다는 점임.
  - 연구진은 BigWave 버그를 신고했을 때 해당 개발자들이 다른 드라이버도 점검하길 기대했음.
  - 그런데 VPU 드라이버에서는 코드베이스를 가볍게 훑어봐도 바로 보이는 수준의 심각한 문제가 남아 있었음.
  - 보안 보고서는 종종 복잡한 취약점을 찾아내지만, 이번 케이스는 “출시 전에 기본 감사로 걸렀어야 하는 것 아닌가?”에 가까움.

- 결론은 명확함. 안드로이드 드라이버 보안은 개별 패치보다 개발 프로세스 개선이 더 중요함.
  - 하드웨어 드라이버는 성능과 기능 때문에 사용자 공간과 커널 사이를 가까이 붙이는 일이 많음.
  - 그만큼 범위 검증, 권한 모델, 표준 API 사용 여부 같은 기본기가 무너지면 곧바로 커널 장악으로 이어짐.
  - 픽셀 같은 레퍼런스급 기기에서도 이런 버그가 나온다면, 다른 안드로이드 기기 생태계는 더 빡세게 봐야 함.

---

## 기술 맥락

- 이번 사건의 핵심 선택은 VPU 드라이버가 V4L2 같은 표준 비디오 계층을 통하지 않고 하드웨어 인터페이스를 사용자 공간에 직접 노출했다는 점이에요. 이렇게 하면 특정 칩 기능을 빠르게 붙이기는 쉬운데, 드라이버가 직접 보안 경계를 책임져야 해서 작은 검증 누락이 바로 커널 취약점으로 커져요.

- `mmap`에서 길이 검증이 중요한 이유는 사용자 공간에 “어디부터 어디까지 보여줄지”를 결정하는 경계선이기 때문이에요. 원래는 VPU 레지스터 영역만 보여줘야 했는데, 호출자가 더 큰 크기를 요청해도 막지 않으면서 VPU 뒤쪽의 물리 메모리까지 같이 열려버린 거예요.

- 픽셀에서 커널 물리 주소가 고정적이었다는 점도 공격 난이도를 크게 낮췄어요. 커널 위치를 추측하거나 메모리에서 패턴을 찾아 헤맬 필요 없이, VPU 매핑 시작점에서 알려진 오프셋만 더하면 커널 코드와 데이터에 닿을 수 있었거든요.

- 그래서 이 취약점은 단순 정보 유출보다 훨씬 위험해요. 공격자는 커널 함수나 데이터를 직접 바꿔서 원하는 실행 흐름을 만들 수 있고, 연구진이 말한 것처럼 임의 읽기·쓰기가 5줄 코드로 가능했다면 실전 익스플로잇 난이도도 꽤 낮은 편이에요.

- 패치가 71일 만에 나온 건 분명 개선이에요. 다만 같은 계열 개발자들이 만든 다른 드라이버에서 비슷하게 기본적인 문제가 발견됐다는 건, 개별 버그 수정만으로는 부족하고 드라이버 전체에 대한 사전 감사와 설계 리뷰가 필요하다는 신호예요.

## 핵심 포인트

- 픽셀 10용 체인은 돌비 제로클릭 취약점과 VPU 드라이버 권한 상승 취약점으로 구성됨
- VPU 드라이버는 mmap 길이 검증을 제대로 하지 않아 물리 메모리를 사용자 공간에 과도하게 매핑할 수 있었음
- 커널 이미지가 VPU 레지스터보다 높은 고정 물리 주소에 있어 커널 코드와 데이터를 직접 읽고 수정할 수 있었음
- 임의 커널 읽기·쓰기는 5줄 코드로 가능했고 전체 익스플로잇 작성도 하루가 안 걸렸음
- 취약점은 2025년 11월 24일 신고됐고 71일 뒤 2026년 2월 픽셀 보안 공지에서 패치됨

## 인사이트

이건 단순히 픽셀 하나 털렸다는 얘기가 아니라, 안드로이드 기기 드라이버 코드가 얼마나 공격 표면으로 위험한지 보여주는 케이스다. 특히 하드웨어 가속용 드라이버가 사용자 공간에 MMIO를 직접 열어주는 설계는 성능엔 편할 수 있어도 보안 검증이 허술하면 바로 커널 전체가 열린다.
