2 điểm bởi GN⁺ 2024-01-15 | 1 bình luận | Chia sẻ qua WhatsApp

When Random Isn't

  • Đây là một giai thoại từ khoảng 10 năm trước, xin thông cảm vì có những chỗ không thể nhớ chính xác do đã mất đoạn mã gốc.
  • Một số chi tiết đã được đơn giản hóa để bất kỳ ai yêu thích bảo mật máy tính cũng có thể thấy thú vị.
  • Năm 14 tuổi, tác giả phát hiện ra World of Warcraft và trở nên nghiện trò chơi này.
  • Sau khi tìm thấy các add-on có thể chỉnh sửa giao diện người dùng của trò chơi, tác giả bắt đầu tự tạo chúng.
  • Các add-on được viết bằng ngôn ngữ lập trình Lua, gồm vài tệp mã nguồn .lua.
  • Tác giả bị cuốn hút bởi việc trò chơi có thể nạp và thực thi mã nguồn do chính mình viết.

Bảo mật của add-on

  • Việc cho phép người dùng có các add-on có thể lập trình thoạt nhìn có vẻ là một ý tưởng tồi vì dễ dẫn tới bot.
  • Hệ thống do Blizzard tạo ra khá thông minh trong việc ngăn chặn các hành vi lập trình tùy ý.
  • Phần lớn các thành phần UI chỉ mang tính trang trí hoặc cung cấp thông tin nên hoàn toàn không bị hạn chế.
  • Các API thu thập thông tin, chẳng hạn lời gọi API hiển thị lượng máu của nhân vật, cũng không bị hạn chế.
  • Tuy nhiên, một số lời gọi API được bảo vệ để chỉ mã chính thức của Blizzard mới có thể gọi.
  • Phần lớn các API liên quan đến việc thực hiện hành động thực tế trong game đều được bảo vệ.
  • API lấy vị trí trong thế giới và hướng camera cũng từng bị đưa vào diện bảo vệ.
  • Nếu muốn tạo một nút để niệm một phép cụ thể, có thể tạo một nút đặc biệt mà khi nhấp vào sẽ chạy mã trong môi trường bảo mật.
  • Các nút này không thể được tạo, hủy hoặc di chuyển trong lúc chiến đấu, nhằm ngăn tự động hóa khi đang giao tranh.
  • Môi trường bảo mật có thể thiết lập bằng lập trình xem sẽ niệm phép nào, nhưng không cho phép thu thập thông tin cần thiết cho tự động hóa tùy ý.

Một kênh cửa hậu

  • Vài năm sau, khi bắt đầu quan tâm tới lập trình "nghiêm túc" hơn, tác giả gần như không còn chơi World of Warcraft nữa.
  • Tuy vậy, ý nghĩ muốn vô hiệu hóa môi trường bảo mật vẫn luôn ám ảnh.
  • Thay vì dùng phần mềm bên thứ ba, tác giả muốn giải bài toán này như một thử thách kỹ thuật bằng những công cụ được phép về mặt kỹ thuật.
  • Tác giả phát hiện random nằm trong danh sách các hàm được phép trong môi trường bảo mật và nghĩ ra cách dùng nó để bí mật chuyển thông tin vào trong.

Rắc rối với bộ sinh số ngẫu nhiên

  • Hóa ra random chỉ là một lớp bọc đơn giản quanh hàm rand của C.
  • Cách hiện thực rand là một bộ sinh đồng dư tuyến tính đơn giản và yếu.
  • Tác giả đã phát triển một phương pháp đảo ngược trạng thái nội bộ của RNG để truyền thông tin.

Ghép mọi thứ lại với nhau

  • Sau khi có thể đảo ngược trạng thái nội bộ của RNG, tác giả có thể đưa ra các quyết định tự động hóa tùy ý trong môi trường bảo mật.
  • Bằng cách truy cập thông tin ở môi trường không an toàn để ra quyết định, rồi thực hiện hành động được "chọn ngẫu nhiên" trong môi trường bảo mật.

Kết luận

  • Tác giả không biết Blizzard đã sửa vấn đề trạng thái RNG yếu và được chia sẻ này khi nào, hay liệu họ có từng nhận ra đây là vấn đề hay không.
  • Khi thử lại đoạn mã đó vài năm sau, nó không còn hoạt động nữa.
  • Dù đây chỉ là việc khai thác một kẽ hở trong một trò chơi điện tử mà bản thân tác giả cũng không thực sự muốn dùng, việc thao túng thứ trông như ngẫu nhiên vẫn mang một sức hấp dẫn gần như ma thuật.

Ý kiến của GN⁺

  • Bài viết này đưa ra một ví dụ thú vị về bảo mật máy tính và lập trình.
  • Quá trình khám phá một cách sáng tạo để vượt qua cơ chế bảo mật trong game giúp nhấn mạnh tầm quan trọng của kỹ năng lập trình và nhận thức về các điểm yếu tiềm ẩn.
  • Câu chuyện khai thác điểm yếu của RNG là một trường hợp giàu tính bài học, nhắc nhở các nhà phát triển phần mềm về tầm quan trọng của bảo mật và thuật toán.

1 bình luận

 
GN⁺ 2024-01-15
Ý kiến trên Hacker News
  • Một người dùng cho biết vài tháng trước họ từng trả lời một câu hỏi trên StackOverflow về việc "đảo ngược RNG (bộ sinh số ngẫu nhiên)". Người này đã tấn công Java RNG, vốn dùng thiết kế LCG (bộ sinh đồng dư tuyến tính) tương tự MSVC RNG, nên phương pháp tấn công rất giống nhau vì đầu ra là phần trạng thái nội bộ đã bị cắt bớt.

    • Chia sẻ kinh nghiệm từng trả lời một câu hỏi tương tự về "đảo ngược RNG" trên StackOverflow. Cả Java RNG và MSVC RNG đều dùng thiết kế LCG nên có thể bị tấn công theo cách tương tự.
  • Một người dùng khác suy đoán rằng nếu máy chủ đang dùng cùng một RNG, thì về mặt lý thuyết có thể khai thác được nếu có máy chủ ít tải, ping thấp, khả năng xác định chính xác một khoảng thời gian của trạng thái RNG hiện tại, và khả năng nhanh chóng tạo ra các sự kiện khác có biến động kinh tế cao.

    • Suy đoán về khả năng khai thác trong một số điều kiện nhất định nếu máy chủ dùng cùng một RNG.
  • Một người dùng khác nữa chỉ ra rằng RNG đồng dư tuyến tính được nêu ra chỉ tạo ra 12445 số khác nhau trước khi lặp lại, và nhận xét rằng sẽ hợp lý hơn nếu dùng các tham số tốt hơn cho thuật toán này.

    • Chỉ ra vấn đề RNG đồng dư tuyến tính chỉ tạo ra số lượng giá trị hữu hạn rồi lặp lại, đồng thời nhấn mạnh sự cần thiết phải cải thiện thuật toán.
  • Một người dùng nói rằng World of Warcraft (WoW) là thứ khơi dậy sự quan tâm của họ với lập trình; game ra mắt khi họ 6 tuổi, và khi các máy chủ riêng xuất hiện, họ bắt đầu hứng thú với việc tự tạo NPC. Nhờ đó họ học Lua, cách biên dịch private server core, SVN và cách áp dụng patch.

    • Chia sẻ trải nghiệm WoW đã khơi dậy hứng thú với lập trình. Họ học được kỹ năng lập trình thông qua private server và Lua.
  • Một người dùng chia sẻ câu nói của John von Neumann rằng mọi phương pháp tạo số ngẫu nhiên đều là tội lỗi, và cho rằng các quy trình số học chặt chẽ không phải là cách để tạo ra số ngẫu nhiên.

    • Trích dẫn quan điểm của John von Neumann về việc tạo số ngẫu nhiên. Nhấn mạnh rằng quy trình số học chặt chẽ không phải là phương pháp tạo số ngẫu nhiên.
  • Một người dùng nói rằng họ từng viết script cho nhà đấu giá của WoW; script này quét mọi phiên đấu giá để mua các vật phẩm bị định giá thấp rồi đem đấu giá lại. Nếu ai đó hạ giá, script có thể hủy và đăng lại với mức giá thấp hơn một chút.

    • Chia sẻ trải nghiệm kiếm vàng vô hạn thông qua script dùng trong nhà đấu giá của WoW.
  • Có người dùng nhắc đến một trường hợp Hacker News từng bị hack do số ngẫu nhiên yếu. Họ cung cấp liên kết liên quan.

    • Nhắc đến trường hợp Hacker News từng bị hack vì số ngẫu nhiên yếu, qua đó chỉ ra vấn đề bảo mật.
  • Có người dùng dùng cách diễn đạt "khi biến không thay đổi và hằng số lại không phải hằng số".

    • Dùng một cách diễn đạt châm biếm về vai trò của biến và hằng số trong lập trình.
  • Một người dùng nói rằng dù không chơi WoW, họ từng nghe nhiều addon dùng tin nhắn riêng làm phương tiện liên lạc. Họ nhận xét rằng nếu có cách làm, sớm muộn gì mọi người cũng sẽ tìm ra và sử dụng nó.

    • Nêu ý kiến rằng nhiều addon WoW dùng tin nhắn riêng để liên lạc, và con người cuối cùng sẽ tìm ra rồi tận dụng mọi phương thức giao tiếp khả dụng.
  • Liên quan đến động cơ kinh tế của RNG, có người dùng nhận xét rằng trong trường hợp thực tế không có gì đáng kể bị đặt cược (ví dụ như game), RNG không hoàn hảo cũng có thể là đủ. Nhưng khi có tiền bạc liên quan hoặc bảo mật là yếu tố quan trọng (ví dụ ví tiền mã hóa hoặc casino trực tuyến), tính hoàn hảo của RNG trở nên cực kỳ quan trọng.

    • Chỉ ra rằng trong các tình huống ít quan trọng như game, RNG không hoàn hảo có thể chấp nhận được; nhưng khi giá trị tiền tệ hoặc bảo mật trở nên quan trọng, độ chính xác của RNG là yếu tố then chốt.