1 điểm bởi GN⁺ 2024-08-08 | 1 bình luận | Chia sẻ qua WhatsApp
  • Lỗi tràn bộ đệm strcpy trong quá trình xử lý gap name của tệp lưu Create-A-Park đã dẫn tới các khai thác qua tệp lưu và mạng trên nhiều nền tảng như original Xbox, Xbox 360, PS2 và GameCube
  • Bản THPS4 cho original Xbox sao chép chuỗi bị giới hạn 31 ký tự vào bộ đệm stack 32 byte mà không kiểm tra biên, cho phép ghi đè return address; sau đó dùng phần đầu tệp lưu và một phân đoạn dữ liệu có thể thực thi để chạy shellcode
  • Với THPS3, cùng đầu vào đó làm hỏng heap thay vì stack nên cần chuỗi ROP đi qua custom allocator và đường vtable, còn bản Xbox của THUG 1·2 bị chặn ở đường gap name do stack cookie
  • Trong chế độ nhiều người chơi của THPS4, máy chủ độc hại có thể gửi tệp park cho client để thực hiện thực thi mã từ xa và truyền tệp bất đồng bộ; hiện tượng rò rỉ bộ nhớ mạng lộ ra trong lúc truyền được né tránh bằng hot patch ngay trong exploit
  • Tony Hawk’s American Wasteland trên Xbox 360 cũng có thể chạy ROP qua lỗi tràn gap name, nhưng chỉ có thể thực thi toàn bộ mã hypervisor khi kết hợp với lỗi system call handler của 4548 kernel; mã nguồn và tệp lưu đã vá được công bố trên GitHub

Điểm khởi đầu: gap name và strcpy

  • Năm 2016, trong quá trình tìm một lỗi hack tệp lưu mới cho original Xbox, tệp lưu custom park của Tony Hawk’s Pro Skater 4 đã trở thành đối tượng phân tích
  • Tính năng Create-A-Park của THPS4 cho phép người chơi tự tạo skate park và đặt tên cho các gap, tức các đoạn nhảy
    • gap name là chuỗi do người dùng tự đặt, tối đa 31 ký tự cộng với null terminator
    • Nếu chuỗi này được xử lý bằng hàm như strcpy, nó có thể trở thành primitive gây hỏng bộ nhớ
  • Khi thay gap name bằng chuỗi lặp 0x41 dài trong một tệp lưu độc hại rồi chép vào Xbox để tải, máy bị crash và instruction pointer được đặt thành 0x41414141
    • Đây là dấu hiệu cho thấy gap name đã được sao chép lên stack và ghi đè tới cả return address
  • Phân tích bằng IDA cho thấy khi duyệt danh sách gap trong tệp lưu, trò chơi đã dùng strcpy để sao chép gap_name của save_file_gap_data vào gap_description gapDesc trên stack
    • Không có kiểm tra biên, nên việc sao chép tiếp tục cho tới khi gặp null terminator
    • Phiên bản game này được biên dịch không có stack cookie, nên có thể ghi đè dữ liệu stack và return address

THPS4 trên original Xbox: chuyển shellcode vào vùng có thể thực thi

  • original Xbox không có DEP phần cứng để chặn thực thi dữ liệu tùy ý như thiết bị hiện đại, nhưng các kernel về sau và game có một phần soft DEP
    • Cách này đổi địa chỉ selector của phân đoạn mã để chỉ cho phép thực thi dưới một ngưỡng địa chỉ nhất định
    • Stack và các vùng cấp phát heap chứa tệp lưu nằm ngoài vùng có thể thực thi
  • Phân đoạn dữ liệu đọc-ghi của file thực thi game nằm trong vùng có thể thực thi, nên chiến lược được dùng là sao chép mã vào đó rồi chạy
  • Tên park nằm trong phần đầu tệp lưu; khi người chơi chọn tệp lưu, 136 byte đầu của header sẽ được sao chép vào một struct trong phân đoạn dữ liệu của file thực thi để hiển thị trên UI
    • Không thể tùy ý sửa toàn bộ header, nhưng vẫn đủ chỗ để nhét một stub memcpy nhỏ
  • Luồng khai thác THPS4 trên original Xbox
    • Sau khi tải tệp lưu và trước khi nhấn “Start Game”, 136 byte đầu tiên được sao chép vào phân đoạn dữ liệu của file thực thi
    • Khi nhấn “Start Game”, gap name độc hại được sao chép lên stack và return address bị ghi đè bằng địa chỉ của stub sao chép shellcode
    • Khi hàm trả về, luồng nhảy tới stub sao chép để chép payload lớn trong bộ đệm tệp lưu sang phân đoạn dữ liệu có thể thực thi
    • Sau khi sao chép, nó nhảy tới payload để giành thực thi mã tùy ý

Vượt kiểm tra chữ ký và habibi key

  • Sau khi giành được khả năng thực thi mã trên original Xbox, bước tiếp theo là vô hiệu hóa kiểm tra chữ ký và chạy file thực thi unsigned
  • Payload được xây dựng dựa trên payload của tệp lưu softmod installer 007 Agent Under Fire có sẵn
    • Nó tìm địa chỉ của các hàm và dữ liệu kernel, rồi tìm địa chỉ RSA public key dùng để xác minh chữ ký file thực thi
    • Nó tắt write protection của machine state register và vá RSA public key thành habibi key
    • Sau đó nó chạy file thực thi phụ đi kèm trong tệp lưu; trong lúc thử nghiệm, file thực thi nyan cat đã được dùng
  • Cặp habibi key pair được cho là khóa RSA do một nhóm hacking Linux trên original Xbox tạo ra vào đầu những năm 2000
    • Thay vì bắt kernel luôn vượt qua kiểm tra chữ ký RSA, họ đổi public key sang khóa của mình để chạy Linux loader
    • Đây là một lựa chọn nhằm ngăn tệp lưu đó bị dùng để chạy nội dung sao chép lậu, nhưng về sau các nhóm khác đã công bố các tệp exploit để cài hack lâu dài
  • Điều đáng chú ý là modulus của habibi public key chỉ khác 4 byte so với Microsoft RSA public key
    • Exponent có vẻ như cũng phải đổi thành 3, nhưng các payload shell code hiện có lại không thay exponent
    • Cách nó hoạt động chính xác vẫn chưa thực sự rõ
  • Cách dùng habibi key được chọn vì khả năng tương thích với nhiều phiên bản kernel Xbox
    • Nếu vá hàm xác minh chữ ký để luôn trả về true thì phải dò pattern lệnh theo từng phiên bản kernel
    • Với habibi key, chỉ cần vá 4 byte trong vùng nhớ dễ tìm là đủ

Phân tích các biến thể: THPS3, THUG, THAW

  • Tony Hawk’s Pro Skater 3

    • THPS3 cũng có Create-A-Park và gap name, nhưng không bị crash ngay sau khi tải file lưu độc hại
    • Vẫn có thể trượt ván trong game, và console sẽ crash khi chọn “quit game”
    • gap name được sao chép vào heap chứ không phải stack, và overflow ghi đè allocation header của lần cấp phát heap kế tiếp
    • Khi allocation kế tiếp được free, các con trỏ trong header sẽ dẫn tới vtable có chứa cleanup routine function pointer
    • THPS3 không sao chép save file header vào data segment có thể thực thi như THPS4, và dữ liệu save file cũng nằm trong vùng nhớ heap không thể thực thi
    • Ghi đè con trỏ pAllocOwner để kiểm soát vị trí nạp cleanup function pointer, rồi dùng ROP chain trong bộ nhớ save file bằng stack pivot
    • ROP chain chỉ với vài gadget sẽ sao chép shellcode trên heap sang data segment có thể thực thi rồi nhảy tới đó
    • Sau đó, giống payload generic “hack xbox kernel” cho THPS4, nó vá habibi key và cho phép chạy executable không ký
  • Tony Hawk’s Underground 1 & 2

    • Khi fuzzing gap name trong THUG, thay vì access violation thì xảy ra full bug check cùng thông báo Buffer overrun detected!
    • File thực thi có kiểm tra stack cookie
    • stack cookie là một giá trị ngẫu nhiên đặt trước return address, và sẽ kiểm tra xem giá trị đó có bị thay đổi trước khi hàm trả về hay không
    • Để ghi đè return address thì phải biết giá trị cookie, nhưng ở đường gap name không có cách nào để leak nó
    • Có các biến có thể bị hỏng nằm sau gap name buffer và trước stack cookie, nhưng chúng nhanh chóng bị mã game ghi đè nên không hữu ích cho exploit
    • Cũng đã xem xét SEH exploitation, nhưng không có cách nào gây exception trong phần mã còn lại trước khi stack cookie check diễn ra, và tại thời điểm đó cũng không có exception handler nào được đăng ký để đi qua SEH chain
    • THUG2 trên Xbox cũng không thể bị exploit qua gap name vì cùng lý do
    • Tuy vậy, vẫn tồn tại các lỗi strcpy khác và các lỗi có thể exploit theo hướng heap-based
    • Các bản PlayStation 2, PC, và có lẽ cả GameCube được biên dịch không có stack cookie nên có thể exploit bằng gap name buffer
  • Tony Hawk’s American Wasteland

    • THAW là game ra sau THUG 1·2 nên được dự đoán là có stack cookie, nhưng bản Xbox lại được biên dịch không có stack cookie
    • Nó dễ bị tấn công bởi gap name buffer overflow, và exploit được xây dựng gần như giống hệt THPS4

THPS4 network RCE: hack client không cần save file

  • Vì exploit save file cần memory card, nên multiplayer LAN game được chọn làm bề mặt tấn công có rào cản thấp hơn
    • Nếu dùng park tạo bằng Create-A-Park trong LAN multiplayer, host sẽ gửi save file qua mạng và client sẽ tải nó
    • Từ đó hình thành giả thuyết rằng có thể hack console client bằng cách gửi park file độc hại
  • Để host không tự hack chính mình, file thực thi của game được sửa để chặn lỗi strcpy, đồng thời thêm cả code segment cho các hàm bổ sung
  • Ban đầu client có thể kết nối vào host và trượt ván bình thường, nhưng payload không chạy và buffer overflow cũng không bị kích hoạt
    • Dữ liệu park file trong bộ nhớ phía client đã bị biến đổi khác với file exploit
    • Sau khi host tải park file, nó lại lưu từ bộ nhớ rồi gửi kết quả đó sang client, khiến dữ liệu exploit bị hỏng
  • Sau khi NOP hóa function call đó, client nhận park file độc hại và bị compromise, thể hiện qua việc màu LED thay đổi
  • Trên đường mạng, save file header không được sao chép vào data segment nên không thể dùng shellcode copy stub của exploit cục bộ THPS4
    • Thay vào đó dùng ROP chain tương tự THPS3 để sao chép shellcode sang vùng nhớ có thể thực thi

Phát hiện mã nguồn THUG và tận dụng network code

  • Cần chuyển payload executable phụ sang client qua mạng, nhưng không thể đặt kèm file trong save game folder như exploit save file cục bộ
  • Cũng đã xem xét cách nạp executable từ burned CD hoặc địa chỉ mạng cục bộ, nhưng không được chọn
    • Xbox winsock implementation mặc định dùng secure socket connection, nên phải tái hiện lớp bảo mật của Xbox bằng Python script
  • Trong lúc tìm tài liệu liên quan tới park save file, việc tìm chuỗi Sk4Ed_Dead đã dẫn tới kho thug trên GitHub
    • Đây được xác định không phải homebrew tool mà là toàn bộ mã nguồn game Tony Hawk’s Underground
    • Dù không phải chính THPS4, codebase đủ tương đồng để tận dụng cho networking code và viết hook
  • Trong mã nguồn có code tải park file và đúng line chứa lỗi strcpy
    • Có thể tái dựng Visual Studio project file, sửa một số compiler error và tạo ra bản build có thể chạy với final game asset
    • Dù không hoàn toàn giống bản cuối cùng, đây có vẻ là mã rất gần với nó
  • Mục tiêu được nâng từ RCE đơn thuần lên việc âm thầm giành RCE trên console tham gia trận đấu, bật khả năng chạy unsigned code rồi truyền executable phụ ngay trong lúc chơi game

Khôi phục luồng thực thi và truyền file bất đồng bộ

  • Để truyền payload trong khi client vẫn tiếp tục chơi game, cần khôi phục luồng thực thi của game sau khi chạy shell code
  • ROP chain được sửa để lưu stack pointer hiện có trước khi stack pivot, rồi khôi phục lại về sau sau khi shell code chạy xong
    • Sau đó nó sao chép shell code sang vùng nhớ có thể thực thi và nhảy tới đó
  • Networking system của game có cấu trúc đăng ký message ID và handler function, rồi gọi handler tương ứng với ID của thông điệp nhận được
  • Một giao thức truyền file đơn giản được hiện thực bằng cách đăng ký message ID không dùng tới
    • Khi client kết nối, nó gửi MSG_ID_PAYLOAD_REQUEST tới host để bắt đầu truyền
    • Host gửi dữ liệu payload bằng thông điệp MSG_ID_PAYLOAD_DATA
    • Khi client nhận PAYLOAD_MSG_ID_END thì quá trình truyền hoàn tất

Lỗ hổng rò rỉ bộ nhớ 15 năm tuổi và hot patch

  • Trong lúc truyền file, console client bị crash do null pointer dereference
  • network data allocator trả về NULL, và số byte trống trong networking memory pool giảm xuống 0
  • Trong mã nguồn THUG có đoạn code giải phóng message data buffer, nhưng bản THPS4 shipped build lại không có bản sửa đó
    • Buffer p_data của stream_desc không được giải phóng sau mỗi thông điệp, khiến networking memory pool bị cạn kiệt
    • Trong chơi multiplayer thông thường, điều này có thể không thành vấn đề trừ khi ở lại quá lâu
  • Exploit hook vào client code và hot patch để giải phóng buffer p_desc->p_data bằng đúng free function
  • Sau hot patch, việc truyền file thành công trên cả host lẫn console client, và client đã chạy executable nyan-cat
    • Cũng đã dùng tunneling app để thử cùng exploit này từ xa trên console của bạn ở khu vực khác

Luồng exploit mạng cuối cùng trên original Xbox

  • client kết nối tới host console độc hại và nhận file park “Hack Xbox” qua mạng
  • khi client phân tích file park, xảy ra buffer overflow, địa chỉ trả về trên stack bị ghi đè và chuỗi ROP bắt đầu
  • chuỗi ROP sao chép toàn bộ shellcode payload vào vùng bộ nhớ có thể thực thi rồi nhảy tới đó
  • shellcode thiết lập các hook và bản vá cần thiết trước khi quay lại chạy game, rồi spawn người chơi vào trận đấu
  • trong khi người chơi đang trượt ván trong game, host gửi file thực thi sang client và client lưu nó vào HDD
  • sau khi truyền file hoàn tất, shellcode vá kernel của client sang trạng thái sử dụng habibi key rồi boot file thực thi thứ cấp đã được truyền sang
  • nếu không đổi màu LED, người dùng sẽ khó nhận ra tiến trình đang diễn ra cho đến khi một ứng dụng khác đột ngột được boot

Xbox 360: THAW và kernel 4548

  • Tony Hawk’s American Wasteland trên Xbox 360 cũng dễ bị tấn công bởi buffer overflow ở gap name
  • mục tiêu là exploit console trên phiên bản kernel mới, nhưng điều đó là bất khả thi nếu không có lỗi hypervisor mới
  • thay vào đó, có thể kết hợp lỗi strcpy của THAW với lỗi system call handler của kernel 4548 đã biết để tạo ra exploit chỉ dùng phần mềm đầu tiên trên Xbox 360
  • bản hack King Kong trước đó trên Xbox 360 dùng file shader đã chỉnh sửa để thực hiện arbitrary write vào bộ nhớ kernel và exploit lỗi system call handler
    • cách này đòi hỏi phải mở console và sửa firmware ổ DVD để dùng đĩa King Kong đã chỉnh sửa
    • lỗi save game có thể trở thành một entry point khác để khởi động chuỗi ROP

Chữ ký file save trên Xbox 360 và vai trò của console phát triển

  • file save game trên Xbox 360 được ký bằng cặp khóa RSA riêng cho từng console
    • kho khóa của mỗi console có chứa khóa mật mã dùng để ký save game
  • lý do console khác có thể xác thực file save là vì khóa công khai RSA được chứa trong phần header của file save
    • bản thân khóa công khai này lại được ký bằng một cặp khóa RSA khác chỉ Microsoft sở hữu
    • không thể tùy ý nhét bất kỳ khóa công khai nào vào header rồi cho qua xác thực
  • để dùng file save đã bị chỉnh sửa tùy ý trên console khác, cần có key store đã giải mã của ít nhất một console Xbox 360 nào đó
  • điểm khởi đầu của việc hack Xbox 360 là console phát triển và vụ rò rỉ SDK
    • do mã thực thi được mã hóa, không thể tìm lỗi nếu không thể kiểm tra code từ bên ngoài
    • console phát triển và SDK cung cấp thông tin cần thiết để giải mã executable code và đảo ngược boot chain, hypervisor và mã game

Lỗi system call handler 4548

  • Xbox 360 có hypervisor real mode và kernel mode
    • hypervisor real mode là chế độ có đặc quyền cao nhất
    • trong kernel mode, hệ điều hành và game chạy
  • CPU có một cryptography unit bên cạnh L2 cache phụ trách mã hóa và hashing bộ nhớ
    • trong kernel mode, các trang hypervisor hiện ra ở trạng thái đã mã hóa + hash; nếu ghi đè tùy ý thì khi hypervisor truy cập, console sẽ dừng hẳn
  • trong real mode, 32 bit cao của địa chỉ vật lý 64 bit được dùng để điều khiển mã hóa và hashing
    • áp dụng mask 0x80000000.00000000 sẽ cho phép truy cập bộ nhớ mà bỏ qua mã hóa và hashing
    • ở những nơi kernel mode có thể cung cấp địa chỉ vật lý cho hypervisor, 32 bit cao bắt buộc phải được xóa
  • system call handler bình thường dùng lệnh slwi để dịch trái ordinal của system call 2 bit, bỏ 32 bit cao của kết quả và chỉ dùng offset 32 bit
  • system call handler của kernel 4548 dùng sldi thay vì slwi
    • sldi hoạt động trên 64 bit nên 32 bit cao của r0 cũng được tính vào phép tính offset chỉ số bảng
    • kiểm tra phạm vi ordinal chỉ áp dụng cho 32 bit thấp của r0
    • ví dụ, 0x20000000.0000003F có thể vượt qua kiểm tra phạm vi trong khi tạo ra offset 0x80000000.000000FC, từ đó dẫn tới truy cập bộ nhớ không được bảo vệ
  • thay đổi này được đánh giá nhiều khả năng là lỗi compiler hơn là một chỉnh sửa có chủ đích từ developer

Cấu trúc exploit Xbox 360

  • Nếu ghi đè encrypted hypervisor memory view ở kernel mode thì thông thường console sẽ bị halt, nhưng nếu khiến system call handler đọc function pointer từ một địa chỉ có bit bảo vệ cấp cao được thiết lập, nó có thể đọc giá trị đã bị ghi đè mà không gây fault
  • Các bước exploit
    • nạp shell code vào bộ nhớ và lấy physical address
    • thay đổi biến của kernel memory manager để lộ encrypted hypervisor memory view trong một address range có thể ghi
    • ghi đè hypervisor system call function pointer bằng địa chỉ của chuỗi lệnh mtctr r4; bctr
    • đưa ordinal độc hại vào r0, và trong r4 đặt giá trị physical address của shell code đã OR với mask 0x80000000.00000000
    • thực thi lệnh system call để hypervisor đọc function pointer đã bị ghi đè và nhảy tới shell code thông qua mtctr r4; bctr
  • Exploit file lưu THAW sử dụng PowerPC ROP chain
    • chỉnh sửa plugin IDA Ida-Sploiter để hỗ trợ tìm kiếm gadget PowerPC
    • toàn bộ exploit gồm 24 ROP gadget
  • Toàn bộ luồng THAW trên Xbox 360
    • dùng gap name buffer overflow để ghi đè return address bằng gadget ROP đầu tiên
    • pivot stack pointer sang ROP chain trong save buffer
    • dùng MmAllocatePhysicalMemoryEx để cấp phát physical memory cho hypervisor shell code
    • sao chép shell code bằng memcpy và lấy physical address bằng MmGetPhysicalAddress
    • ánh xạ encrypted hypervisor memory view thành có thể ghi
    • ghi đè system call function address bằng chuỗi mtctr r4; bctr
    • thực thi syscall với malicious system call ordinal và physical address của shell code
    • sau khi giành được hypervisor code execution thì đổi màu LED và vá kiểm tra RSA signature của executable
    • quay lại kernel mode ROP chain, dùng ObCreateSymbolicLink để ánh xạ thư mục HDD và chạy secondary payload chưa ký bằng XLaunchNewImage
  • Cách này có thể dùng lỗi strcpy của THAW để giành ROP execution trên bất kỳ Xbox 360 OS version nào, nhưng full hypervisor code execution chỉ khả thi trên kernel 4548
    • nếu phát hiện thêm bug hypervisor mới thì có thể kết hợp với entry point này để áp dụng cho các kernel version mới hơn

Công bố năm 2024 và port sang các nền tảng khác

  • Năm 2024, các exploit Tony Hawk đã được tổng hợp và công bố
  • Cùng một lỗi strcpy này tồn tại trong 5 iteration của series Tony Hawk và trên nhiều nền tảng console·handheld
  • PlayStation 2

    • exploit THPS4 network RCE đã được port sang bản PlayStation 2
    • chỉ cần có đĩa THPS4, dùng PCSX2 hoặc console khác là có thể hack console qua network
    • exploit sẽ gửi uLaunchElf qua network và thực thi ngay khi truyền xong
    • sau đó có thể nạp trình cài FreeMcBoot hoặc FreeHDBoot từ media khác như USB stick
    • exploit save game trên PS2 không hữu ích lắm
    • nếu đã có cách sao chép file vào memory card thì có thể cài FreeMcBoot trực tiếp
    • có thể mua FreeMcBoot memory card trên Amazon với giá 15 USD, hoặc dùng FreeHDBoot trên phat console và network adapter
  • GameCube

    • exploit save game THPS4 đã được port sang bản GameCube
    • chưa port bản network RCE hay các phiên bản exploit save game khác
    • việc sao chép file vào GameCube memory card không hề đơn giản, và memory card chứa sẵn pre-hacked save file từng được bán trên eBay với giá hơn 50 USD
    • game Tony Hawk trên GameCube không có network support, nên dù có network adapter cũng không thể dùng network exploit
    • do đã có nhiều game save exploit và không có persistent software hack, nhiều người dùng chọn modchip
  • Windows

    • cũng đã có exploit save game cho THUG PRO, và bug report đã được gửi từ 7 năm trước nhưng khi đó không có hứng thú vá
    • không công bố vì exploit này không mang lại giá trị gì trên Windows
    • các game Tony Hawk trên PC cũng có cùng lỗi strcpy và có thể khai thác được
    • còn có các lỗi strcpy khác có thể khai thác trong network play
    • khuyến nghị ép bật ASLR và không chạy bằng Administrator

Tài liệu công khai

  • Toàn bộ source code và file save game đã vá được công bố trên GitHub
  • Một lỗi strcpy duy nhất đã dẫn tới exploit file lưu trên nhiều nền tảng, network RCE, và một entry point exploit chỉ cần phần mềm trên Xbox 360

1 bình luận

 
GN⁺ 2024-08-08
Ý kiến trên Hacker News
  • Điểm thú vị hơn ở khóa Habibi là modulus khóa công khai chỉ khác 4 byte so với khóa công khai RSA của Microsoft
    Một số nguyên 2048 bit ngẫu nhiên có khả năng bị phân tích thừa số một cách tầm thường khá cao; tôi không biết xác suất thực tế, nhưng có thể ước chừng khoảng 2^-32
    Có lẽ họ đã viết mã kiểu như thay đổi ngẫu nhiên hoặc tăng 4 byte của modulus công khai, thử phân tích thừa số trong khoảng 1 mili giây, rồi dừng lại nếu thành công
    Kết quả là modulus công khai có khả năng chứa nhiều thừa số nhỏ, và dù modulus RSA thường là tích của đúng hai số nguyên tố, miễn là nó nguyên tố cùng nhau với e thì về mặt toán học vẫn hoạt động dù có nhiều thừa số hơn

    • Chỉ cần bắt đầu từ một số nguyên 2048 bit ngẫu nhiên rồi đổi các byte thấp để nó chia hết cho 3. Vì chỉ xử lý khóa công khai nên việc này dễ; nếu khóa công khai chia hết cho 3, có thể dùng định lý nhỏ Fermat để bỏ qua phần lớn các ứng viên khóa riêng khả dĩ, làm giảm lượng tính toán cần thiết đi vài bậc độ lớn
      Nếu may mắn triển khai RSA dùng đúng hai thừa số nguyên tố, thì vì đã biết một thừa số là 3, chỉ cần chia khóa công khai cho 3 để lấy thừa số nguyên tố còn lại
      Theo Wikipedia, cấu trúc khóa công khai RSA yêu cầu N là một semiprime lớn và e nguyên tố cùng nhau với φ(N); ai phân tích được N thành thừa số thì có thể lấy được khóa riêng. Trong bối cảnh hack Xbox, nếu làm cho N chia hết cho số nguyên tố 3 thì số nguyên tố còn lại là N/3, tức là đã phân tích thừa số thành công
      Mã dùng khóa Habibi để ký nằm ở https://github.com/XboxDev/xbedump/blob/b8cd5cd0f8b1cbc4e64f.... Sau khi đổi 4 byte cuối thành 0x89, 0x9c, 0x90, 0x6b, nó chia cho 3 rồi tạo khóa riêng phù hợp từ giá trị đó
    • Một bài báo tôi đồng tác giả đã bàn về vấn đề này. Chủ đề là liệu có thể tạo khóa riêng tương ứng với một khóa công khai thực tế đã bị làm hỏng, ở đây cũng là khóa 2048 bit hay không
      Ứng dụng là làm hỏng khóa công khai bằng rowhammer, rồi dùng phép phân tích thừa số của nó để tạo khóa riêng tương ứng mới. Cách này hoạt động với khóa SSH và GPG, và để mang tính thực tiễn thì đặt ra các giả định như biết nội dung trang chứa khóa
      Tỷ lệ thành công thực nghiệm theo thời gian tính toán khả dụng nằm ở Hình 7; phần xử lý phân tích ở mục 3, còn mô tả phương pháp thực tế ở mục 4.4
      https://www.usenix.org/system/files/conference/usenixsecurit...
    • Xác suất lớn hơn 2^-32 rất, rất, rất nhiều. Chỉ cần tiếp tục chia cho các số nguyên tố nhỏ chừng nào còn chia được, rồi chạy một phép kiểm tra tính nguyên tố nhanh như Miller–Rabin trên giá trị còn lại
      Ví dụ, với đoạn mã thử chia cho các số nguyên tố từ 2 đến 499, nếu giá trị trở thành 1 thì thành công, nếu không thì chạy Miller–Rabin 20 lần; trên máy của tôi, để phân tích hoàn toàn một số nguyên 2048 bit ngẫu nhiên chỉ mất khoảng 100 lần thử
    • Triển khai Định lý số dư Trung Hoa sẽ thất bại nếu có thừa số lặp
  • Khó diễn tả thành tựu này phi lý đến mức nào
    Việc softmod Xbox 360 bằng tên công viên trong game Tony Hawk, lại còn dùng đến chuỗi ROP 24 giai đoạn, thật sự ấn tượng
    Thêm một lời mặc niệm ngắn cho hypervisor, phần phân tích ngắn gọn và thực dụng, rồi cả botnet x360 lập tức nảy ra trong đầu, tất cả tạo cảm giác như một cú đánh thẳng vào nỗi hoài niệm Xbox 360 ở đẳng cấp hiếm có

  • Đoạn “nếu may thì sẽ là strcpy” khá buồn cười. Đáng ra ban đầu phải là strncpy mới đúng, và Tony Hawk, người nổi tiếng ủng hộ đồ bảo hộ, hẳn sẽ muốn được gắn với phép sao chép chuỗi an toàn hơn

    • Cách đúng là dùng memcpy và biết kích thước của cả bộ đệm đích lẫn bộ đệm nguồn
      Nếu nguồn không vừa trong đích thì cần xử lý tùy ứng dụng, chẳng hạn có được phép cắt bớt hay không, phải hủy toàn bộ thao tác hay phải cấp phát lại bộ đệm đích. strncpy gần như luôn làm sai việc cần làm
    • strncpy không an toàn hơn. Vì khi chạm tới n, nó tạo ra một chuỗi không được kết thúc
      Về cơ bản gần như không nên dùng strncpy; nó dành cho các trường kích thước cố định như struct dirent { unsigned short inode; char name[14]; };
      Ngay cả trong những trường hợp đó, byte đệm thường nên là khoảng trắng hơn là nul, và strncpy lẽ ra không nên có mặt trong thư viện chuẩn
    • Nếu phát triển C/C++ trên Windows, có thể dùng các hàm trong strsafe.h (https://learn.microsoft.com/en-us/windows/win32/api/strsafe/)
      Khi viết C/C++, chúng dễ dùng hơn các hàm C chuẩn; chúng xử lý các trường hợp lỗi phổ biến như bộ đệm quá nhỏ hoặc tràn số nguyên, và mọi hàm đều trả về mã lỗi nên cũng dễ kiểm tra lỗi
      Trong trường hợp này, StringCchCopyW() hoặc StringCbCopyW() là lựa chọn tốt hơn strcpy
    • Tôi từng đọc rằng ngày trước Tony Hawk hay lái xe vòng quanh, nếu thấy skater thì sẽ hét “thử ollie đi”, và nếu họ làm được thì ông tặng một chiếc mũ bảo hiểm mới
  • Việc exploit này cũng áp dụng được cho THUG PRO thì hơi đáng tiếc
    Cảnh thi đấu của dòng Tony Hawk gần như đã chết suốt gần 20 năm, ngoại trừ một ngoại lệ ngắn ngủi là bản remake THPS1+2, còn mod này thì đến nay vẫn có người chơi
    Bản mod cũng đã hơn 10 năm tuổi và có vẻ các nhà phát triển ban đầu đã rời đi, nên có thể hiểu vì sao khi Ryan báo cáo thì không ai muốn sửa. Nhưng giờ mod này trở nên khó dùng vì có nguy cơ bị chiếm toàn quyền trên PC
    Hy vọng bài viết này đến được với ai đó sẵn sàng vá mod

    • Nếu có thời gian thì hẳn tôi đã muốn thử, nghe có vẻ rất thú vị. Trước đây khi còn có thời gian, tôi từng làm cho mã nguồn THUG1 gần như chơi được trên Windows
      Mã nguồn đó chỉ dành cho bản console, và giả định biên dịch cho Windows không phải là Xbox Windows mà là dành cho công cụ, nên rất nhiều phần hoạt động hoàn toàn khác
  • Phần trông giống biểu tượng tiêu đề mục trước đoạn chữ “So what's the habibi key?” thực ra là một khu vực HTML details có thể bấm để mở rộng, nên nếu quan tâm thì hãy bấm thử
    Điều tôi thắc mắc là: nếu câu chuyện rằng khóa Habibi được dùng riêng trong nhóm console Linux để ngăn dùng nội dung lậu là đúng, thì khóa riêng tương ứng đã được công bố hoặc rò rỉ ở đâu, khi nào và như thế nào?
    Tác giả đã vá khác biệt 4 byte giữa khóa Microsoft và khóa Habibi để chạy một file thực thi “chưa ký”, thực ra là file thực thi được ký bằng khóa riêng Habibi, nên có vẻ rõ ràng là họ đã có được khóa riêng

    • Khóa Habibi được tạo bằng cách vá khóa Microsoft để nó chia hết cho 3, nên trên thực tế rất dễ phân tích thừa số
      Khóa riêng có thể được khôi phục từ khóa công khai một cách tầm thường, nên cũng chẳng có gì đặc biệt để bị công bố hay rò rỉ
      Về cơ bản đó là một CTF mật mã nhỏ được chôn trong bản hack file lưu của 007: Agent Under Fire ban đầu, và bản hack file lưu đó tự nó cũng khá giống một CTF được làm rối. Có vẻ vừa nhằm chơi khăm người dùng bản lậu, vừa là lời thách thức gửi tới các reverse engineer khác
  • Thật sự rất tuyệt. Tôi đã làm một chút dịch ngược PSX, và ở đó cũng có nhiều thứ tương tự
    Thú vị là những thứ như memmove được liên kết từ thư viện SDK[0], nhưng strcpy lại là hàm do BIOS cung cấp
    Trong các phiên bản SDK về sau có thể vá nó sang bản thư viện, nhưng đến tận năm 1997 thì vẫn chưa như vậy
    0 - https://github.com/Xeeynamo/sotn-decomp/blob/master/src/main...

    • Tôi muốn thấy các phiên bản tái hiện những game console cũ bằng C+SDL2 và OpenGL 2.1
      Giờ đây các game N64 đang được port sang PC thông qua decompiler, nên điều đó khiến tôi kỳ vọng
      Có thể sẽ có phản ứng kiểu “những game này vốn đã có bản PC rồi mà”, nhưng nếu biên dịch lại game N64 và thay các hiệu ứng bằng texture thuần hoặc hiệu ứng đơn giản hơn thay vì shader, thì chúng có thể chạy gần như ở mọi nơi, kể cả trên những thiết bị chậm như netbook giá rẻ năm 2009
      Cũng đã có trường hợp port Super Mario 64 sang API 3DFX. Với những game truy cập framebuffer của N64 một cách phức tạp, có thể cần OpenGL 3.3 để mô phỏng microcode đó, nhưng nếu engine vốn chạy rất nhanh trên các máy từ Pentium III trở đi, thì cũng không khó để chạy phần còn lại bằng tăng tốc GL 2.1 và chỉ mô phỏng bằng phần mềm một phần nhỏ
  • Tôi đã đọc rất nhiều bài phân tích exploit kiểu này dưới nhiều dạng, và nếu sau này đọc thêm 100 bài nữa thì chắc tôi còn vui hơn

  • Đây có vẻ là một ví dụ hay về tư duy bảo mật sai lầm trong phát triển console
    Ý nghĩ “dữ liệu lưu chỉ chúng ta mới dùng được, nên chỉ cần parse những gì chúng ta ghi ra” khá phổ biến ở phía console, nhưng về cơ bản là sai vì người ta có thể chuẩn bị dữ liệu lưu được tạo nhân tạo
    Tách riêng chuyện đó, console không nên coi người dùng là kẻ địch, nhưng dù sao nếu đã làm vậy thì game cũng cần có tư duy bảo mật phù hợp với lập trường đó

    • Giờ thì điều này đã phần nào trở thành hiện thực. Các console hiện nay đều mã hóa và ký file lưu, gắn chúng với tài khoản, và đa số — tôi không rõ Xbox — không cho sao chép file lưu ra ngoài console và dịch vụ lưu trữ đám mây trả phí
    • Nếu là máy tính thông thường thì tôi đồng ý 100% với câu “console không nên coi người dùng là kẻ địch”, nhưng console thì tôi cảm thấy hơi khác
      Tôi không biết làm sao để ngăn gian lận trong game online nếu không giới hạn những gì người dùng có thể làm
  • Nói đỡ cho Tony Hawk thì ông ấy là vận động viên trượt ván chuyên nghiệp, chứ không phải nhà phân tích bảo mật
    Khoảng thời gian hạn chế ông ấy ngồi trước bàn phím vào cuối thập niên 90 và đầu những năm 2000 hẳn không dành để audit lỗi tràn bộ đệm, mà để làm cho cú 900 McTwist trong loạt game sắp trở thành biểu tượng có cảm giác tự nhiên

  • Tôi có cơ hội kiểm chứng một huyền thoại từng nghe hồi nhỏ. Có phải người đầu tiên thực hiện thành công cú 720 là Tony Hawk không?

    • Theo https://en.wikipedia.org/wiki/Aerial_(skateboarding), “720, tức cú trick xoay hai vòng trên không, là một trong những trick hiếm nhất trong skateboarding; Tony Hawk là người đầu tiên thực hiện thành công vào năm 1985 và đó không phải là điều đã lên kế hoạch”
      Có lẽ ý là “đầu tiên được ghi nhận”, nhưng nếu ai đó đã làm được trước đó thì khả năng cao họ đã khoe ra, và người có khả năng làm được điều đó dù sao cũng nhiều khả năng là vận động viên trượt ván chuyên nghiệp