Phân tích lỗ hổng bảo mật Lua của Factorio
Factorio là gì?
- Factorio là trò chơi tự động hóa nhà máy để chế tạo tên lửa và thoát khỏi hành tinh
- Hơn 3.500.000 bản sao của trò chơi đã được bán, khiến nó trở thành mục tiêu hấp dẫn đối với các nhà nghiên cứu bảo mật
Cách Lua được sử dụng trong trò chơi
- Lua được dùng để triển khai logic trò chơi, cũng như tạo mod và bản đồ tùy chỉnh
- Cộng đồng modding rất sôi động, với hàng nghìn mod đang tồn tại
- Mod Alien Biomes đã đạt 551K lượt tải xuống
Mức độ phơi bày của trình thông dịch Lua trên mạng
- Chế độ nhiều người chơi của Factorio sử dụng deterministic lockstep để đồng bộ hóa các client
- Khi một người chơi thực thi mã Lua, những người chơi khác cũng phải thực thi cùng đoạn mã đó
- Điều này tạo ra khả năng thực thi mã Lua độc hại qua mạng
Đường khai thác phổ biến
- Lưu trữ một máy chủ Factorio cung cấp bản đồ độc hại
- Khi client kết nối tới máy chủ, nó sẽ tải bản đồ xuống và thực thi mã Lua
- Tận dụng điểm yếu trong triển khai Lua để tạo đối tượng giả
- Thay đổi hành vi của chương trình thông qua rò rỉ/hỏng bộ nhớ
- Dùng các primitive mạnh này để giành quyền thực thi mã
Sự nguy hiểm của bytecode Lua
- Lua là ngôn ngữ thông dịch; mã được viết ra không chạy trực tiếp mà được biên dịch thành bytecode
- Nếu có thể thực thi trực tiếp bytecode, ta có thể chạy bytecode không hợp lệ để làm rò rỉ hoặc phá hỏng bộ nhớ
Trình xác minh bytecode
- Các nhà phát triển Lua từng triển khai trình xác minh bytecode để bảo vệ trình thông dịch khỏi bytecode độc hại, nhưng do liên tục bị phát hiện có thể bị vượt qua nên nó đã bị loại bỏ ở Lua 5.2
- Các nhà phát triển Factorio đã tự triển khai trình xác minh bytecode của riêng mình, nhưng nó không hoàn hảo do một số vấn đề off-by-one
Tạo đối tượng giả
- Có thể tạo đối tượng giả để tận dụng mọi chức năng của trình thông dịch
- Có thể dùng chuỗi để làm rò rỉ dữ liệu tùy ý, và dùng mảng để ghi vào bộ nhớ tùy ý
- Nếu có thể gọi hàm native, ta có thể điều khiển luồng thực thi
Rò rỉ địa chỉ
- Hàm
print của Lua có thể làm rò rỉ địa chỉ
- Trong Factorio, nó đã bị loại bỏ, nên người ta dùng cách lợi dụng type confusion để làm rò rỉ địa chỉ
Hiểu về TValues
- Lua là ngôn ngữ động, nên kiểu của biến có thể thay đổi trong lúc chạy
- Nội bộ, Lua dùng cấu trúc
TValue để biểu diễn đối tượng
TValue có các thuộc tính kiểu (tt_) và giá trị (value_)
Type confusion bằng FORLOOP
- Opcode
FORLOOP có thể gây ra type confusion vì nó coi giá trị khởi tạo của vòng lặp là số
- Nhờ đó có thể làm rò rỉ địa chỉ
IEEE 754 độ chính xác kép
- Số độ chính xác kép gồm dấu, số mũ và phần trị
- Lua không biểu diễn số nguyên, nên có thể làm rò rỉ địa chỉ tới 53 bit mà không mất độ chính xác
Tìm kiếm đối tượng giả
- Có thể tìm kiếm đối tượng giả bằng cách hiểu Upvalues và Closures
- Upvalues cho phép truy cập các biến của hàm bên ngoài
- Nếu sửa bytecode để thay đổi chỉ mục của Upvalue, có thể tìm kiếm đối tượng giả
Ý kiến của GN⁺
- Bài viết này rất hữu ích để hiểu các lỗ hổng bảo mật của ngôn ngữ động
- Nó giải thích rõ các vấn đề bảo mật có thể xảy ra trong một trò chơi phổ biến như Factorio
- Các dự án khác dùng ngôn ngữ như Lua cũng có thể tồn tại lỗ hổng tương tự
- Khi áp dụng công nghệ mới hoặc mã nguồn mở, việc rà soát bảo mật là điều bắt buộc
- Một dự án khác có chức năng tương tự là hệ thống modding của Minecraft
Chưa có bình luận nào.