Chương 25: Liên Tông
Trống sảnh vang ba hồi lúc giờ Thìn. Ba trăm đệ tử xếp hàng trước giảng đường, linh lực dao động tạo sương mù nhạt trên đỉnh đầu. Gió đầu xuân cắt qua cổ tay áo. Hắn đứng hàng giữa, vai trái đau — thuốc giảm đau chỉ giữ sáu phần.
Trưởng lão Vô Phong lên bệ đá cao, mở cuộn lụa đỏ. Chữ vàng hiện giữa giảng đường.
"Giải đấu liên tông. Bốn tông — Thiên Kiếm Tông, Vân Tiêu Các, Hỏa Long Điện, Bách Thảo Viên. Mỗi tông bốn đệ tử, loại trực tiếp. Phần thưởng — Linh Tuyền Thất liên tông, mười ngày."
Đám đông xôn xao. Mười ngày Linh Tuyền Thất bằng nửa năm tu luyện bình thường.
Vô Phong giơ tay. Im lặng. "Danh sách đại diện — bốn người." Chữ vàng chạy rồi dừng. "Tô Mạn Đình. Lý Minh. Cố Vân Phi. Phó Sương."
Không ngạc nhiên. Thắng Thí Luyện Tháng Ba là vé vào. Nhưng ánh mắt xung quanh không thân thiện.
Bốn người — cô Trúc Cơ trung kỳ, Cố Vân Phi Trúc Cơ sơ kỳ, Phó Sương ẩn số, còn hắn: Luyện Khí tầng hai, xương sgerät trái chưa liền.
Tan họp. Hắn lẻn ra đường nhỏ phía đông — nơi ít người qua lại. Trần Huyền Cơ đã đứng sau bụi trúc, bầu rượu mới miệng chưa dính nắp.
"Được chọn nhanh đấy." Hắn dừng cách ba thước.
Trần Huyền Cơ không cười. Từ sau đêm chữ ký, lão gần như không cười. "Anomaly không đổi — 0.53. Nhưng đồng hồ chạy rồi." Mở lòng bàn tay — ánh sáng nhạt hiện con số 84 rồi tắt. "Tám mươi bốn ngày."
"Con biết."
"Ngươi không biết." Trần Huyền Cơ uống một ngụm. "Vô Phong đích thân đăng ký tên ngươi. Không hỏi, không thông báo. Lão đang thử — xem ngươi phản ứng thế nào khi bị đẩy vào chỗ không thể từ chối."
Lão nhìn hắn. "Giải đấu liên tông — trận pháp bảo vệ do bốn tông cùng thiết kế. Không phải Thiên Kiếm Tông một mình. Nghĩa là tầng bề mặt rộng hơn, phức tạp hơn, nhiều chỗ trống hơn."
Nhiều chỗ trống hơn. Nhiều bug hơn. Trần Huyền Cơ biến sau trúc, không quay lại.
Tối. Hắn đến phòng trận pháp phía nam — nơi treo bản vẽ quy tắc giải đấu liên tông. Trận bàn gỗ lớn, bốn vòng tròn lồng nhau đại diện bốn tông, mỗi vòng có lớp bảo vệ riêng — read, write, execute. Registration nằm ở lớp execute — cao nhất.
Mở debug. Ký hiệu bytecode hiển thị. Hắn bắt đầu đọc.
Registration — hàm recv_input() nhận linh lực đầu vào từ thí sinh, xác nhận danh tính, gán tu vi, đẩy vào bảng chung. Simple. Clean. Và hoàn toàn không sanitize.
Không kiểm tra kiểu dữ liệu. Không validate phạm vi. Niềm tin của hệ thống vào người dùng — và niềm tin đó là lỗ hổng.
Ở giữa luồng recv_input(), trước khi gán vào bảng, hệ thống gọi eval() — "đánh giá tương thích" giữa linh lực thí sinh và quy tắc liên tông. Hàm eval() nhận đầu vào thô và thực thi nó như một biểu thức.
Code injection. Kinh điển. Ở Trái Đất, eval() chấp nhận chuỗi ký tự rồi chạy nó như code — nếu truyền payload thay vì dữ liệu hợp lệ, hệ thống chạy code của người dùng thay vì code của mình.
Hắn dùng injection khi giả mạo Thiên Linh Căn — nhưng那时候 chỉ phát tần số giả đánh lừa hàm đọc. Lần này khác. eval() thực thi thật — linh lực đầu vào được biên dịch trong ngữ cảnh hệ thống giải đấu. Hắn có thể viết lệnh.
Luyện Khí tầng hai. Xương gãy. Ba exploit biến mất. Và trước mặt — eval() mở cửa vào hệ thống liên tông.
Đóng debug. Mở lại. Đóng. Mở.
Lập trình viên lúc ba giờ sáng cũng từng ngồi trước eval() vulnerable, biết rõ hậu quả. Nhưng deadline cũng rõ — không chạy thì không xong.
Không có deadline. Tám mươi ba ngày trước khi Thiên Đạo gửi thứ gì đó đến sửa hắn. Giải đấu liên tông — chắc chắn thua nếu dùng thực lực thật, Luyện Khí tầng hai đấu Trúc Cơ sơ kỳ.
Không có lựa chọn nào tốt hơn.
Hai đêm phân tích. Eval() không chỉ nhận đầu vào — nó phản hồi qua giá trị trả về dùng để xác nhận registration. Nếu craft payload đúng, giá trị trả về khớp điều kiện "thành công" — hệ thống ghi nhận hắn là thí sinh hợp lệ.
Payload: injection ghi đè trường tuvi_goc. Thay Luyện Khí tầng hai thành tầng năm — hợp lý cho thí sinh liên tông. Không cao gây nghi ngờ, không thấp bị loại. Ba dòng. Ba lệnh. Đơn giản đến mức buồn cười — hậu quả thì không.
Ngày thứ ba. Đ đêm. Phòng trận pháp nửa đêm không ai. Hắn ngồi xuống, tay phải đặt lên recv_input().
Truyền linh lực — ba tần số đan xen, mỗi tần số chứa một phần payload. Phức tạp gấp nhiều lần injection giả mạo linh căn. Phải truyền đồng thời, đúng thứ tự, đúng thời điểm eval() chờ nhận — sai một tần số, eval() reject toàn bộ.
Truyền vào. Eval() bắt đầu processing.
Cảm giác khác mọi lần trước. Lần trước — lén lút, trộm cắp. Lần này — mở cửa cho chính mình vào căn phòng cả thế giới nghĩ đã khóa. Hệ thống đang mời hắn vào. Chỉ không biết mời ai.
Ba tần số đan xen. Eval() nhận. Xử lý. Tuvi_goc thay đổi. Bảng registration: "Lý Minh — Luyện Khí tầng năm — Thiên Kiếm Tông — Đủ điều kiện."
Rút tay. Hơi thở bình thường. Tim đập nhanh.
Debug interface hiện dòng chữ. Đỏ. Sâu hơn mọi cảnh báo trước. Chậm — từng chữ rõ ràng, không nhấp nháy.
"eval() executed custom payload. Scope: GLOBAL."
GLOBAL.
Không phải FUNCTIONAL — scope chỉ ảnh hưởng eval() và registration. GLOBAL nghĩa payload leak ra, tràn sang toàn bộ hệ thống liên kết — bốn tông, bốn vùng, hàng trăm trận pháp con. Payload đã đi vào và chưa dừng lại.
Dòng thứ hai, chậm hơn.
"Hậu quả: Chưa xác định."
Trong lập trình, "chưa xác định" tệ hơn "lỗi". Lỗi có thể debug. Chưa xác định nghĩa hệ thống cũng không biết vừa xảy ra gì — và khi hệ thống không biết, không ai có thể biết.
Hắn ngồi bất động. Trận bàn sáng — dòng chữ registration: "Lý Minh — Luyện Khí tầng năm." Registration hợp lệ. Và toàn bộ hệ thống liên tông vừa bị một thí sinh Luyện Khí tầng hai ghi đè bằng payload chưa xác định hậu quả.
Bên ngoài cửa sổ, đêm lạnh. Giải đấu còn bốn ngày. Bốn ngày tìm hiểu GLOBAL scope leak những gì — trước khi bất kỳ hệ thống nào nhận ra.
Hắn đứng dậy. Vai trái đau. Vừa hack giải đấu — và chưa hiểu mình vừa làm gì.
Nếu Cổ Tịch Âm từng exploit ở tầng sâu hơn, rộng hơn, thì GLOBAL scope chỉ là bề mặt. Đâu là đáy?
Tám mươi ba ngày. Một global leak chưa xác định. Và bốn tông môn sắp thi đấu trên nền tảng hắn vừa thay đổi mà không ai hay biết.