공식 홈페이지[1]
Magisk: The Magic Mask for Android
매지스크: 안드로이드를 위한 마법 마스크
매지스크: 안드로이드를 위한 마법 마스크
1. 개요
안드로이드를 루팅하고 루팅 상태를 관리하기 위한 애플리케이션. 2023년 현재 가장 인지도가 높고 널리 쓰이는 루팅툴이다.2. 특징
2016년 8월에 처음 공개된 루팅 애플리케이션으로, 안드로이드 5.0(롤리팝) 이상[2]의 기기들을 지원한다. 루팅 뿐만이 아니라 애플리케이션 별 루트 권한 관리[3], Xposed와 같은 모듈 설치 등 각종 부가 기능들을 함께 제공한다.단순히 시스템 파티션에 su 바이너리를 설치하고 관리용 애플리케이션을 설치하던 과거의 루팅툴과는 달리 작동 방식이 굉장히 복잡하다. 이는 시간이 흐를수록 안드로이드의 보안 규정이 대폭 강화되었기 때문인데, 특히 롤리팝에서 SELinux[4]의 전면 도입으로 각 서비스별로 사전에 작성된 정책에 따라 수행할 수 있는 작업이 제한되면서 루팅이 매우 까다로워졌다.
이 때문에 매지스크의 작동 방식은 대략 다음과 같다(출처):
- 일단 설치 시에는 시스템 파티션이 아닌, 커널(boot 혹은 recovery) 파티션을 변조하여 부팅 시 처음 실행되는 프로세스인 init 바이너리를 Magiskinit이라고 불리는 프로그램으로 바꾼다. 기존의 init 바이너리는 별개의 위치로 백업해 둔다.
- 부팅 시 Magiskinit은 필요한 파티션을 마운트하고 fstab을 패치하는 등 필요한 작업을 진행하고, SELinux 정책을 로딩하여 매지스크 서비스가 작동할 수 있도록 변조한다.
- init 혹은 libselinux.so를 패치하여 변조된 SELinux 정책을 강제로 로딩하도록 한다.
- init.rc 파일을 패치하여 매지스크 서비스를 추가한다. SELinux 정책이 패치되어 매지스크 서비스인 magiskd는 SELinux로부터 제약을 받지 않는 permissive 모드로 작동된다.
- 원래의 init 바이너리를 실행하여 부팅을 계속된다.
과거에는 루팅을 하는 Magisk 애플리케이션과 루팅 상태를 관리하는 Magisk Manager라는 두 개의 애플리케이션으로 이뤄져 있었으나, v22.0부터 Magisk 애플리케이션으로 통합되었다.
3. 기능
- 루팅: 기기를 루팅할 수 있도록 해 준다. 정확히는 펌웨어를 수정해 바이너리 파일을 추가시키는 형태로 작동된다.
- 루팅 관리: 애플리케이션 별로 슈퍼유저 권한을 허용/거부할 수 있도록 해 준다. 기본적으로 처음 슈퍼유저 권한을 요청할 경우 창을 띄워 허용 여부를 묻도록 설정되어 있으나, 본인의 설정에 따라 항상 허용하거나 항상 거절하도록 설정할 수도 있다.
MagiskHide: 루팅을 숨겨주는 기능을 한다.[5]- Zygisk (Magisk in Zygote) : 안드로이드 앱들을 관리하는 Zygote 프로세스에 인젝션하는 방식으로 Magisk 모듈이 앱에서 제한 없이 동작할 수 있도록 한다.
- Hide the Magisk app: 위의 기능과는 별개로, 매지스크 앱 자체를 숨길 수 있게 된다. 옵션을 선택하면 Magisk가 직접 앱 패키지명을 수정하여 재설치한다.
- 모듈: 루팅을 이용한 여러 확장 기능들을 설치 및 관리할 수 있도록 해 준다. 단순히 폰을 꾸며주는 모듈부터 개발자용 모듈까지 아주 다양한 모듈이 존재하며, 모듈을 새로 개발하려는 개발자들을 위한 가이드도 존재한다.
매지스크 앱 내부에서 간이 ESD 형태로 공식 등재된 모듈을 배포하고 있으며[6], 여기에 등재되지 않은 모듈들도 별도로 다운로드 받은 후 설치할 수 있다. 다만 기기에 따라 작동되지 않는 모듈이 존재할 수 있으니 유의하자.[7] SafetyNet 확인 - 기기가 현재 루팅이 감지되는 상태인지 확인할 수 있도록 해 준다.[8]- 언루팅 - 루팅 상태를 해제하는 기능이다.
4. 사용법
사용법의 경우 기종별로 어느 정도 차이가 존재하기 때문에 하나로 정리하기는 힘들다. 공식 홈페이지의 설치 방법을 보면 각 기종별로 설치 방법이 설명되어 있으니 참고하면 된다. 대체적으로 공통점을 찾자면, 기기의 부트 파티션(boot.img 혹은 recovery.img)에 Magisk 관련 코드를 심는다. 따라서 매지스크로 루팅하려면 일반적으로는 부트로더를 언락해야 한다. 예외는 아래 항목에 따로 기술한다.- 삼성전자 기종의 경우 설치 방법이 다소 복잡하다. 참고로 삼성전자 기종은 루팅을 하면 Knox 워런티가 영구히 1로 변경되기 때문에 진행하기 전에 신중히 생각하자. 또한 설치 과정 도중 내장 저장소를 포함한 모든 데이터가 삭제되니 필요한 자료가 있다면 반드시 백업을 하고 진행해야 한다.
- 일단 부트로더 잠금을 해제해야 한다. 잠금 해제 방법은 기종별로 상이하다. 일반적으로 OEM 잠금해제 후 다운로드모드에서 볼륨 상 버튼을 길게 누르는 것으로 가능하다. 이때 휴대폰의 데이터가 초기화된다. 이 단계를 진행하기 전에 백업을 수행하자.
- 루팅하려는 기종의 순정 펌웨어를 내려받아 압축을 해제한다.
- 압축이 해제된 펌웨어 파일 중 AP 파일을 휴대폰의 저장소로 옮긴다. 옮기기 전 .md5로 끝나는 확장자를 .tar로 바꿔준다.[9]
- 매지스크 애플리케이션을 열고 설치->파일 패치 버튼을 눌러 저장소로 옮긴 AP 파일을 선택한다. 선택 후 '설치' 버튼을 누른다.
- 패치 작업이 완료될 때까지 잠시 기다린다. 패치가 완료되면 내장 저장소의 Download 폴더 내부에 패치된 tar 파일이 생성되는데, 해당 파일을 컴퓨터로 다시 옮겨준다.
- 휴대폰의 전원을 끄고 다운로드 모드로 진입시킨 후[10] 컴퓨터와 연결한다.
- 오딘을 실행한다. 오딘에서 BL, CP[11], CSC 파일은 위에서 내려받은 순정 펌웨어의 파일을 선택하고, AP 파일은 매지스크 앱에서 패치한 AP 파일을 선택한 후[12] Start 버튼을 누른다.
- 큰 문제가 없다고 하거든 몇 분 후 'PASS'가 뜨면서 루팅 펌웨어 설치가 끝난다. 그리고 자동으로 다시 시작되는데, 켜지는 타이밍에 맞추어서 리커버리 모드로 진입하는 버튼을 눌러야 한다. 아니면 무한히 재부팅된다. 리커버리 진입 후 Wipe data/factory reset을 선택하여 저장소를 초기화하고 reboot system now를 선택하여 기기를 재부팅한다.
- 부팅 후 설정을 완료한 후 홈 화면에 있는 매지스크 앱을 실행하여 설치를 마무리한다.
- TWRP가 지원되는 기종의 경우는 설치법이 비교적 간단하다. 그냥 매지스크 apk 파일을 내려받은 후, 파일 확장자를 zip으로 변경하고 TWRP로 부팅해서 zip을 설치하면 끝. APK 파일이 리커버리용 zip도 겸할 수 있게 설계되어 있다. 필요하다면 루팅 전에 파티션을 백업할 수도 있다. 다만 공식 설치 가이드에서는 이 방식을 더 이상 권장하지 않는다고 하는데, 리커버리 모드에서는 루팅하려는 기기의 속성을 정확히 파악하기 어려워 설치가 잘못될 여지가 존재하기 때문이다,
- 위의 방법을 사용하지 않는다고 해도 TWRP 자체에 이미지 플래싱 기능이 존재하는 만큼 설치가 간단한 건 마찬가지다. 순정 펌웨어의 boot.img를 구한 후[13], 매지스크 앱을 설치하여 해당 이미지를 패치하고 리커버리로 진입하여 패치된 boot.img를 설치하면 된다.
- TWRP가 지원되지 않는 기기를 루팅하기 위해서는 반드시 정펌의 boot 혹은 recovery 파티션들 중 하나를 확보해야 하며 경우에 따라서는 vbmeta 파티션까지 가지고 있어야 한다. 필요한 파티션이 포함된 롬파일은 제조사 홈페이지에서 다운로드를 받거나 플래시툴이 지원할 경우 기기로부터 직접 덤프할 수 있다. 그러나 이와 같은 방법으로 롬파일을 구할 수 없을 경우에도 가능한 몇몇 트릭이 있다.
- 기기가 OTA 업데이트를 지원하고 가능한 업데이트가 있을 경우 이것을 가로챌 수 있다. adb logcat을 이용하여 로그를 추출하면서 OTA 업데이트를 내려받으면 로그에 브라우저로 업데이트를 받을 수 있는 주소가 남는다. 만약 해당 업데이트가 암호화되지 않았고 필요한 파티션이 모두 있다거든 업데이트 후는 루팅할 수 있다.
- 미디어텍 칩셋[14]을 사용하면서 보안 패치가 2020년 03월 이전인 기기들은 mtkSU라는 바이너리와 앱을 사용해 임시 루팅을 시도할 수 있다. 이후 기기에서 직접 펌웨어를 추출하면 된다. 이는 100% 성공하는 방법은 아니지만 성공률이 제법 높다.
- 안드로이드 9 이상[15]으로 출시되었고 펌웨어 버전이 동일한 기기가 2대 이상 있을 경우 Treble 기능을 이용할 수 있다. 'A와 B 두 기기의 부트로더 언락 -> AVB 해제[16][17] 후 su 바이너리가 포함된 GSI롬을 A 기기에 플래싱 -> A기기에서 부트 혹은 리커버리 파티션을 추출 -> A기기에서 추출한 파티션을 사용해 A와 B 두 기기 모두를 매지스크로 루팅 -> 필요하다면 B기기의 정펌 시스템 파티션을 추출하여 A기기를 복구'의 과정을 거친다. 정펌을 사용하거나 백업할 생각이 없다거든 기기는 1대만 있어도 가능하다. 이 방법의 단점은 vbmeta 파티션이 AVB를 해제하는 과정에서 손상되는 경우가 많아[18] 기기가 몇 대가 있든 정펌의 수정되지 않은 vbmeta 파티션은 얻을 수 없고, 따라서 정펌으로 되돌리더라도 부트로더를 다시 잠글 수 없다고 하는 것이다.
- 안드로이드 5.1 이하의 구형 기기는 대개 KingRoot와 같은 원클릭 루팅 솔루션을 적용할 수 있으며 6.0일 경우도 임시 루팅까지는 가능할 수 있다. 또한 상대적으로 시스템 파티션의 무결성이 중요하지 않으며 루팅되지 않은 상태에서도 시스템 파티션의 파일들 상당수에 접근하여 백업할 수도 있다.[19] 따라서 원클릭 솔루션으로 일단 루팅한 후 boot 파티션을 추출하고 '언루트 > Magisk 루팅 -> 구식 루팅 툴이 헤집어 놓은 시스템 파티션을 최대한 복구'를 고려할 수 있다.
- 2018년 후반~2019년에 출시된 일부 기종들은 부트 이미지에 램디스크가 탑재되지 않아 리커버리 파티션에 매지스크를 설치하여 리커버리로 부팅해야만 루팅이 되는 경우도 있다고 한다. 대부분 안드로이드 9으로 출시한 기종들인데 이 글에서는 특히 삼성의 갤럭시 노트10과 갤럭시 S10을 예시로 들고 있다. 다만 이런 모델이라 하더라도 패치한 recovery 파티션을 boot 파티션에 플래시하는 편법[20]을 써서 번거로움을 줄일 수 있는 경우가 있다.
- 언제 출시된 기기부터인지는 알 수 없으나 몇몇 화웨이 기종들은 부트로더 언락이 불가능하고 파티션 구조가 안드로이드 표준 형태에서 벗어나 있어 지원되지 않는다고 한다.[21]
- Unisoc 계열 칩셋을 사용하는 안드로이드 8.0 이상 기기들은 부트로더를 언락하더라도 AVB를 해제할 방법이 없어 루팅이 배로 까다롭다. 부트나 리커버리뿐만이 아닌 vbmeta까지 빌드하고 서명해야 하는데 Magisk도 이것은 지원하지 않기 때문에 따로 해야 하는 데다 원래 기기에 서명된 키[22]가 필요하고 심지어는 업데이트를 할 때마다 이 모든 작업을 처음부터 다시 해야 한다.
- 부트 혹은 리커버리 파티션에 설치해야 하므로 대개 부트로더 언락이 필요하지만 예외가 있다.
- AVB를 사용하지 않는 기기들은 fastboot를 통하지 않고 플래시할 방법[23][24]을 찾는다면 대개 부트로더를 언락할 필요가 없다. 여기에는 안드로이드 8.1 이하로 출시된 기기들 거의 대부분이 포함되며, spreadtrum 및 Unisoc 계열 칩셋은 7.1 이하부터 확실하게 AVB가 사용되지 않는다.
- Unisoc 계열 칩셋의 경우는 AVB가 사용되었다더라도 부트로더 언락 키가 있다면 언락을 할 필요가 없다. 어차피 언락 과정에서 vbmeta를 새로 빌드하여 AVB를 패스해야 하는데 이것을 패스할 수 있는 시점에서 부트로더 언락은 필수가 아니게 된다. fastboot를 통하지 않는 방법이 있다면 그것으로 플래시하면 되며 fastboot를 사용해야만 플래시가 가능할 경우 플래시 후 부트로더를 다시 잠가버리면 된다.
- 만약 펌웨어가 test-keys등의 공개키로 서명되었다고 하면 위의 Unisoc 계열 칩셋과 비슷하게 커스텀 vbmeta를 빌드할 수 있다. fastboot를 통하지 않는 방법이 있다면 그것으로 플래시하면 되며 fastboot를 사용한 플래시일 경우 플래시 후 부트로더를 다시 잠가버릴 수 있다.
- 부트로더 잠금 상태에서 루팅할 때 주의해야 할 점으로, 처음부터 AVB가 없었거나 vbmeta를 수정하여 비활성화한 것이 아니라고 하면 시스템에 그 어떠한 직접적인 변경도 가해서는 안 된다.[25] 그리고 AVB가 없거나 비활성화되었다 하더라도 매지스크 자체 업데이트 기능 등 boot 파티션을 건드리는 작업은 피해야 한다. 벽돌이 될 가능성이 있다.
- 극히 드문 경우인데, 중국 중소기업의 태블릿이나 TV박스 중에서는 가끔 ro.adb.secure가 비활성화되어 있다 하거나, debug 빌드가 탑재되어 있다 하거나, 부트로더를 언락하지 않았음에도 fastboot와 adb를 통해 주요 파티션을 플래시할 수 있다고 하거나, AVB가 기본적으로 비활성화되어 있다고 하거나 하는 등의 안드로이드 표준 보안 규정을 완전히 무시하는 기기들이 있다.[26] 이런 기기일 경우는 상식적인 절차를 시도하면 오히려 온갖 이상 증상이 나타나므로 우선 기기의 특성을 정확히 파악하고 부트로더 언락 없이 루팅을 진행할 수 있다거든 그냥 그렇게 하는 게 좋다.
- Windows 11에서는 MagiskOnWsaLocal 프로젝트를 통해 Magisk 루트 솔루션과 gapps를 동시에 설치할 수도 있다. 업데이트도 상당히 빠른 편. 다만 초기 빌드에 리눅스 환경이 필요하다는 번거로움이 있다. 리눅스가 설치된 PC에서 빌드하고 결과물을 가져와서 설치할 수도 있지만, WSL을 이용하는 것이 여러모로 편할 것이다. 그냥 설치만 하면 되는 버전도 개발되었다!
5. 여담
- 참고로 John Wu는 애플 인공지능 시리 관련 부서에서 일하다 2021년 5월 말쯤에 구글 안드로이드 보안 쪽 부서로 이직했다고 한다. 앱 개발은 구글이 암묵적으로 허락한 것으로 보이니 안심하자.
6. 관련 문서
[1] 구글 등에서 검색시 공식 홈페이지를 자청하는 수많은 페이지들이 같이 뜨는데, Magisk의 공식 홈페이지는 Github 저장소 하나뿐이다. 즉 나머지는 모두 가짜 사이트들이다.[2] 구버전은 4.2 젤리빈까지 지원하며 꼭 필요하다면 아직 설치해서 사용할 수는 있다. 그러나 Magisk 23.0부터는 롤리팝 이전 버전과의 호환성이 완전히 제거되었다.[3] 사실 이 기능은 안드로이드 초창기의 Superuser 앱부터 지원한 기능이다.[4] 미국 NSA에서 처음 개발한 리눅스 보안 강화 솔루션이다.[5] 23.0 버전 업데이트 이후 기능 제거로 새롭게 등장한 Zygisk가 대체할 것으로 보인다.[6] 현재는 지원하지 않는 기능이다.[7] 매지스크의 공식 개발 지침에 따르면, 앱 내부에서 배포되는 모듈들은 대부분의 기종들에서 작동될 수 있어야 한다는 조건이 붙어 있으며 특정 기기만을 위한 모듈은 등재가 거부된다. 다만 루팅 관련 행위들이 늘 그렇듯 벽돌의 위험이 항상 뒤따르니 주의를 기울이는 것이 좋다. 특히 공식 등재되지 않은 모듈을 설치할 때는 해당 모듈이 정확히 어떤 모듈인지, 그리고 본인의 기기와 호환되는지를 정확히 확인한 후 설치하도록 하자.[8] 이 기능도 현재는 지원하지 않는다.[9] 바꾸지 않아도 되긴 하지만, 확장자가 md5일경우 오딘에서 체크섬 확인을 진행하면서 잠시 프리징이 걸린다. 가능하다면 모든 파일의 확장자를 .tar.md5에서 .tar로 바꿔주자. 프리징이 사라진다.[10] 안드로이드 12 기준 갤럭시 S20 이상 기종은 컴퓨터랑 연결을 하지 않고 음량 아래+음량 위를 계속 누르고 있는 상태에서 컴퓨터랑 연결한다. 이후 다운로드모드로 진입할 것이냐 묻는 창이 나오는데 확인(일반적으로 볼륨 상 키를 짧게 누르는 것)을 선택함다.[11] 이동 통신을 지원하지 않는 기기(태블릿 등)에는 없을 수도 있다.[12] USERDATA도 있지만 굳이 넣을 필요가 없다. 아니, 오히려 이 유저데이터 파일은 통신사 기본 앱을 설치하는 파일이다. 즉 통신사용 파일.[13] 이마저도 루팅 작업을 시작하기 전에 TWRP로 백업을 한번 진행하면 순정펌을 구할 필요 없이 백업 파일 내부에서 확보할 수 있다. 해당 파일명은 주로 boot.emmc.win[14] MT67xx, MT816x, MT817x, MT6580 한정[15] 8 이상에서도 가능한 경우가 종종 있으나 드물다.[16] 롬파일 없이 AVB 해제가 불가능한 모델은 이 방법을 쓸 수 없다.[17] Unisoc 계열 칩셋은 대부분 부트로더를 언락할 시 시스템 파티션에 대한 검증을 하지 않도록 되어 있으므로 따로 AVB를 해제하지 않아도 된다.[18] 부트로더를 언락하면 자동으로 시스템 파티션을 풀어주는 Unisoc 계열이 아닌 한 대부분 vbmeta 파티션을 덮어씌워야 AVB를 해제할 수 있다.[19] 보통 /system/bin/, /system/xbin/, /system/etc/ 경로 내의 파일들을 백업하는 것으로 충분하다. 단 파티션 자체를 복사할 수는 없다.[20] 통상 이런 짓을 하면 시스템 부팅이 불가능해지고 오직 리커버리 진입만 가능한 상태가 되지만 매지스크로 패치된 리커버리일 경우 정상적으로 시스템 부팅이 가능하다.[21] 대개 이들은 제재 이후 HarmonyOS 기반이나 대응 설계가 되어있어 그럴 것으로 추정된다.[22] 이 키는 부트로더 언락 단계에서도 필요하다. 즉 키가 없으면 말 그대로 아무것도 시도할 수가 없다. 다행히도 가장 널리 쓰이는 키는 유출되어 있지만 만약 제조사가 고유의 키를 사용하면 부트로더 언락부터가 불가능하다.[23] 삼성, 소니, LG처럼 자체적인 프리로더를 사용하는 회사에서 출시된 모델이 아니라면 부트로더 언락 여부와 상관없이 플래시/덤프가 가능한 툴이 칩셋별로 존재하는 것이 보통이다. 예를 들면, 퀄컴은 QFIL 혹은 Sugar QCT, 미디어텍은 SP Flash Tool, 스프레드트럼 및 Unisoc은 SPD Research Tool이 주로 사용된다.[24] USB 박스나 동글을 사용하는 안드로이드 범용 서비스 툴을 사용할 수도 있다. 장점은 공개 툴을 사용한 플래시/덤프를 제조사에서 막아 놓았더라도 이를 우회할 가능성이 상당히 높다는 점, 부트로더 언락이 불가능한 모델을 강제 언락하거나 하는 등의 부가 기능이 많다는 점, 삼성, 소니, LG 등 자체적인 플래시 툴을 사용하는 회사의 모델도 지원하는 경우가 많다는 점, 지속적인 업데이트와 정보가 제공된다는 점 등이다. 단점은 옵션에 따라 연간 50USD에서 200USD 정도 되는 구독 비용이다.[25] boot, system, vendor, product 등 유저 데이터가 아닌 롬에 해당하는 파티션은 read/write로 마운트하는 것조차 시도해서는 안 된다. GSI 롬을 비롯한 커스텀 롬 설치 또한 당연히 불가능하다.[26] 일례로 안드로이드 9 TV박스인 Beelink GT-King은 fastboot 액세스나 부트로더 언락이 불가능한 대신 AVB가 비활성화되어 있고 스톡 펌웨어가 su 바이너리를 포함하며 shell 에뮬레이터를 통해 boot나 recovery 등의 주요 파티션을 플래시하거나 덤프할 수 있다.[27] 대만 타이베이 출신으로, 현재 미국에 거주.