티스토리 뷰

OS/Linux

ShofEL2, Tegra X1 and Nintendo Switch 사용하기

파란크리스마스 2018. 4. 25. 23:29
728x90

원문 출서 - 전체내용

By switch_enthusiast
Filed under switch vulnerability exploit linux

핵심적인 내용만 구글 번역한 내용입니다.

ShofEL2 및 Switch Linux에 오신 것을 환영합니다. 

Nintendo Switch (Tegra X1 플랫폼)에서 fail0verflow의 부트 스택을 수정하지 않고 범용 코드 실행 및 Linux 용으로 사용할 수 있습니다.

exploit(취약점 공격)을 릴리스할지 여부를 선택하는 것은 어려운 선택입니다.

과거의 콘솔에 대한 우리의 경험을 감안할 때, 우리는 본질적으로 해적 행위보다는 해적 행위에 사용될 수 있다는 두려움 때문에 취약성 세부 사항이나 악용 사례를 공개하는 것에 조심했습니다.

즉, Tegra bootrom 버그가 너무 분명해서 여러 사람이 지금까지 독자적으로 발견했습니다.

기껏해야 다른 사생 팀의 석방은 불가피하지만 최악의 경우 특정 해적판 모 듈팀이 첫 번째 조치를 취할 수 있습니다.

90 일 전 Tegra 칩은 Android 기기에서 주로 사용되기 때문에 책임있는 공개 프로세스가 시작되었습니다. 공개 기한이 지났습니다. 버그는 조만간 공개 될 것이며, 우리는 리눅스 부트 체인과 커널 트리와 함께 출시 할 것입니다.

각각은 여러 가지 독립적 인 방식으로 수행 될 수 있습니다. 이것이 iPhone 사용자가 USB를 통해 부팅 할 때마다 수행해야한다는 점에서 "묶인 탈옥"이라고 부르는 것입니다. 이 버그는 부트 ROM에 있기 때문에 하드웨어 개정 없이는 패치 할 수 없습니다. 즉, 현재 존재하는 모든 스위치 유닛은 영원히 취약합니다. Nintendo는 제조 과정 중에 Boot ROM 버그 만 패치 할 수 있습니다. 이 취약점은 부팅 프로세스 초기에 발생하므로 Boot ROM 자체 및 모든 암호화 키를 포함하여 모든 장치 데이터와 암호를 추출 할 수 있습니다. 또한 하드웨어 손상이 없거나 돌이킬 수없는 변경 사항 (예 : 퓨즈 끊김)이없는 한 Tegra 장치를 해제 할 때 사용할 수 있습니다. 그리고 이것은 내장 된 eMMC 스토리지를 만질 필요가없는 부팅 시간 버그이기 때문에 기존 소프트웨어에 대해서는 사용이 완전히 감지되지 않습니다. 온보드 메모리를 변경하려고하지 않는 한, USB 익스플로잇을 통해 리눅스를 부팅하고 (보통의 부팅을 통해) 스위치 OS를 영구적으로 이중 부팅 할 수 있습니다 (예 : 리눅스 파일 시스템 두 번째 SD 카드 파티션 또는 다른 SD 카드).

우리가 재미와 자작 등을 위해이 일을한다는 것을 분명히하기 위해서입니다.


우리가 계획하고있는 것이지만, 90 일 공개 창이 4 월 25 일에 만료되기 2 일 전에 누군가가 0 일 버그를 게시했습니다. 오 잘. 예, 이것은 fusée gelée에서 악용 한 것과 동일한 버그입니다. 다른 일부 그룹이 누출 한 것입니다 (그러나 먼저 발견했습니다).

우리가 blogpost / repos를 준비하지 못했기 때문에 (이것은 우리와 마찬가지로 procrastinators가되었지만) 약간의 어려움이있을 것입니다

What’s this all about anyway?

Nintendo Switch 내부의 Tegra X1 (Tegra210이라고도 함) SoC에는 모든 서명 검사를 우회하여 조기 실행을 제어 할 수있는 악용 가능한 버그가 있습니다. 이 버그는 RCM 모드에서 Tegra 장치를 처음으로 깜박이고 bricked 장치를 복구하기위한 USB 기반 복구 모드입니다. 일반적으로 RCM 모드는 서명 된 이미지 만로드 할 수 있지만 버그로 인해 임의 코드가 실행될 수 있습니다.

즉, 스위치에서 코드를 실행하려면 완전히 독립적 인 두 가지 작업을 수행해야합니다.

  1. Enter RCM mode
  2. Execute the USB-based exploit

Entering RCM mode

  1. 이전 커널 모드 코드 실행
    예 : WebKit 익스플로잇과 커널 익스플로잇을 진입 점으로 사용하기
  2. eMMC가 제거되면, Tegra는 부팅시 RCM 모드로 들어갑니다.
  3. 스위치의 볼륨 높이기, 홈 및 전원 버튼을 동시에 누릅니다.

Joy-Con 홈 단추는 여기에서 작동하지 않습니다. Nintendo 스위치 자체의 비밀 홈 버튼에 대해 궁금 할 것입니다. Tegra가 Home 버튼이라고 부르는 것은 실제로 오른쪽 Joy-Con 커넥터의 핀 10 (가장 왼쪽의 핀)에 연결됩니다. 간단한 철사를 사용하여 예를 들어 철로로 연결할 수 있습니다. 레일에 나사 (가장 쉬운) 또는 핀 10과 7 (또는 1) 함께 (10과 9는 작동하지 않음). Micro USB 커넥터 (Joy-Con 커넥터와 동일한 핀 피치)를 사용하여 작은 지그를 쉽게 인쇄하거나 커넥터의 기증자로 분리 된 Joy-Con을 사용할 수도 있습니다. 조이 콘 (Joy-Con) 레일이 UART이기 때문에 후자가 유용합니다. 우리는 코어 부트, u- 부트 및 리눅스를위한 콘솔로 오른 손잡이 조이 콘 포트를 사용합니다.

Executing the USB-based exploit

USB 악용에는 USB 호스트가 필요합니다. 익스플로잇은 또한 매우 긴 컨트롤 전송을 필요로하는데, 불행하게도 일부 OS는 만족스럽지 않다. xHCI 컨트롤러 (USB 3.0 또는 최신 시스템의 USB 포트)가있는 PC에서 바닐라 Linux를 사용하거나 EHCI (USB 2.0) 컨트롤러 및이 커널 패치가있는 PC를 사용할 수 있습니다. 이것은 안드로이드 폰 (적어도 xHCI 컨트롤러를 가진 사람들)에서도 실행될 수 있습니다. 안드로이드에 대한 익스플로잇 포팅은 독자에게 운동으로 남아 있습니다. 다른 Tegra 장치에서 그것을하기위한 보너스 포인트. 다른 스위치처럼.

Linux on Switch boot chain

우리의 부트 체인은 Pixel C 부트 체인을 기반으로하는 99 % 오픈 소스입니다.

(누가 Nvidia의 지저분한 L4T 커널 포크와 독점적 인 부트 로더를 사용하기를 원합니까?).

다음과 같이 보입니다.

BootROM Exploit → coreboot 로더 → coreboot → ARM 트러스트 된 펌웨어 → coreboot → u-boot → Linux

선택적으로 제공되는 유일한 폐쇄 소스 구성 요소는 Tegra210 DDR4 메모리 교육 코드입니다. 알려지지 않은 이유로 Pixel C의 바이너리 블롭 (blob)으로 릴리즈됩니다. Pixel C는 메모리로 복사되어 점프됩니다. 이 얼룩은 Pixel C 팩토리 이미지에서 다음과 같이 얻을 수 있습니다.

./build/util/cbfstool/cbfstool bootloader-dragon-google_smaug.7900.97.0.img extract -n fallback/tegra_mtc -f tegra_mtc.bin

이 BLOB에는 하드 코딩 된 테이블과 픽셀 C에 대한 "모든 것을 수행"진입 점이 포함되어 있지만 호출 트리 깊숙한 한 수준으로 건너 뛰고 사용자 정의 테이블을 전달할 수 있습니다.

이는 우리의 패치 된 coreboot가 스위치에서 DDR4를 구성하기 위해 수행하는 작업입니다. 이 얼룩이 없다면 스택은 여전히 ​​작동 할 것이지만, 메모리는 ~ 200Mhz에서 실행될 것이고 불필요한 성능은 절름발이입니다.

부팅 프로세스는 다음과 같습니다.

  1. Tegra는 BPMP (arm7) 코어에서 부트 ROM을 시작하고 RCM 모드로 들어갑니다.
  2. 호스트 기반 USB 익스플로잇 코드는 RCM 명령을 사용하여 작은 (~ 2.5K) 로더 (cbfs.bin)를 SRAM 메모리에 저장합니다.
  3. 익스플로잇이 트리거되어 ROM이 cbfs.bin으로 점프합니다.
  4. 그런 다음 호스트 코드는 CBFS 서버 모드로 들어가고 USB RCM 파이프를 통해 Tegra에 코어 부트 (coreboot)를 동적으로 제공합니다.
  5. cbfs.bin은이 CBFS 서버를 사용하여 coreboot 부트 블럭 인 coreboot의 첫 번째 28KiB를 SRAM에 요청한 다음 그 내용으로 이동합니다.
  6. 코어 부트 (coreboot) 부트 블럭은 기본 주변 장치를 초기화 한 다음 USB의 CBFS 서비스를 사용하여 롬 스테이지를 SRAM으로로드하고 점프합니다.
  7. coreboot romstage는 SDRAM (기본 고정 부팅 속도) 및 기타 주변 장치를 초기화합니다.
  8. 그런 다음 romstage는 전체 coreboot ROM을 SDRAM (여전히 부트 ROM RCM 모드 USB 루틴 사용)으로 다운로드하고 RAM 기반 CBFS로 전환합니다.
  9. 이제 romstage는 RAM CBFS에서 램 스테이지를로드하고 CCPLEX (Cortex-A57)를 시작하고 BPMP를 종료합니다.
  10. 이제 CCPLEX (EL3)에서 coreboot ramstage는 MTC BLOB를 사용할 수있는 경우 DDR4 교육을 포함하여 나머지 기본 시스템 초기화를 수행합니다.
  11. 이제 램 스테이지는 TrustZone 구현을 초기화하는 ARM 트러스티 드 펌웨어로 이동합니다. 이는 특정 OS 서비스를 제공하는 데 필요합니다.
  12. ARM Trusted Firmware는 이제 EL2 모드에서 실행되는 코어 부트 람시 (coreboot ramstage)로 돌아갑니다.
  13. 낙담은 최종 유료 하중 인 U-Boot로로드되어 점프합니다.
  14. U-Boot가 시작되고, 더 많은 하드웨어를 초기화하며, 기본적으로 자체 USB 드라이버를 사용하여 USB 다운로드 모드로 들어갑니다.
  15. PC 측에서 imx_usb_loader를 사용하면 Linux 커널과 initramfs와 같은 임의의 U-Boot 페이로드를로드하여 실행할 수 있습니다.

The code

  • https://github.com/fail0verflow/shofel2
  • https://github.com/fail0verflow/switch-arm-trusted-firmware
  • https://github.com/fail0verflow/switch-coreboot
  • https://github.com/fail0verflow/switch-u-boot
  • https://github.com/fail0verflow/switch-linux

죄송합니다. 일반 사용자가이 도구를 사용하는 데 필요한 안내서가 없으며 가장자리에 많은 것들이 너무 거칠어도 안됩니다. 개발에 진지한 사람이라면 스스로 생각하거나 IRC에 질문 할 수 있어야합니다.

우리는 Git 이력을 정리할 시간이 없었기 때문에 Git 이력은 지져분합니다. 너무 열심히 읽지 마십시오.

Coming soon

Proper write-up on the exploit, stories of porting Linux (yes, there’s more to it than a panel driver ;-) ), upstreaming status, how batshit insane DDR4 is, and more. Probably, anyway. We’re pretty bad at writing blogposts. 

 ¹ There are actually many Boot ROM bugs, several of which have been found by multiple people.

댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함