1 điểm bởi GN⁺ 2024-04-19 | 1 bình luận | Chia sẻ qua WhatsApp
  • Randar là một exploit trong Minecraft Beta 1.8 đến 1.12.2, dùng tọa độ vật phẩm rơi ra khi phá block để khôi phục trạng thái java.util.Random của máy chủ và truy ngược vị trí của người chơi khác
  • Nguyên nhân cốt lõi là tái sử dụng RNG, khi việc sinh địa hình/công trình và sự kiện đào block dùng chung cùng một bộ sinh số ngẫu nhiên; vị trí drop có thể quan sát được trở thành manh mối về trạng thái nội bộ
  • Offset X/Y/Z của vật phẩm rơi là ba đầu ra liên tiếp của World.rand.nextFloat(), nên các 24 bit cao của seed 48 bit bị lộ và có thể khôi phục seed nhanh bằng rút gọn lattice LLL
  • Seed đã khôi phục được tua ngược để kiểm tra xem có phải giá trị sinh ra từ phép kiểm tra Woodland Mansion hay không; nếu khớp, nó xác định Woodland region 1280×1280 block được load gần đây
  • Nếu dữ liệu drop còn nằm trong bản ghi packet cũ như ReplayMod, vị trí hoạt động thời Beta 1.8~1.12.2 có thể bị lộ về sau ngay cả sau khi máy chủ đã được vá

Randar nhắm tới thông tin gì

  • Mục tiêu là tìm tọa độ trong game của người chơi khác trong cùng world
  • 2b2t được dùng làm ví dụ chính
    • 2b2t là máy chủ Minecraft “anarchy” không có luật lệ
    • Bản đồ máy chủ có quy mô 3,6 triệu tỷ ô vuông, nên giữ bí mật vị trí là điều kiện then chốt để bảo vệ vật phẩm
  • Trước Randar, 2b2t cũng từng có exploit tọa độ Nocom được dùng trong giai đoạn 2018~2021

Phiên bản bị ảnh hưởng và lỗi trong code

  • Vấn đề tồn tại từ Minecraft Beta 1.8 phát hành năm 2011 đến 1.12.2 phát hành năm 2017
    • 2b2t vẫn ở 1.12.2 cho đến ngày 14/08/2023
  • Sai lầm cốt lõi là tái sử dụng bất cẩn instance java.util.Random ở nhiều luồng code khác nhau
    • RNG được chia sẻ giữa việc sinh địa hình và các hành động trong game như đào block
    • Bản thân java.util.Random cũng không phải RNG dùng cho bảo mật
  • Minecraft dùng sinh quyết định để cùng một world seed và cùng vị trí cho ra cùng địa hình
    • Dùng java.util.Random cho mục đích này là tự nhiên
    • Vấn đề là thao tác RNG cho sinh world vốn phải dự đoán được lại tác động đến cả các sự kiện lẽ ra phải không thể dự đoán

Kiểm tra Woodland Mansion và World.rand toàn cục

  • Trong quá trình kiểm tra vị trí sinh Woodland Mansion, World.rand bị đặt lại
    • Woodland region được tính theo đơn vị 80×80 chunk
    • Để chọn chunk sẽ sinh Mansion trong region đó, random.nextInt(60) được gọi bốn lần
  • Luồng dễ tổn thương là cấu trúc trong đó World.setRandomSeed(seedX, seedY, seedZ) đặt seed mới cho this.rand toàn cục rồi trả về chính object đó
  • Công thức riêng cho 2b2t như sau
seed = x * 341873128712 + z * 132897987541 - 4172144997891902323 mod 2^48
  • setRandomSeed được gọi cho mục đích kiểm tra mỗi lần load chunk, chứ không chỉ khi ở gần Woodland Mansion thật
  • Ảnh hưởng khác nhau theo dimension
    • Overworld là đối tượng bị ảnh hưởng chính
    • Nether an toàn vì sinh công trình luôn dùng RNG an toàn
    • The End bị ảnh hưởng khi sinh ban đầu do end city, nhưng tương đối an toàn hơn vì không tác động mỗi khi cùng chunk đó được load lại về sau

Tọa độ vật phẩm rơi làm lộ RNG như thế nào

  • Khi đào block, vật phẩm rơi ra ở một vị trí ngẫu nhiên bên trong block
    • Ví dụ nếu tọa độ block là (10, 20, 30), vật phẩm sẽ xuất hiện trong khoảng từ (10.25, 20.25, 30.25) đến (10.75, 20.75, 30.75)
  • Vị trí này dùng ba lần world.rand.nextFloat() để quyết định offset X, Y, Z
  • Từ tọa độ drop có thể suy ngược về giá trị nextFloat() ban đầu
    • Quá trình nhân float với 0.5 chỉ làm giảm số mũ nên không mất thông tin
    • Sau đó giá trị được chuyển sang double, cộng với tọa độ block và gửi qua mạng ở full precision
  • java.util.Random.nextFloat() cập nhật seed 48 bit rồi lấy 24 bit cao làm số nguyên và chia cho 2^24
    • Công thức LCG là newSeed = oldSeed * 25214903917 + 11 mod 2^48
    • Ba float liên tiếp cung cấp 24 bit cao của ba seed liên tiếp

Khôi phục seed bằng rút gọn lattice LLL

  • Cách đơn giản là thử toàn bộ 2^24 ứng viên 24 bit thấp khớp với giá trị đo đầu tiên
    • Cách này cũng hoạt động nhưng chậm, nên phương pháp lattice được dùng
  • Ba giá trị đo cung cấp khoảng của ba giá trị sau
    • seed
    • nextSeed(seed)
    • nextSeed(nextSeed(seed))
  • Nếu xem ba giá trị này như điểm 3 chiều (seed, nextSeed(seed), nextSeed(nextSeed(seed))), mọi seed khả dĩ tạo thành cấu trúc lattice
  • Các vector cơ sở được chọn như sau
    • (1, a, a^2)
    • (0, c, 0)
    • (0, 0, c)
    • Trong đó a = 25214903917, c = 2^48
  • LLL basis reduction tìm một cơ sở ngắn hơn và gần trực giao hơn nhưng vẫn sinh cùng lattice
    • Ví dụ Mathematica: LatticeReduce[{{1, a, a^2}, {0, c, 0}, {0, 0, c}}]
    • Cơ sở kết quả là (1270789291, -2446815537, 2154219555), (-2355713969, 1026597795, 4110294631), (-3756485696, -2345310016, -2015749696)
  • Sau khi chuyển tâm của cube đo đạc sang không gian cơ sở đã rút gọn và làm tròn từng hệ số về số nguyên gần nhất, ta nhận được điểm lattice hợp lệ; tọa độ đầu tiên là seed nội bộ đã khôi phục
  • Ví dụ code Java tối ưu có thể khôi phục seed từ ba giá trị đo ở mức khoảng 10ns

Quá trình tua ngược seed để tìm vị trí

  • LCG của java.util.Random có thể chạy tiến lẫn chạy lùi
    • Chiều thuận: newSeed = oldSeed * 25214903917 + 11 mod 2^48
    • Chiều ngược: oldSeed = (newSeed - 11) * 246154705703781 mod 2^48
  • Seed đã khôi phục được tua ngược để kiểm tra từng seed có thể là seed sinh ra từ phép kiểm tra Woodland Mansion hay không
  • Phạm vi world Minecraft là từ -30 million đến +30 million block
    • Implementation đặt phạm vi Woodland region trên mỗi trục từ -23440 đến +23440
    • Số Woodland region khả dĩ là (23440*2+1)^2, tức 2.197.828.161
  • Cách so sánh toàn bộ 2,2 tỷ ứng viên thì chậm, còn HashSet lớn cũng tốn nhiều bộ nhớ
  • Hệ số Z 132897987541 là số lẻ nên có nghịch đảo trong mod 2^48
    • Nghịch đảo là 211541297333629
    • Nhờ đó chỉ cần quét 46.881 ứng viên X rồi tính Z để tìm region ứng viên

GPU và tối ưu bằng bảng tra cứu

  • Cách chỉ lặp qua X là hợp lý với một seed đơn lẻ, nhưng khi nhiều bot đào vài block mỗi giây và với mỗi giá trị đo phải kiểm tra hàng nghìn RNG step, xử lý thời gian thực trên VPS cấu hình thấp trở nên khó khăn
  • Implementation về sau chuyển sang CUDA batch job và bảng tra cứu
    • Khóa của bảng tra cứu là 32 bit thấp của mansion seed
    • Giá trị là tọa độ X của Woodland region
    • Không có va chạm ở khóa 32 bit thấp, và tác giả ghi rằng họ không hiểu lý do
  • Bảng dùng 2^32 entry, mỗi entry 2 byte, cần khoảng 9GB VRAM
  • Trên RTX 3090 có thể crack khoảng 10 triệu seeds mỗi giây
  • Kết quả khôi phục cho biết Woodland region 1280×1280 block có lần load chunk gần nhất; mức đó đủ để xác định vị trí sau vài phút tìm kiếm

Phân bố step quan sát được trên máy chủ thực

  • Về lý thuyết, khoảng cách trung bình giữa các Woodland seed là khoảng 128.000 RNG steps
  • Trên 2b2t, Woodland seed phần lớn được tìm thấy trong vài chục step
    • Phép đo diễn ra ở thời điểm xử lý packet, tức rất sớm trong tick
    • Thường thì chunk đã được load ở tick ngay trước đó
  • Phép đo đáng tin cậy bắt đầu từ tối thiểu 4 RNG steps
    • Vì code Woodland Mansion gọi rand.nextInt bốn lần trước khi quan sát
  • Các spike lớn xuất hiện tại bội số của 1354 step
    • Có giả thuyết là do nổ end crystal hoặc wither skull
    • Với nổ end crystal, phép tính sát thương block 16^3-14^3=1352 cộng với 2 lần hiệu ứng âm thanh khớp thành 1354 step

ReplayMod và nguy cơ lộ về sau

  • Dù máy chủ đã cập nhật lên phiên bản mới hoặc đã vá thao tác RNG, Randar vẫn còn rủi ro nếu dữ liệu cũ còn tồn tại
  • Một số người chơi Minecraft ghi lại packet bằng mod như ReplayMod
    • Nếu file ghi chứa vật phẩm rơi, có thể khôi phục trạng thái RNG của máy chủ tại thời điểm đó
    • Phá block là hành động rất phổ biến nên khả năng cao có trong bản ghi
  • Mọi vị trí từng hoạt động trong Beta 1.8~1.12.2 nên được xem là đã bị lộ, ngay cả khi máy chủ đã cập nhật từ lâu
  • Có cung cấp công cụ web phía client để tự chạy Randar
    • Có thể kéo thả file ReplayMod 1.12.2 vào hobune.stream/randar để kiểm tra tọa độ
    • File ghi không rời khỏi trình duyệt

Vận hành Randar và heatmap

  • SpawnMasons bắt đầu ghi lại tọa độ vật phẩm rơi từ các tài khoản vốn đã đào stone/cobblestone 24/7 cho một dự án khác
  • Họ tái sử dụng hệ thống Minecraft headless từng dùng trong Nocom và thêm cơ sở dữ liệu Postgres để lưu giá trị đo
  • Phần mềm crack giá trị đo RNG được cải tiến nhiều lần và cuối cùng ổn định ở dạng async CUDA batch job
  • Khi giá trị đo đã crack được thêm vào cơ sở dữ liệu, bảng phân tích heatmap cũng được cập nhật
    • Lưu hit count cho toàn bộ thời gian, theo ngày và theo giờ
    • Cho phép chọn khoảng thời gian và granularity trong trình duyệt bằng UI Plotly Dash
  • Chunk load spam do săn Elytra stash được loại bỏ bằng cách chỉ xét các tọa độ được load qua nhiều distinct hour
  • Một hệ thống annotation chia sẻ đơn giản cũng được thêm để theo dõi các hotspot đã tìm thấy
  • Họ tự động hóa AFK quá trình đánh cắp và sắp xếp item stash bằng Baritone bot lấy từ Nocom

Woodland region mồi nhử để bảo vệ

  • Randar không phải lúc nào cũng tìm chính xác chunk gần nhất
    • Khi tua ngược RNG, nếu một Woodland region mồi nhử gần hơn xuất hiện trước, exploit trả về match đầu tiên có thể cho kết quả dương tính giả
  • Woodland seed nhìn chung xuất hiện khoảng 1 trong mỗi 130.000 RNG seed, nhưng phân bố có outlier
  • Trên 2b2t, khoảng 1 trong 20.000 Woodland region được cho là có hiding property đặc biệt: có một Woodland region khác trong 4 RNG step tiếp theo
  • SpawnMasons đã tạo stash trong các region như vậy
    • Do render distance, họ xây công trình compact để chunk ngoài region bảo vệ không bị load
    • Ở vị trí mồi nhử, họ đặt tài khoản AFK và một base nhỏ để khiến người dùng Randar khác thấy vị trí mồi nhử
  • Theo log Randar của họ, các stash này ở trạng thái “clean” trong suốt thời gian, tức không vô tình load Woodland region lân cận
  • Khi công bố, họ cho biết đã chuyển các stash đó đi

Ví dụ hoàn chỉnh và ràng buộc theo phiên bản

  • Có ví dụ Java phát hiện item trông giống drop do đào block trong SPacketSpawnObject, chuyển tọa độ drop về ba giá trị đo float, rồi thực hiện crack dựa trên LLL và truy ngược Woodland region
  • Ví dụ giá trị đo thực tế từ 2b2t cho kết quả sau
    • item drop: 0.41882818937301636, 0.6833633482456207, 0.46088552474975586
    • RNG measurements: 5664934 14541261 7076144
    • seed nội bộ: 95041827771683
    • Woodland region: -12008 0
    • phạm vi vị trí: từ -15370368,-128 đến -15369089,1151
  • Ví dụ dùng cho sơ đồ tìm Woodland Region 123,456
    • Phạm vi vị trí cuối cùng là từ 157312,583552 đến 158591,584831
    • Bao gồm tọa độ đầu vào ban đầu x=157440 z=583680
  • Các phiên bản trước 1.11 cần code khác vì exploitable structure không phải Woodland Mansion mà là công trình khác
  • Trước 1.9, vị trí vật phẩm được gửi dưới dạng fractional part fixed-point 5 bit chứ không phải double, nên gần như không thực tế để crack trạng thái RNG chỉ bằng một item; cần chiến lược đo khác

Cách vá

  • Cách dễ là tìm bản vá hoặc cấu hình vô hiệu hóa RNG manipulation
  • Implementation dễ tổn thương là World.setRandomSeed đặt seed vào this.rand toàn cục rồi trả về nó
public Random setRandomSeed(int seedX, int seedY, int seedZ) {
    this.rand.setSeed(seedX * 341873128712L + seedY * 132897987541L + seedZ + this.getWorldInfo().getSeed());
    return this.rand;
}
  • Nếu muốn bảo vệ hoàn toàn, có thể đổi để trả về Random mới cho mỗi lần gọi
public Random setRandomSeed(int seedX, int seedY, int seedZ) {
    return new Random(seedX * 341873128712L + seedY * 132897987541L + seedZ + this.getWorldInfo().getSeed());
}
  • Nếu lo về hiệu năng, có thể tạo trường RNG riêng cho sinh world separateRandOnlyForWorldGen và không chia sẻ nó với mục đích khác
  • Bản vá cho PaperMC 1.12.2 được cung cấp dưới dạng commit PaperWithRandarPatchedfile patch thay thế

Phụ lục của n0pf0x: cách dò tọa độ khác và The End

  • n0pf0x dùng phương pháp dò tọa độ dựa trên cache thay cho bảng tra cứu GPU lớn của phía Mason
    • Khi có hit, tọa độ đó và các tọa độ trong bán kính xung quanh được đưa vào HashMap
    • Pass đầu tiên tua ngược RNG và nhanh chóng kiểm tra cache hit hoặc trùng lặp với seed xử lý ngay trước đó
    • Pass thứ hai chỉ chạy khi pass đầu thất bại và dùng thuật toán tìm tọa độ tốn kém đã mô tả ở trên
  • Cách dùng cache này có hiệu ứng bỏ qua valid location kém hợp lý hơn, nên có thể giúp giảm false positive
  • Trong The End, RNG chỉ bị ảnh hưởng khi chunk được sinh lần đầu, nên khó quan sát lặp lại các lần load chunk base như ở Overworld
  • Có hai tình huống có thể dựa vào trong The End
    • Người chơi ở base đi lại và sinh chunk chưa được tạo
    • Người chơi di chuyển đến base tạo ra trail chunk mới trên đường đi
  • Trail có thể được nhận diện bằng hệ thống tự động, nhưng n0pf0x không triển khai mà theo dõi thủ công bằng mắt
  • Để định danh người chơi, họ dùng ý tưởng End Occupancy Tracker(EOT)
    • Dựa trên giả định rằng số lần gọi RNG mỗi tick có tương quan phần nào với số chunk đã load, và điều này liên quan đến số người chơi trong dimension đó
    • Quan sát số lần gọi RNG tăng vọt hoặc giảm sau khi người chơi join/leave để suy đoán người chơi nào đang ở The End
  • EOT chỉ được thử nghiệm trên 9b9t và có thể không đúng trong điều kiện máy chủ khác như 2b2t
    • Cần có khả năng lấy mẫu RNG ổn định mỗi tick
    • Nếu mức hoạt động của người chơi trong The End cao hơn nhiều, việc này có thể khó hơn

1 bình luận

 
GN⁺ 2024-04-19
Ý kiến trên Hacker News
  • Vào giai đoạn 1999–2000 từng có International RoShamBo Programming Competition, nơi các bot máy tính oẳn tù tì thi đấu với nhau [1]
    Bot chuẩn dùng chiến lược về lý thuyết là không thể bị đánh bại: chọn ngẫu nhiên; nhưng một bài dự thi mang tính đùa nghịch được thiết kế để suy ngược trạng thái của bộ sinh số ngẫu nhiên và dự đoán nước đi của người chơi ngẫu nhiên với độ chính xác 100%
    Sửa: bot đó là “Nostradamus” của Tim Dierks, và được tuyên bố là người thắng hạng mục “supermodified” trong cuộc thi đầu tiên [2]
    [1] https://web.archive.org/web/20180719050311/http://webdocs.cs...
    [2] https://groups.google.com/g/comp.ai.games/c/qvJqOLOg-oc

    • Đó chính là tôi. Thật vui khi xem lại câu trích dẫn từ rất lâu trước: “Với năng lực kỹ thuật xuất sắc và thái độ ‘lừa sớm, lừa thường xuyên’, Tim có thể có một sự nghiệp đầy hứa hẹn với tư cách lập trình viên AI trong ngành game máy tính :)”
      Thực ra tôi đã đi vào lĩnh vực bảo mật, viết RFC cho TLS và trở thành kỹ sư trưởng trong mảng bảo mật của Google. Cảm ơn vì đã gợi lại kỷ niệm
    • Năm đầu tiên tôi đã gửi bài dự thi tệ một cách tối ưu là cheesebot
      https://web.archive.org/web/20180719050236/http://webdocs.cs...
    • Toàn bộ phần giải thích về các bài dự thi ở hạng mục “supermodified” buồn cười quá
      Nostradamus do Tim Dierks, VP kỹ thuật của Certicom, một người có chuyên môn mật mã học rất cao, viết; nó reverse-engineer trạng thái nội bộ của bộ sinh random() và đánh bại người chơi tối ưu. Theo lời anh ấy thì việc đó “vừa dễ hơn vừa khó hơn tưởng tượng”. Dù vậy, trên tinh thần thượng võ, nó chơi tối ưu trước tất cả đối thủ khác
      Fork Bot xuất phát từ ý tưởng Dan Egnor nghĩ ra chỉ vài phút sau khi nghe về cuộc thi, tận dụng việc “cho phép routine thư viện” để dùng fork() tạo ba tiến trình, cho mỗi tiến trình ra một nước khác nhau rồi giết hai tiến trình thua. Andreas Junghanns triển khai bằng khoảng 10 dòng code, nhưng sau lượt đầu tiên, cả ba nước đều thua Psychic Friends Network nên chương trình kết thúc và các trận còn lại bị xử thua do bỏ cuộc
      Psychic Friends Network là đoạn mã C rối rắm thật sự hài hước do Michael Schatz và những người ở RST Corporation viết; nó có các hàm phụ tìm karma tốt, tư vấn cung hoàng đạo, nấu spaghetti và pizza thần bí, dùng #define để biến đảng viên Dân chủ thành cộng sản, undef Chúa, v.v. Chúng tôi vẫn đang tìm hiểu chính xác nó làm gì với stack frame, nhưng miễn là không gặp meta-meta-cheater thì nó không ghi dưới +998 điểm trong một trận
      The Matrix do Darse Billings, người có chức danh danh giá “Student for Life”, viết; với nguyên tắc đơn giản “không có cái thìa”, nó thắng mọi đối thủ với điểm tuyệt đối
      The Matrix cũng chính là chương trình tournament, nên có toàn quyền truy cập vào mọi thuật toán, cấu trúc dữ liệu và routine xuất kết quả khác; vì vậy khả năng nó bị vượt qua trong tương lai là thấp. Do đó hạng mục này được tuyên bố là đã được giải quyết và bị loại khỏi các cuộc thi sau
    • Tôi nhớ từng có người làm việc tương tự với một trang poker trực tuyến đã tài liệu hóa bộ sinh số giả ngẫu nhiên của họ như một nỗ lực đáng khen nhằm tăng tính minh bạch
      Cuối cùng chính sự minh bạch đó đã giúp bảo mật được cải thiện
    • Vậy là họ đang dùng bộ sinh số giả ngẫu nhiên à?
  • Giảm cơ sở lưới LLL cũng chính là thuật toán được dùng trong CVE vài ngày trước để phá khóa PuTTY bằng nonce bị lệch
    tptacek đã giải thích một chút về cuộc tấn công và cũng liên kết tới một bài cryptopals mà nếu nheo mắt lại thì bạn gần như có thể giả vờ là mình hiểu https://news.ycombinator.com/item?id=40045377
    Tương tự, server Minecraft SciCraft từng có một trại creeper dùng thiết bị kiểu hắc thuật nào đó để thao túng trạng thái bộ sinh số ngẫu nhiên một cách tất định, khiến sét “ngẫu nhiên” đánh vào một khối cụ thể ở mỗi frame để cải thiện vật phẩm rơi ra từ creeper https://youtu.be/TM7SutJyDCk

    • Sean và Kelby giải thích LLL là gì tốt hơn nhiều, nhưng về lý do vì sao LLL tồn tại thì bài này gần như là hay nhất tôi từng thấy
      Trong cả ba trường hợp, thứ cần có chỉ là đại số tuyến tính cơ bản, mà cũng không nhiều. Kelby muốn bạn hiểu Gram–Schmidt, nội dung thường xuất hiện ngay trước kỳ thi giữa kỳ của môn nhập môn đại số tuyến tính bậc đại học
      Tôi không biết dùng lời nào để diễn tả bài viết này xuất sắc đến mức nào. Nó làm tuần này của tôi tốt hơn
      Một lời giải thích rất ngắn gọn về cùng quy trình để sau này có thể làm theo bằng Python:
      https://crypto.stackexchange.com/questions/37836/problem-wit...
    • Cũng có thao túng số ngẫu nhiên để khiến block luôn rơi ở mức tối đa, được giải thích ở đây
      https://youtu.be/ZcdN1wCJPqM?t=390
    • “Thiết bị kiểu hắc thuật”, “nheo mắt lại thì gần như có thể giả vờ là mình hiểu” chính là hình ảnh của tôi khi xem mật mã học :D
  • Sáng dậy thì thấy những khối vốn tối qua chưa có đang lơ lửng trên trời; ban đầu trông mờ ảo như sương, như ma, rồi nhanh chóng hiện ra là redstone, observer, slime block, và cảnh TNT rơi vô hạn hiện lên trong đầu
    Chỉ vì máy chủ làm lộ vị trí của mình mà thành ra như vậy. Dù thế vẫn còn có thể chạy thoát, và có lẽ vẫn có vài giây để lấy đồ cần thiết trong rương rồi bỏ chạy, hoặc có thời gian xây một nơi trú ẩn bằng obsidian. Nhưng chỉ có thế thôi
    Không đủ thời gian để dựng pháo ngắm chính xác, mà dù sao cũng không canh được độ cao. Nếu có elytra và rocket thì có thể bay đi quấy rối, nhưng ngay cách đó 16 chunk đã có một cái hố world eater khổng lồ. Không biết họ có đặt bẫy dung nham ở mọi cổng Nether gần đó không?

  • Tôi đã thấy nhiều vấn đề về bộ sinh số ngẫu nhiên thú vị và buồn cười, nhưng đây là một trong những exploit tinh vi nhất so với thứ thu được. Như một tác phẩm nghệ thuật tuyệt đẹp vậy

    • Nếu bán item thì có thể kiếm được chút tiền, có lẽ cỡ vài nghìn đô. Tất nhiên so với lượng công sức bỏ vào thì vẫn là phần thưởng nhỏ
    • Tôi rất thích cách những quyết định nhìn qua tưởng vô hại của các lập trình viên Mojang lại bị khai thác ở đây. Cực kỳ ngầu
  • Một exploit khá ấn tượng
    Ý tưởng về một server nơi việc khai thác bug được tự do cũng khá hay, trông như một giai đoạn hoàn toàn khác của trò chơi
    Nếu metaverse thực sự xảy ra, tôi nghĩ “đánh nhau thật sự” thay vì chỉ dùng cơ chế chiến đấu trong game có lẽ sẽ trông như thế này

    • Chiến đấu trên 2b2t cũng không giống Minecraft thông thường
      Từ lâu đã có rất nhiều item giá trị cao bị nhân bản, nên PvP đã trở thành kiểu liên tục rải end crystal, thứ khi phá sẽ gây sát thương khổng lồ; còn phòng thủ thì phụ thuộc vào việc bạn có bao nhiêu “totem of undying” để hấp thụ sát thương chí mạng
      Đương nhiên các client hack sẽ tự động hóa việc đặt end crystal, nạp lại totem, nhận diện vị trí yếu và mạnh, còn người chơi thì làm theo chỉ dẫn đó để tiếp tục gây sát thương
      Trước đó một chút còn từng có kiếm hack gây +32.767 sát thương, giết tức thì, cho đến khi bị vá trên server
    • Việc cân bằng hội tụ quanh bug và exploit là khá điển hình trong các game sandbox PvP căng thẳng, dù server không cho phép
      ARK: Survival Evolved và Eve Online khét tiếng vì các đại clan quy mô hàng nghìn người đẩy metagame và việc khai thác bug tới mức cực đoan
      Không phải lúc nào cũng lãng mạn. ARK từng có cơ chế có thể dox người chơi và nhiều tài khoản Steam của họ, và trong Great War dường như cũng có một số trường hợp quan hệ trong game lan sang đời thực
      Đôi khi cũng có những thủ đoạn rất cơ bản. Ví dụ khi bị đột kích, dựng một tòa tháp khổng lồ rồi làm sập để gây từ chối dịch vụ lên server khiến nó crash; server sẽ rollback về bản sao lưu 10–20 phút trước, khiến các căn cứ có người chơi đang hoạt động trở nên rất khó bị raid. Đây là chiêu rất cũ và đã được sửa từ nhiều năm trước
      Rust cũng từng có chính sách khuyến khích lan truyền và công khai bug/exploit lên YouTube, nhưng mục đích thì khác: để các nhà phát triển nhận ra và vá nhanh hơn. Kết quả là game trở nên khá vững chắc, rất khó khai thác nếu không dùng hack bên ngoài thật sự
    • Ở điểm trung gian có Super Smash Bros Melee. Rất nhiều chiến thuật trong game được cho phép ở giải đấu dựa vào bug
      Tuy nhiên đó chỉ là những thứ có thể tự tay khai thác bằng tay cầm thông thường, không phải hack thật sự. Một exploit tên Wobbling đã bị cấm vào năm 2019, trong khi game này ra đời từ năm 2001
    • Xét về gameplay thì tôi khá thích ý tưởng một server vô chính phủ thật sự, nhưng trên 2b2t thật tế thì trong chat có quá nhiều từ n-word nên tôi bỏ
    • “Server nơi khai thác bug được tự do” thực ra chẳng phải là toàn bộ server CS 1.6 không có VAC sao?
  • Tôi vừa xem video về chủ đề này. Đây là một ví dụ cảnh báo rõ ràng về rủi ro khi các nguồn ngẫu nhiên tương tác với nhau, và điều đó cũng áp dụng nhiều cho các hệ thống quan trọng
    Vì hiệu năng, trong code người ta thường chia sẻ bộ sinh số ngẫu nhiên; nghe những câu chuyện như thế này chắc chắn khiến mình phải khựng lại

    • Tôi không nghĩ mình từng dùng bộ sinh số giả ngẫu nhiên trong phần mềm nghiêm túc, nhưng theo trực giác tôi từng nghĩ dùng cùng một bộ sinh số ngẫu nhiên ở càng nhiều nơi càng tốt sẽ khiến kiểu tấn công này khó hơn
      Vì có vẻ sẽ khó quan sát đủ các điểm được cập nhật. Nhưng trường hợp này cho thấy trực giác đó sai theo một cách khá ấn tượng và thú vị
  • Video này thật đáng kinh ngạc: https://www.youtube.com/watch?v=maMpMOnIJDE
    Tôi không biết cộng đồng này lại tinh vi đến vậy

  • Xa hơn nữa, kiểu crack bộ sinh số ngẫu nhiên như thế này từng được triển khai ngay trong game
    https://youtu.be/FPmQ0rnJjNc?si=tTFObcfZ-ILanL_A

  • Đáng kinh ngạc là có một cỗ máy được tạo ngay trong chính Minecraft tên là Mess Detector. Thay vì block drop, nó dùng vị trí của TNT đã được kích nổ để dự đoán trạng thái nội bộ của bộ sinh số ngẫu nhiên
    https://www.youtube.com/watch?v=FPmQ0rnJjNc

  • Cái này trông giống tấn công mở rộng xâm phạm trạng thái (https://en.wikipedia.org/wiki/Random_number_generator_attack)
    Đây là kiểu tấn công mà PRNG không phải bộ sinh số giả ngẫu nhiên an toàn về mặt mật mã (CSPRNG) có thể gặp phải
    Giờ đây việc thư viện cung cấp PRNG làm mặc định tự nó không còn cho cảm giác an toàn lắm. Nó giống như mặc định cho phép TLSv1.0 hay blowfish vào năm 2024 vậy