Fail0verflow 팀에서 Tegra X1 부트롬 취약점을 오픈 그래픽 지원공개하면서, 예제 페이로드로 닌텐도 스위치용 코어부트와 U-boot, 그리고 리눅스 커널을 공개했습니다.
이게 빠르게 가능했던 이유는 닌텐도 스위치가 사용하는 SoC 가 그 유명한 리누스 토르발즈의 Nvidia, [욕설 검열됨] 이후로 엔비디아가 커널 지원과 오픈 그래픽 지원을 메인라이닝한 SoC 중 하나인 Tegra X1 이어서였는데요, 그 덕분에 닌텐도 스위치는 단순한 게임 콘솔을 넘어, 리눅스 태블릿 PC 로서의 활용도 가능한 기기가 되었습니다.
이 포스트에서는 이때 공개된 코드 중, 유지보수되고 있는 커널 브랜치를 이용하여, 스위치에서의 리눅스 커널 부팅에 필요한 파일들을 빌드하고, 미리 준비된 rootfs 를 이용해 GNOME 시스템을 띄우는 방법을 설명하고자 합니다.
면책 조항: 이 핵을 수행함으로서 발생하는 모든 피해에 대해 본 글의 작성자는 책임이 없음을 미리 밝혀 둡니다.
0. 알려진 이슈
2018-05-30 현재, 스위치 리눅스 커널의 Power management 코드가 영 좋지 않은 상태입니다. 여러 사람들이 battery desync 이슈를 경험하고 있으므로 이에 주의해 주시길 바랍니다.
배터리 desync 이슈에 대한 알려진 해결책은 스위치를 완전 충전한 뒤, 배터리 커넥터를 분리하고 5분 방치 후 다시 연결하는 방법이 있습니다(분해 필요)
불완전한 드라이버
메인라인 커널의 테그라 X1 지원 코드가 완벽하지 않아, 오디오 입출력과 USB OTG가 동작하지 않습니다.
불완전한 펌웨어
닌텐도 스위치가 사용한 와이파이/블루투스 콤보 칩 BCM4356 의 A3 리비전을 사용한 기기가 현재 닌텐도 스위치가 유일합니다. 이에, 해당 무선 모듈의 블루투스 펌웨어가 공개되어있는 것이 없는 상태입니다. (닌텐도 스위치 system 이미지에서 펌웨어 추출 필요.)
추가 이슈에 대해서는, Fail0verflow shofEL2 위키를 참조하시길 바랍니다
1. 준비물
우선, 커널 빌드와 리눅스 로딩을 위해, 다음의 것들이 필요합니다
- 적당히 빠른, 멀티코어 PC (xHCI 지원 필수)
- Docker 가 가동되는 리눅스 환경
- 개조된 조이콘 혹은 RCM 지그
- USB-C 케이블
또한 덤으로 있으면 좋은 것은
- UARTcon(가칭) 으로 개조할 오른쪽 조이콘 혹은 오른쪽 조이콘 레일
- 1.8V USB to UART 동글
입니다.
2. 빌드 준비
Docker 가 실행되는 리눅스 환경에서,
git clone https://gitlab.com/perillamint/switch-linux-scripts
를 실행합니다.
이후 switch-linux-scripts 디렉토리에서
sudo ./docker_run.sh
를 이용해, 빌드용 Docker 환경으로 진입합니다.
3. 리눅스 시스템 빌드
Docker 빌드 환경 안에서, 다음 명령을 순서대로 실행합니다.
./clone.sh
./toolchain.sh
./build.sh
./u-boot-scr.sh
./artifact.sh
해당 명령 실행 후, exit 명령을 이용해 Docker 빌드 환경에서 빠져나옵니다.
4. 로더 빌드
Coreboot를 로딩할 익스플로잇과, U-Boot 에 리눅스 커널을 로딩할 imxusbloader 를 빌드하기 위해 다음 명령을 실행합니다.
./minimal_clone.sh
./minimal_build.sh
5. Rootfs 설치
SD 카드에 MBR 형식으로 파티션 두개를 만든 뒤, 첫 번째 파티션은 vfat 으로 포멧하고, 두 번째 파티션은 ext4 로 포멧합니다.
두 번째 파티션을 마운트한 뒤, https://0w0.st/gnome__rootfs.tar.bz2 를 다운로드 받아, bsdtar -xpf gnome__rootfs.tar.bz2 -C mntpoint 명령으로 압축을 해제합니다
마운트된 SD카드를 언마운트 한 뒤, 닌텐도 스위치에 삽입합니다.
5. 익스플로잇 실행
닌텐도 스위치를 완전히 종료한 후, 지그를 꼽은 채 볼륨 업 버튼을 누르며, 전원을 켜 Tegra 복구 모드로 진입시킨 뒤 USB 케이블을 연결하고 다음 스크립트를 실행합니다
./load-docker.sh
이후 화면에 등장하는 펭귄을 감상합니다.