안농안농! 

딴짓하느라 못쓰고 있던 루팅 하고 커스텀 롬이 요즘 어떻게 되었는 지

아는 한도내에서 대략적으로 한 번 써보려고 함.

기본적인 내용은 아마 예전에 한번이라도 커롬깔고 루팅하고 해본 사람들은 다 알거라고 봄.

그래서 기본적인거나 과거는 간략하게 얘기할거임!

글을 잘 못써서 이게 뭔소린가 싶다면 미안해...

커스텀 롬은 따로 글써봄!


1. 루팅

"루팅"이라 함은, 

안드로이드 기반 운영체제들에서 슈퍼유저 권한을 얻기 위해 사용되는 방식임.


과거부터 현재까지 다음과 같은 이유로 이용되는 경우가 많았음.

1. 통신사가 기본으로 설치한 수 없이 많은 시스템 앱 제거 (요런것들은 블로트웨어라고 부름!)

2. 폰트, 부팅로고 변경, 최적화 등등의 커스터마이징

요즘에는 몇 개의 이유가 더 추가 되었음

3. 구글 플레이 스토어 설치 (아마존 킨들파이어, 대다수의 화웨이 기기)

4. 커스텀 리커버리 설치(보안 취약점이 발견된 LG 기기들에서 Magisk를 이용해서 커스텀 리커버리를 설치하는 경우가 있었음 #참고)

5. SafetyNet 우회 (커스텀 롬, 화웨이 등의 기기에서 구글 플레이 스토어의 보안 제약을 우회하기 위함 ex. 넷플릭스 설치 등)

6. 보안 리서치 (예시로 나와있는 건 삼성의 트러스트존 키마스터 보안 리서치 문서)


예전에는 SuperSU(Chainfire라는 개발자가 개발하던 사유 소프트웨어)가 대세 였고

그 외에도 수도 없이 많은 루팅 툴이 있었음

예를 들자면 안드로이드 보안 취약점을 이용하는 Kingroot나 Framaroot같은 원클릭 루팅 툴들.

그런데 안드로이드가 점점 버전업되고 보안이 강화되면서 설치 자체에 애로사항이 꽃피다보니

하나 둘씩 다 명맥이 끊겼고 (특히 원클릭 루팅앱들부터 다 죽었음. 물론 Mediatek 칩셋에 전반적인 취약점이 발견되면서 한번 크게 이슈가 된적이 있음. #참고)

본디 SuperSU를 탐지하는 앱들(뱅킹앱, 게임앱 등)로 부터 숨기는 기능 정도만 하던 Magisk가 발전해서 계속해서 개발되고 있음


설치방식은 SuperSU나 Magisk나 둘 다 동일함

커스텀 리커버리(TWRP 등)를 통해서 바이너리들이 포함된 zip파일을 설치(요런걸 플래싱이라고 부르더라)하는 것임.


기본적인건 요기까지 하고 요즘 대세인 Magisk에 대해 얘기해보려고 함!


1-1. Magisk의 변화 (더 자세한 내용은 #여기를 참고!)

위에서 언급했듯이 본래 Magisk(Magic Mask)는 SuperSU를 탐지하는 앱들로 부터 루팅 여부를 숨기는 기능을 하던 사유 소프트웨어였음.

버전 7부터 개발자 John Wu가 오픈소스화 했음.

Magisk는 다음과 같은 기능을 지원함.

1. 통상적인 루트 권한 기능

2. 모듈 설치

3. 모듈 레포 기능 -- 이 기능은 최근에 들면서 프로젝트에서 제거됨. 이유는 John Wu가 Magisk 개발에 더 집중하기 위해서 였다고함.

4. 루팅 탐지 우회(부트로더 언락 여부, 모듈 설치 여부, SafetyNet우회) -- 이 기능은 최근에 들면서 프로젝트에서 제거됨. 이유는 John Wu가 구글 보안팀에 입사했기 때문임.

5. Magisk Manager 숨김(패키지 명, Unix Socket명 랜덤한 문자열로 바꿔버림. 패키지 목록에서 탐지 불가능. 최근에는 루팅 탐지 앱들이 다른 방식으로 탐지중) -- 이거 근데 한국 앱들 중에 Unix Socket 길이가 32자리면 Magisk로 탐지하는 경우도 있음 #참고


이 프로젝트가 안드로이드 커스터마이징, 더 나아가서 안드로이드 보안에 미친 영향이 상당함. 

이는 Magisk의 개발자가 안드로이드 취약점을 연구하고 논문도 썼던데다가 이걸 구글에 제보하고

Magisk 역시도 보안에 신경을 쓰면서 제작했기 때문임.

덕분에 위에 말했듯이 보안 리서치 도구로 사용되기도 하고 있음.


일례로 유명한 커스텀 롬(AOSP기반의 운영체제들.)중 하나인 LineageOS는 기존에 자기네들이 만들던 su를 완전히 포기하고 대신해서 한동안 Magisk쓰라고 한적도 있음 #참고


아무튼 일단 커스터마이징 쪽 부터 살펴 보자면,

본래 커스텀 리커버리로 ZIP파일을 설치하면 시스템 파티션에 파일이 그대로 설치 되기 때문에

뭔가 잘못돼서 부팅이 안된다던지(이른바 벽돌 Bootloop), 마음에 안들어서 없애고 싶을땐

반드시 롬(커스텀 롬이던 순정 롬이던 간에)을 다시 설치해야했음.

게다가 시스템 파티션에 그대로 설치되면 시스템 파티션 변조 여부를 아는 것도 굉장히 쉬웠음.


근데 Magisk는 "모듈" 방식을 지원함.

방식은 커스텀 리커버리처럼 ZIP파일을 플래싱 하는건데,

Magisk Manager에서 제거, 비활성화등 간단하게 모듈을 관리할 수 있게됨.

한마디로 롬을 재설치할 필요가 상당히 줄었단 것임.


또 모듈방식을 지원하면서 개발자가 모듈을 개발하기 쉽도록 이것저것 기능을 추가했음. #참고

1. 시스템 파티션에 파일 설치 또는 대체(mount를 이용함. 요걸 이용해서 Debloat도 가능하다고 개발자가 설명함)

2. 커스텀 SeLinux 정책 추가(추가된 이유는 보안때문임. 밑에서 추가적으로 설명함!)

3. 부팅시 실행되는 커스텀 작업추가

4. Zygisk (최근에 추가된 기능. Zygote에 커스텀 코드를 주입함. RikkaW라는 개발자가 개발하던 Riru라는 Magisk 모듈에서 영향을 받음. Riru 개발자가 기여함. 이게 Zygote 코드 주입의 시초.)


본래는 데이터 파티션에 magisk.img 이미지를 추가해서 그 안에 모듈이나 바이너리들을 집어 넣어놨었는데

나중에 앱들이 이 이미지 파일을 탐지하니까 이미지 형식에서 탈피해서 /data/adb로 옮겨버림

여긴 안드로이드에서 기본적으로 존재하는 폴더라 기본적으로 앱(이런 데이터 파티션에 설치된 앱들을 안드로이드 SeLinux에선 untrusted_app이란 정책으로 관리함)들이 탐지할 수 없는 장소임 #참고 


요약하자면 시스템 파티션에 직접적으로 파일이 추가되는 경우가 상당히 줄었고

이른바 Systemless Root가 대세가 되면서 루팅 탐지 역시 어려워 졌다는 점임


자세한 작동 방식은 아래 스택 익스체인지 질문의 답변글이랑 개발자 트윗을 한번 읽어보면 좋을듯함! 정말 잘 설명돼있음.

rooting - How does Magisk work? - Android Enthusiasts Stack Exchange #John Wu의 트윗


나중에 안드로이드에서 GKI가 기본적으로 지원되기 시작하면 Kernel Assisted SuperUser를 기반으로 할 생각이라고 함 #참고

(커널에 접목되어있으므로 시스템 파티션은 물론 유저 파티션에도 거의 변경사항을 추가하지 않으므로 더욱 루팅 탐지가 어려워지는게 장점) #XDA기사 #실제 접목 사례


아무튼 자 하지만 모든 게 계속해서 순탄할 순 없음...

구글이 SafetyNet의 치명적 버그를 수년만에 완전히 고쳐버리고 지속적으로 보안을 강화하면서

SafetyNet 우회도 루팅 우회도 부트로더 언락 여부 우회도 점점 어려워지기 시작함

원래 SafetyNet 우회는  SafetyNet 에 있던 버그 덕에 동작 하던 거였거든

이 이후부터 John Wu가 루팅 우회에 대한 깃헙 이슈를 자동으로 닫아버리기로 결정했고

루팅 우회에 대한 업데이트도 끊기게 됐음


이 소식을 다루던 글 제목이 아직도 생각이 남 "Magisk Unmasked"


근데 이게 루팅 우회만 와장창 낸게 아니라 커스텀 롬들도 와장창 냈다는 점임

이 SafetyNet 테스트에서 통과를 못하면 구글 플레이 스토어에서 넷플릭스 같은 앱 설치가 불가하게 됨은 물론이고 Google Pay 등의 서비스도 이용할 수 없게됨.

이러한 상당한 제약 때문에 LineageOS를 제외하고는(요즘 LineageOS 개발자들이 비공식적으로 SafetyNet 우회 소프트웨어를 개발중임 #참고)

거의 대다수의 커스텀 롬들은 SafetyNet 우회를 하기 위해서 시스템 내부에 SafetyNet 우회 기능을 도입하게됨 (ProtonAOSP가 그 시작점임. Zygote와 init을 통한 방식임.)

이외에도 Build Fingerprint를 다른 기기 걸로 대체해서(대부분 Pixel 기기) SafetyNet 기기 인증을 받기도 함.


본래는 Magisk 등의 루팅툴에 대해 싱거운 반응을 보이던 커스텀 롬 개발자들이 Magisk에서 상당부분 영향을 받으면서

이런 저런 우회 기능을 도입하고 되려 Magisk 탐지를 어렵게 하기 위해 우회 방책을 고려하는 점 등이 참 신기한 부분임.


어찌됐건 이 이후 John Wu가 구글 보안팀에 입사 하게 됐고 안정 버전 v24에서 루팅 우회는 프로젝트에서 완전히 빠졌음 (#참고).

그럼 더 이상 우회는 불가능 한가?? 아님 ㅋㅋ

위에 언급한 Zygisk 기능을 이용한 DenyList 기능을 통해서 

루팅 우회를 다른 개발자들에게 완전히 맡김으로서 오히려 활로를 열어주게 됨. #John Wu의 트윗

저 링크를 보면 얼추 이해가 가겠지만, DenyList란건 루팅, 모듈 등 모든 Magisk의 변경 사항을 거꾸로 적용함.

본래는 모듈을 통해서 MagiskHide에 부가적으로 이것 저것 덧붙이는 방식이었는데,

이제는 걍 아예 Zygisk를 통해서 Zygote에 직접 코드 주입이 가능하게 되니까 엄청 강력해지게됨.


Google 내에서 이걸로 말이 좀 나왔다고 하던데 그럼에도 불구하고 이 Magisk 프로젝트 및 개발자가 안드로이드에 준 영향이 크다보니

어찌저찌 밀고나가는 모습임.


대표적인 우회 모듈로는 

위 ProtonAOSP 개발자 kdrag0n이 개발한 safetynet-fix (오픈소스)

그리고 밑에서 다룰 LSposed의 개발팀과 Riru-MomoHider의 개발자 canyie, 그리고 riru-unshare의 개발자 vvb2060이 합세해서 개발한 Shamiko(클로즈드 소스)

가 있음

Shamiko가 클로즈드 소스가 된 이유로는 모듈 속의 우회기능 탐지를 더 어렵게 하기 위함도 있지만

MomoHider의 악용사례(누군가 소스를 변조해서 게임 치팅에 사용했었다고함..)를 겪고나서 그러한 사례를 막기 위함이라고 함.

개인적으론 LSposed 자체가 꽤 믿을만한 프로젝트 인지라 Shamiko도 이용중임


모듈 레포 또한 다른 방식을 지원하게 됐음.

본래는 John Wu가  Magisk-Modules-Reposubmission을 받아서 직접 관리했었는데

이미 Magisk 프로젝트로도 벅찬 상태였던지라 언젠가 모듈 레포 관리를 그만둘거라고 언급했고

안정 버전 v24에서 기능이 제거됐음.

대신 모듈내에서 직접 업데이트 링크를 달아서 업데이트 버튼을 누르면 업데이트가 되도록 바뀌었음.

물론 갠적으론 살짝 보안 위험이 있지않나 싶긴함.


이제 보안 쪽을 잠깐 다뤄보면

위에서 말했듯이 Magisk 개발자 John Wu가 안드로이드 보안 취약점을 상당히 연구했기 때문에

Magisk 또한 안전하게 하고 싶어 했음.

그래서 Magisk 모듈 레포에서 SeLinux를 꺼버리거나 하는 모듈은 드랍해버림.

트윗으로도 SeLinux 제발 제발 끄지마라고 널리 알려서

대다수의 유저들 또한 SeLinux의 중요성, 필요성에 대해서 인지하게 됐음.

덕분에 대다수의 모듈들 또한

SeLinux를 Permissive(SeLinux를 꺼버리는 것. 보안에 상당히 취약해지고 루팅 탐지또한 쉬워짐.)로 설정하는 대신

Magisk가 지원하는 커스텀 SePolicy 정책을 주입하는 방식을 사용하게됨.


1-2. Xposed의 변화

요건 좀 짧을 거임!

다들 Xposed가 뭔지는 알거라고 생각함!

Xposed는 rovo89가 개발하던, 기본적으로 앱을 직접 변조하지 않고 DEX와 ART를 후킹해서 시스템 및 앱의 기능을 추가하거나 숨기거나(광고등) 언락하거나 하는 등의 커스터마이징 프레임워크임. #참고

안드로이드가 빠르게 변화하다보니 개발 속도를 맞추지 못해서 2017년도에 개발이 멈춰버렸음.

이걸 이어가기 위해서 ElderDrivers라는 팀이 EdXposed를 개발하게 됨.

그런데 Magisk 모듈 레포에 버전 업데이트를 안하고 

안정버전이 만들어 질 때까지 EdXposed Manager 내에서 베타, 불안정 버전을 계속 내고

이런 저런 사건사고도 있었고(누군가 소스에다가 설치하면 데이터 파티션을 포맷해버리는 악질 장난을 친게 그대로 Github Action 자동 빌드를 통해 배포 됐는데 설치하면 데이터 파티션 십창났었음)

지속적으로 계속해서 루팅탐지 앱들에 탐지가 되고

EdXposed 모듈 레포에 지속적으로 보안에 위협이 되는 앱들이 올라오고

Magisk 모듈 레포에서 설치할때마다 폰이 부트루프, 이른바 벽돌이 되는 등 문제가 심각하다보니

John Wu가 아예 Magisk 모듈 레포에서 드랍해 버림으로써 주목받지 못하는 프로젝트가 됐고 

이런 저런 대체제가 나오면서 2021년에 개발이 끊기게 됨.


한때 Magisk 모듈 레포에 있었던 TaiChi 프레임워크라는 클로즈드 소스 소프트웨어가 인기를 끌었는데,

이유인 즉슨 클로즈드 소스라 루팅 탐지 앱들이 탐지를 못하고

Xposed 모듈 또한 TaiChi 프레임워크 내부 허용 리스트에 등재된 것만 사용하고

루팅이 안된 기기에서도 일부 데이터 파티션 앱을 직접 변조, 재설치 방식으로 사용이 가능했기 때문임.

근데 이거 알고보니까 백도어가 있었고 그게 중국의 어떤 회사에 유저 정보가 넘어가고 있다는 사실이 밝혀지면서

크게 논란이 일었음. John Wu가 제보를 받고 Magisk 모듈 레포에서 제거하고, 앞으로 클로즈드 소스, 회사에서 개발한 모듈은

아예 submission을 거부하고 이미 있던것도 제거하겠다고 하면서 일단락됨. #참고


자, 그래서 요즘은 어떤 게 쓰이느냐 하면

Magisk 개발에도 상당부분 기여를 하고 있는 LSposed 팀의 LSposed Framework임.

EdXposed에서 소스를 포크 했지만 개발 방식은 EdXposed와 다르게 매우 안정적이고

보안, 탐지 우회 등에 신경을 쓰면서 개발이 이루어 지고 있음.

이것도 Zygote에 코드를 주입하는 방식임!

본래는 Riru를 썼지만 Magisk가 Zygisk를 정식으로 지원하면서 Zygisk 또한 지원중임.

참고로 EdXposed완 다르게 매니저가 앱으로 설치되지 않고 바로가기만 추가되는데

시스템앱에 Zygote를 통한 코드 주입으로 기생하는 방식이기 때문임.

Xposed적인 방식으로 Xposed Manager를 주입했다고 볼수 있음.

어쨌든 이런 덕에 탐지는 더 어려워짐 :)

참고로 LSposed 팀과 Magisk는 긴밀하게 협력하면서

지속적으로 진척을 이뤄내곡 있음.

Magisk Github 커밋이랑 기여자 명단 보면 쉽게 알 수 있을거임!


1-3. 커스텀 리커버리의 변화

내가 처음 접한 커스텀 리커버리는 갤럭시 S2에 터치위즈 기반 커스텀 롬 설치하면서 썼던 Philz Touch Recovery였음.

다만 안드로이드가 변화하면서 대부분의 커스텀 리커버리들이 명맥이 끊기고

살아남은 건 Team Win Recovery Project#참고

이외에도 몇몇 리커버리가 있지만

거의 TWRP를 포크한 프로젝트들임

#SHRP #OFRP #PBRP


이 커스텀 리커버리란건 보통 커스터마이징의 시작점으로 볼 수 있음.

이게 없으면 커스텀롬 설치고 루팅이고 뭐고 거의 불가능에 가까우니까.

아무튼 이 TWRP도 안드로이드 4.3부터 시작해서 안드로이드 12.1에 이르기까지 정말 기나긴 역사를 가지고 있음.

TWRP도 한때 안드로이드의 최신 변경점을 못따라가서 

램디스크를 구세대 안드로이드 램디스크로 대체해버리는 바람에 보안에 애로사항이 꽃폈는데

이걸로 Magisk 개발자가 한소리 했었음 #트윗

당연하지만 TWRP 개발자들도 이렇게 하고 싶어서 하는 건 아니었기 때문에

트윗을 보고 고민하다 Magisk의 램디스크 패칭 방식을 사용하면서 해결함

Magisk가 항상 최신 안드로이드의 변경점을 따르기 때문임.


한동안 개발자가 육아 때문에 바빠서 개발이 좀 밀렸었는데

최근에는 지속적으로 안드로이드 최신 변경점을 따라잡으려고 노력하면서 개발이 계속 이뤄지고 있음

현재 안드로이드 11 까지 데이터 파티션 해독(Storage Decrypt)을 지원함

안드로이드 12는 개발중


기타.

WSA Magisk 설치 및 GApps 설치와 이것이 안드로이드 x86 및 안드로이드 에뮬레이터에 준 영향


WSA(Windows Subsystem for Android)는 마이크로소프트가 윈도우 11에서 프리뷰로 공개한

안드로이드 서브시스템임. 

WSL(Windows Subsystem for Linux)의 안드로이드 버전이라고 보면 될 듯함.


이게 나름 쓸만하면서도 애매한 게, 바로 구글 앱이 하나도 없다는 점임.

아마존하고 협력해서 구글 플레이 스토어 대신 아마존 앱스토어가 들어갔음.

이게 앱 풀도 너무나도 적고 하다보니 유저들이 어떻게 방법 없나 물색하다가 방법을 찾아냄.

처음에는 우분투 같은 OS에서 시스템 이미지를 마운트 해서 직접 파일을 넣어야했는데 

WSAGAScript 프로젝트가 나오면서 스크립트를 통해 좀 덜 번거롭게 OpenGApps(오픈소스 스크립트를 통해 최신버전으로 자동 패키징 되는 구글 앱 패키지) 설치가 가능해짐.

그래도 설치가 번거로웠는데

위에서 언급한 LSposed팀이 Github Action을 통해 설치방식 완전히 자동화 시켰음. MagiskOnWsa

원래는 Magisk 설치만 가능했는데 위의 WSAGAScript의 방식을 적용해서 GApps도 자동으로 설치가능하게 됐음.

선택 가능한 옵션.


이렇게 Magisk를 WSA에 설치 가능하게 된 이유는 

Magisk 개발자가 관심을 보였기 때문임.

참고로 나오고 나서

I'm Rooting WINDOWS!!!!!

라면서 다들 좋아했음 ㅋㅋ

아무튼 이전까지만 하더라도 Magisk 개발자가 딱히 관심을 두지 않았기 때문에 설치가 거의 불가능했다면

이제는 Magisk가 x86을 지원 하면서 안드로이드 에뮬레이터들 또한 Magisk 설치가 가능해졌음. #참고



커스텀 롬은 글 하나 더 쓸 예정!