Switch 2 bị bẻ khóa: Lỗ hổng đầu tiên cho phép chạy mã tùy ý

Công nghệ22 tháng 10, 2026·6 phút đọc

Một nhà nghiên cứu bảo mật vừa công bố ns2jb, bản jailbreak phần mềm đầu tiên dành cho Nintendo Switch 2, cho phép chạy homebrew, mod game và sao lưu file save. Khai thác này kết hợp lỗi tràn bộ đệm trong dịch vụ hệ thống fs và lỗi tràn số nguyên của game SmileBASIC trên Switch 1.

Switch 2 bị bẻ khóa: Lỗ hổng đầu tiên cho phép chạy mã tùy ý

Switch 2 bị bẻ khóa: Lỗ hổng đầu tiên cho phép chạy mã tùy ý

Một nhà nghiên cứu bảo mật vừa công bố ns2jb, bản jailbreak phần mềm đầu tiên dành cho Nintendo Switch 2. Khai thác này cho phép chạy mã gốc tùy ý với quyền của các sysmodule thông thường, mở đường cho homebrew, mod game và sao lưu file save. Đáng chú ý, một phần quá trình nghiên cứu được hỗ trợ bởi các mô hình AI như Codex.

Jailbreak Switch 2 hoạt động như thế nào?

Theo mô tả từ tác giả, ns2jb là một jailbreak phần mềm, dạng tethered — nghĩa là mỗi lần khởi động lại máy, người dùng phải chạy lại quy trình khai thác. Công cụ này cho phép chạy mã gốc tùy ý dưới dạng bất kỳ sysmodule thông thường nào, kể cả sysmodule hệ thống fs (quản lý file). Nhờ đó, người dùng có thể chạy homebrew, dịch ngược và mod game Switch 2, sao lưu file save ra khỏi máy, và truy cập hầu hết ngoại vi của máy thông qua MMIO.

Để chứng minh năng lực của khai thác, nhóm nghiên cứu đã mod Mario Kart World — tựa game độc quyền của Switch 2 — thêm nhân vật mới. Phần mod này được viết hoàn toàn nhờ AI trong vòng một ngày và chủ yếu mang tính giải trí.

"Theo hiểu biết của tôi, đây là khai thác đầu tiên thuộc dạng này cho Switch 2." — tác giả chia sẻ.

Màn hình kết quả Mario Kart với nhân vật được modMàn hình kết quả Mario Kart với nhân vật được mod

Từ WebKit đến SmileBASIC: hai hướng tấn công song song

WebKit vốn là mục tiêu quen thuộc của các vụ jailbreak console, nên nhóm nghiên cứu ban đầu thử khai thác lỗ hổng WebKit (n-day) thông qua một captive portal Wi-Fi tùy chỉnh để có được quyền thực thi mã. Tuy nhiên, cách thay thế một đối tượng hàm JavaScript bằng đối tượng khác không thể tổng quát hóa thành các lệnh gọi IPC tùy ý, nên hướng này bị đánh giá là khó khả thi.

Song song đó, nhóm chuyển sang khai thác game Switch 1 chạy trên Switch 2. Lý do: các game cũ vẫn chạy được nhưng có thể chứa lỗ hổng chưa được v�� — điển hình là SmileBASIC, từng bị khai thác trên 3DS qua công cụ smilehax.

Trong trình thông dịch BASIC của SmileBASIC, nhóm tìm thấy lỗi tràn số nguyên 32-bit khi xóa phần tử khỏi mảng. Câu lệnh kiểm tra position + count <= array.length có thể bị tràn khiến tổng thành số âm, vượt qua kiểm tra hợp lệ. Kết quả là thao tác memmove sao chép 8 byte phía trước mảng — chính là con trỏ trỏ tới mảng đó — vào vị trí phần tử đầu tiên. Từ đây, độ dài chuỗi bị hiểu sai thành một giá trị khổng lồ, cho phép đọc/ghi ngoài biên bộ nhớ.

Sơ đồ cấu trúc khai thác và các thành phần hỗ trợSơ đồ cấu trúc khai thác và các thành phần hỗ trợ

Leo thang đặc quyền vào sysmodule fs

Sau khi có quyền thực thi mã trong userland và đạt được ROP, bước tiếp theo là xâm nhập vào các tiến trình đặc quyền hơn. Nhóm tập trung vào sysmodule fs vì đây là dịch vụ giải mã và cung cấp mã của các sysmodule khác — nghĩa là chỉ cần chiếm được fs là có thể đọc mã của toàn bộ hệ thống.

Lỗ hổng nằm ở lệnh IPC GetEntryType của IFileSystem: đường dẫn chứa thành phần thư mục cha kèm dấu gạch chéo ngược (như /..\) gọi tới một hàm phụ cấp phát bộ đệm heap tạm 0x301 byte. Đường dẫn dài hơn bộ đệm sẽ gây tràn bộ đệm, cho phép ghi đè con trỏ dữ liệu cache của đối tượng BufferedStorage để có quyền đọc/ghi bộ nhớ tùy ý.

Với khả năng này, nhóm đã quét bộ nhớ, tìm đối tượng kết nối của SmileBASIC và đặt PID đã lưu thành 1, qua đó có được quyền FullPermission — thực hiện các thao tác file hệ thống đặc quyền. Kết quả là toàn bộ bộ nhớ trong và mã của các sysmodule thông thường đều bị trích xuất.

Lỗ hổng logic trong quy trình nạp chương trình

Điểm mấu chốt tiếp theo nằm ở cách sysmodule ldr (loader) nạp chương trình. Game và sysmodule được phân phối dưới dạng Nintendo Content Archive (NCA), chứa hệ thống file ExeFS với file thực thi main và metadata main.npdm. Loader yêu cầu fs mở ExeFS, đồng thời dùng băm SHA-256 của header NCA và chữ ký của nhà phát triển để xác thực hai lớp.

Về lý thuyết, quy trình này an toàn về mặt mật mã. Nhưng trên thực tế, chính fs phải chịu trách nhiệm đảm bảo hệ thống file được cung cấp khớp với băm trong header NCA — và lúc này nhóm đã có khả năng đọc/ghi tùy ý trong fs.

Bằng cách thay thế handle mà fs chờ đợi cho kết nối IPC của loader bằng một event handle do mình kiểm soát, nhóm điều khiển được thời điểm fs xử lý yêu cầu. Nhờ đó, họ thay ExeFS bằng hệ thống file giả: main.npdm vẫn hợp lệ để vượt qua kiểm tra chữ ký, còn file main có thể chứa mã tùy ý. Kết quả là chạy được mã tùy ý với quyền của bất kỳ chương trình nào mà họ có file NPDM — tức là gần như tất cả.

Kết quả mục tiêu đạt được trong quá trình nghiên cứuKết quả mục tiêu đạt được trong quá trình nghiên cứu

Sử dụng NPDM của sysmodule ro — module duy nhất trong nhóm thông thường có quyền ánh xạ bộ nhớ thực thi — nhóm tạo được vùng nhớ ghi đè lên mã hiện có của fs. Từ đó, họ vá mã fs trực tiếp để có quyền thực thi tùy ý trong tiến trình hệ thống này.

Ý nghĩa với cộng đồng homebrew

Việc chạy mã tùy ý với quyền của bất kỳ sysmodule nào được đánh giá là rất mạnh. Nó cho phép nghiên cứu phần cứng mà không cần khai thác riêng từng trình điều khiển thiết bị, đồng thời tạo tiền đề tiến tới custom firmware (CFW) trên Switch 2.

Trong ngắn hạn, tác giả dự kiến tập trung vào việc giải mã giải phẫu các sysmodule khác, tìm lỗi trong các module như ldr hay ro, và hoàn thiện công cụ để cộng đồng dễ tiếp cận hơn.

Bên cạnh đó, tác giả cũng đặt ra một câu hỏi về hướng đi tương lai của Nintendo: liệu hãng có chuyển sang chỉ ánh xạ các sysmodule và mã game dưới dạng khối mã hóa mà chỉ nhân hệ điều hành hoặc secure monitor giải mã được? Nếu vậy, sẽ không còn bất kỳ vùng nhớ RX nào trong userland — nhưng cái giá là game không thể tự đọc mã của chính mình lúc chạy.

"May mắn thay, ngày đó vẫn chưa đến."

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗