Chương 085: Săn Lùng Dấu Vết Phong Cách Code
05 giờ 12 phút.
Phòng lab bí mật ở Quận 1 vẫn sáng đèn.
Không có cửa sổ mở.
Không có tiếng người ngoài hành lang.
Chỉ có tiếng quạt tản nhiệt đều đều từ những chiếc máy tính đặt sát tường.
Trên màn hình lớn giữa phòng là bốn tập dữ liệu.
Một mẫu mã độc liên quan đến Cát Lái.
Một đoạn chương trình thu được sau vụ tấn công hệ thống tại Khu Công nghệ cao Thủ Đức.
Một phần mã còn sót lại từ kho SIM Box Quận 2.
Và cuối cùng là dữ liệu cũ được Lão Cửu giữ suốt nhiều năm.
Không nhiều.
Nhưng đủ để một người từng viết nó nhận ra.
Nam đứng trước màn hình.
“Ba mẫu mới đều có dấu hiệu giống nhau.”
Vũ ngồi phía sau, tay cầm ly cà phê.
“Giống cái gì?”
“Cách chia hàm.”
“Cái đó có thể do cùng một thư viện.”
“Cách xử lý lỗi.”
“Cũng có thể do cùng một framework.”
“Cách đặt tên biến.”
“Có thể học theo.”
Nam quay lại.
“Vậy còn khoảng cách lùi dòng?”
Vũ đặt ly xuống.
“Cái đó khó giả hơn.”
Nam gật đầu.
Đó chính là lý do hai người ngồi ở đây.
Không phải để tìm một dòng mã đặc biệt.
Không phải tìm một đoạn chữ ký mà bất kỳ phần mềm chống mã độc nào cũng có thể phát hiện.
Họ đang tìm thứ gần với thói quen.
Một lập trình viên có thể đổi tên biến.
Có thể đổi cách chú thích.
Có thể dùng thư viện khác.
Có thể viết lại một hàm.
Nhưng những thói quen nhỏ thường khó biến mất hoàn toàn.
Cách người đó xuống dòng.
Cách họ chia một khối lệnh.
Khoảng cách giữa các phần.
Thứ tự xử lý lỗi.
Tên biến tạm.
Cách đặt dấu ngoặc.
Thậm chí cả việc họ thích để một câu lệnh trên một dòng hay gom nhiều thứ lại.
Vũ gọi đó là dấu vân tay của người viết.
“Không phải chứng cứ định danh tuyệt đối.”
Ông nói.
“Nhớ kỹ.”
Nam nhìn ông.
“Cháu biết.”
“Không. Cậu phải nhớ trước khi nhìn kết quả.”
Vũ kéo ghế lại gần.
“Stylometry chỉ nói cho chúng ta biết hai thứ có khả năng cùng một người viết hay không. Nó không được phép tự biến thành câu: ‘Tôi đã tìm thấy thủ phạm.’”
Nam ngồi xuống.
“Vậy bắt đầu từ đâu?”
“Đừng tìm tên.”
“Vậy tìm gì?”
“Thói quen.”
Nam mở một thư mục.
Trên màn hình hiện ra hàng trăm đoạn mã đã được làm sạch những phần không cần thiết.
Không có dữ liệu cá nhân.
Không có khóa truy cập.
Chỉ còn cấu trúc mã phục vụ phân tích.
Vũ không trực tiếp thao tác.
Ông chỉ nhìn.
“Chia nhóm.”
Nam làm theo.
“Một nhóm từ Cát Lái.”
“Ừ.”
“Một nhóm từ Thủ Đức.”
“Ừ.”
“Một nhóm từ kho Quận 2.”
“Ừ.”
“Dữ liệu cũ của anh?”
“Để riêng.”
Nam hơi dừng.
“Anh chắc muốn đưa nó vào?”
“Chính vì tôi không chắc nên mới đưa.”
Nam nhìn màn hình.
“Anh sợ kết quả?”
“Không.”
Vũ trả lời.
“Tôi sợ mình muốn kết quả nào đó.”
Câu nói làm Nam im lặng.
Đó là điều cậu từng không hiểu.
Một người có thể nhìn vào dữ liệu rất nhiều giờ nhưng vẫn không nhìn thấy sự thật nếu trong đầu đã có đáp án.
Nam từng mắc lỗi ấy.
Cậu từng nghĩ thuật toán càng mạnh thì con người càng ít có cơ hội nói dối.
Sau những gì đã xảy ra, cậu hiểu ngược lại.
Máy móc chỉ có thể xử lý những gì con người đưa vào.
Còn người điều tra phải chịu trách nhiệm với cách mình đọc kết quả.
Nam bắt đầu.
05 giờ 31 phút.
Những mẫu đầu tiên được phân nhóm.
Có hơn hai mươi đặc điểm.
Không phải tất cả đều có giá trị.
Một số đặc điểm quá phổ biến.
Một số thay đổi theo công cụ.
Một số bị ảnh hưởng bởi tiêu chuẩn của hệ thống.
Nam loại bỏ từng nhóm.
Vũ ngồi phía sau quan sát.
“Cái này bỏ.”
“Vì sao?”
“Độ thụt dòng giống nhau chưa nói được gì.”
“Còn cái này?”
“Để lại.”
“Cách đặt biến?”
“Chỉ giữ những biến có tính lặp.”
Nam ghi chú.
“Còn tên hàm?”
“Giữ.”
“Comment?”
“Giữ riêng.”
“Cách xử lý ngoại lệ?”
“Quan trọng.”
“Thứ tự gọi hàm?”
“Rất quan trọng.”
Nam nhìn ông.
“Anh đã phân tích kiểu này trước đây?”
Vũ không trả lời ngay.
Một lúc sau ông nói:
“Ngày trước chúng tôi từng dùng cách khác.”
“Ở K-14?”
“Ừ.”
Nam quay lại màn hình.
“K-14 có stylometry?”
“Không gọi tên như bây giờ.”
“Nhưng làm tương tự?”
“Người ta luôn có thói quen. Chỉ là ngày trước chưa có nhiều công cụ để thống kê.”
Nam hiểu.
Kẻ viết code có thể xóa chữ ký.
Nhưng rất khó xóa hoàn toàn thói quen.
06 giờ 04 phút.
Một bảng kết quả xuất hiện.
Nam nhìn.
“Có tương quan.”
Vũ không phản ứng.
“Bao nhiêu?”
“Nhóm Cát Lái với Thủ Đức khá cao.”
“Bình thường.”
“Quận 2 cũng nằm cùng nhóm.”
Vũ đứng dậy.
“Đừng nhìn phần trăm.”
Nam quay lại.
“Vậy nhìn gì?”
“Đặc điểm cụ thể.”
Nam mở danh sách.
Một chuỗi đặc điểm xuất hiện.
Tên biến trung gian có cấu trúc không phổ biến.
Một kiểu xuống dòng.
Một cách đặt ngoặc.
Một thói quen để khoảng trắng trước và sau một số toán tử.
Và đặc biệt—
một kiểu chú thích rất ngắn.
Không giải thích chức năng.
Chỉ ghi mục đích.
Nam đọc.
“hold, restore, fallback.”
Vũ gật.
“Đúng.”
“Có gì đặc biệt?”
“Cách dùng.”
“Anh từng thấy?”
“Rất nhiều.”
“Nhưng?”
“Không nhiều người dùng đúng thứ tự này.”
Nam mở dữ liệu cũ.
Một đoạn mã từ mười năm trước hiện lên.
Cậu nhìn.
Rồi nhìn lại ba mẫu mới.
Cậu không nói.
Vũ cũng không nói.
Một khoảng im lặng kéo dài.
Nam phóng lớn.
Có một biến trung gian trong mã cũ.
Tên rất đơn giản.
Không có gì đặc biệt.
Nhưng vị trí của nó trong cấu trúc xử lý giống hệt.
Không phải cùng tên.
Không phải cùng đoạn mã.
Mà là cùng thói quen.
Nam nói:
“Người này học lại từ mã cũ?”
“Có thể.”
“Hoặc chính người cũ viết.”
“Có thể.”
“Vậy xác suất?”
Vũ lắc đầu.
“Đừng hỏi tôi một con số để tự thuyết phục mình.”
Nam ngồi lại.
“Được.”
Cậu tiếp tục lọc.
06 giờ 37 phút.
Một vấn đề xuất hiện.
Mẫu Thủ Đức có một số đoạn được viết bởi đội kỹ thuật địa phương.
Nếu đưa toàn bộ vào, kết quả bị nhiễu.
Nam loại các phần đó.
Mẫu Cát Lái cũng có thư viện bên thứ ba.
Tiếp tục loại.
Kho SIM Box còn tệ hơn.
Nhiều thiết bị được mua từ các nguồn khác nhau.
Mã điều khiển không hoàn toàn đồng nhất.
Nam phải tách từng phần.
Vũ không thúc giục.
Ông chỉ ngồi hút thuốc ngoài cửa.
Mỗi lần Nam quay lại, ông đều hỏi một câu giống nhau.
“Còn bao nhiêu mẫu sạch?”
Không hỏi kết quả.
Không hỏi đã tìm thấy ai.
Chỉ hỏi dữ liệu còn sạch bao nhiêu.
07 giờ 16.
Nam nói:
“Còn mười bảy.”
“Đủ chưa?”
“Đủ để so sánh sơ bộ.”
“Vậy mới được phép nghi.”
Nam nhìn ông.
“Còn kết luận?”
“Chưa.”
08 giờ 02.
Nam chạy lại phân tích.
Lần này không dùng toàn bộ đặc điểm.
Chỉ dùng những thói quen ít chịu ảnh hưởng bởi môi trường.
Cách đặt tên biến tạm.
Cách lùi dòng.
Cách đóng khối.
Cách xử lý lỗi.
Cách chú thích.
Thứ tự ưu tiên khi hệ thống gặp tình trạng bất thường.
Kết quả hiện ra.
Ba mẫu hiện tại nằm trong cùng một cụm.
Dữ liệu cũ cũng nằm trong cụm đó.
Nhưng chưa đủ.
Nam nhìn Vũ.
“Có một vấn đề.”
“Gì?”
“Không thể loại trừ việc người hiện tại đã học từ mã cũ.”
“Đúng.”
“Vậy cần nguồn khác.”
“Chính xác.”
Nam mở dữ liệu từ vụ cháy kho.
Một file còn sót lại được đưa vào.
Nó không hoàn chỉnh.
Chỉ là một đoạn rất ngắn.
Nam làm sạch.
Phân tích.
Kết quả hiện ra.
Không giống toàn bộ.
Nhưng có một thói quen giống dữ liệu cũ.
Vũ đứng sau lưng Nam.
Ông nhìn màn hình.
Lần đầu tiên trong buổi sáng, sắc mặt thay đổi.
Nam nhận ra.
“Anh biết?”
Vũ không trả lời.
“Anh Vũ?”
“Phóng lớn phần comment.”
Nam phóng lớn.
Chỉ có một dòng.
Không phải câu hoàn chỉnh.
Một cách viết tắt.
Vũ nhìn nó rất lâu.
“Ngày trước Khải hay viết vậy.”
Nam hỏi:
“Trần Minh Khải?”
“Ừ.”
“Nhưng anh ấy đã chết.”
“Đúng.”
“Vậy…”
“Không kết luận.”
Nam im lặng.
Vũ bước tới màn hình.
“Người ta có thể bắt chước một câu.”
Ông chỉ vào dòng comment.
“Có thể bắt chước cách đặt biến.”
Ông chỉ tiếp.
“Có thể bắt chước cả khoảng cách.”
Rồi ông chỉ vào cấu trúc.
“Nhưng nếu năm đặc điểm nhỏ xuất hiện cùng nhau qua nhiều mẫu độc lập…”
Nam nói:
“Thì khả năng chỉ là bắt chước giảm xuống.”
“Đúng.”
“Và nếu còn có dữ liệu cũ?”
“Thì chúng ta có một mối liên hệ cần điều tra.”
Nam nhìn bảng.
“Liên hệ với Khải.”
Vũ sửa:
“Liên hệ với phong cách của Khải.”
Căn phòng lại im.
09 giờ 11.
Nam bắt đầu tìm những người từng tiếp xúc với kiến trúc K-14.
Không truy cập trái phép.
Không đột nhập.
Không phá hệ thống.
Chỉ sử dụng hồ sơ điều tra mà A05 đã có, tài liệu công khai và những dữ liệu Vũ từng lưu.
Danh sách không dài.
Những người trực tiếp tham gia dự án cũ đã thay đổi vị trí.
Một số nghỉ việc.
Một số chuyển ngành.
Một số đã mất.
Một số trở thành cố vấn.
Nam mở từng hồ sơ.
Không có.
Không có.
Không có.
Rồi một cái tên xuất hiện.
Lê Minh Quang.
Chuyên gia tư vấn bảo mật cấp cao.
Hiện đang làm cố vấn độc lập cho một số cơ quan và doanh nghiệp tài chính.
Nam đọc tiếp.
Có một dòng khiến cậu dừng lại.
Thành viên nhóm tư vấn an toàn hệ thống cho Ủy ban Tài chính Thành phố.
Nam nhìn Vũ.
“Ủy ban Tài chính Thành phố.”
Vũ không nói.
“Người này từng tham gia nhóm kỹ thuật liên quan đến một hệ thống có kiến trúc K-14.”
“Thời gian?”
Nam kiểm tra.
“Sau khi Khải chết.”
Vũ gật.
“Bao lâu?”
“Khoảng hai năm.”
“Không có nghĩa gì.”
“Cháu biết.”
Nam mở ảnh hồ sơ.
Một người đàn ông khoảng ngoài năm mươi.
Tóc bạc hai bên.
Kính mỏng.
Ảnh chụp trong một hội thảo chuyên môn.
Không có vẻ gì đặc biệt.
Không giống hình dung về một kẻ nguy hiểm.
Nam nói:
“Stylometry không cho thấy đây là ông ta.”
“Đúng.”
“Nhưng hồ sơ cho thấy ông ta từng tiếp xúc với kiến trúc K-14.”
“Tiếp.”
“Ông ta hiện làm tư vấn bảo mật cấp cao.”
“Tiếp.”
“Và các mẫu code mới có phong cách rất gần dữ liệu cũ.”
Vũ nhìn màn hình.
“Vẫn chưa đủ.”
Nam hơi thất vọng.
“Vậy còn thiếu gì?”
“Bằng chứng người này thật sự chạm vào những mẫu code mới.”
Nam im lặng.
Vũ nói:
“Đó mới là điểm quan trọng.”
10 giờ 03.
Nam nhận được một tập tài liệu từ Nghĩa.
Không phải dữ liệu bí mật mới.
Chỉ là hồ sơ nhân sự liên quan đến các nhóm tư vấn từng xuất hiện quanh những hệ thống tài chính bị ảnh hưởng.
Trong danh sách có Lê Minh Quang.
Nhưng một tài liệu khác khiến Nam chú ý.
Một biên bản họp kỹ thuật cách đây hơn một năm.
Tên Quang xuất hiện ở cuối.
Chữ ký điện tử.
Nam mở phần phụ lục.
Một đoạn cấu hình mẫu.
Không phải mã độc.
Không phải mã tấn công.
Chỉ là một đoạn mã minh họa trong tài liệu kỹ thuật.
Nam lập tức tách phần đó.
Chạy phân tích.
Kết quả xuất hiện sau vài giây.
Cụm đặc điểm—
trùng với nhóm hiện tại.
Nam đứng bật dậy.
“Anh Vũ.”
Vũ quay lại.
“Có rồi.”
Ông bước tới.
Nam chỉ màn hình.
“Đây không còn là code lấy từ vụ án. Đây là đoạn mã trong tài liệu do chính ông ta ký tên.”
Vũ nhìn kết quả.
“Đối chiếu lại.”
“Cháu đã làm ba lần.”
“Làm lần thứ tư.”
Nam thở ra.
Nhưng vẫn chạy.
Kết quả không thay đổi.
Một số đặc điểm mạnh hơn hẳn.
Đặc biệt là cách tổ chức biến tạm và cấu trúc xử lý lỗi.
Vũ nhìn bảng.
“Bây giờ mới có cơ sở.”
Nam hỏi:
“Ông ta là người phản bội năm xưa?”
Vũ không trả lời ngay.
“Không biết.”
“Nhưng phong cách code…”
“Phong cách code chỉ cho ta người viết hoặc người chịu ảnh hưởng rất sâu.”
“Vậy người này—”
“Có thể là người của Khải.”
Nam nhìn lại hồ sơ.
“Nhưng ông ta đang làm tư vấn cho Ủy ban Tài chính Thành phố.”
Vũ gật.
“Đó mới là vấn đề.”
10 giờ 41.
Thượng tá Nghĩa bước vào phòng lab.
Ông nhìn hai người.
“Có gì?”
Nam xoay màn hình.
“Chúng tôi có một người cần kiểm tra.”
Nghĩa đọc tên.
Lê Minh Quang.
Ông không tỏ vẻ ngạc nhiên.
“Người này?”
“Có vấn đề?”
“Chưa.”
Nghĩa đặt tập hồ sơ xuống.
“Ông ta từng xuất hiện trong một số cuộc họp tư vấn bảo mật. Chuyên môn tốt. Hồ sơ sạch.”
Nam nói:
“Chúng tôi phát hiện phong cách code của ông ta trùng đáng kể với mẫu liên quan đến chuỗi tấn công hiện tại.”
Nghĩa nhìn Vũ.
“Anh kết luận?”
Vũ lắc đầu.
“Chưa.”
“Vậy tại sao đưa tên cho tôi?”
“Để xác minh.”
Nghĩa gật.
“Đúng cách.”
Ông nhìn lại hồ sơ.
“Nhưng có một chuyện.”
“Chuyện gì?”
“Ông Quang hiện đang làm tư vấn cho Ủy ban Tài chính Thành phố.”
Nam khựng lại.
“Ông ta có quyền tiếp cận hệ thống?”
“Không phải tất cả.”
“Nhưng?”
“Đủ để biết cấu trúc vận hành của một số hệ thống tài chính.”
Phòng lab im lặng.
Vũ nhìn Nghĩa.
“Có thể kiểm tra lịch ra vào?”
“Có.”
“Lịch tiếp xúc với các đơn vị liên quan?”
“Có.”
“Các tài liệu kỹ thuật ông ta từng nhận?”
“Phải xin.”
“Đừng để ông ta biết chúng ta đang tìm.”
Nghĩa nhìn Vũ.
“Anh nghi ông ta?”
“Không.”
Vũ đáp.
“Tôi nghi dữ liệu.”
Nghĩa nhìn ông vài giây rồi gật.
“Được.”
Ông cầm hồ sơ đi ra.
Trước khi đóng cửa, Nghĩa quay lại.
“Có một chuyện nữa.”
“Gì?”
“Trong vụ kho Quận 2, chúng tôi tìm được ký hiệu FX-7.”
Nam nhìn Vũ.
Nghĩa nói tiếp:
“Và trong một tài liệu cũ có liên quan đến nhóm tư vấn của Quang…”
Ông đặt một bản sao lên bàn.
“…cũng từng xuất hiện ký hiệu FX.”
Vũ không chạm vào tài liệu.
Nam nhìn dòng chữ.
Chỉ hai ký tự.
FX.
Không đủ để kết luận.
Nhưng đủ để mở thêm một cánh cửa.
11 giờ 17.
Sau khi Nghĩa rời đi, Nam vẫn nhìn hồ sơ Lê Minh Quang.
“Anh nghĩ ông ta là ai?”
Vũ hút một hơi thuốc.
“Có thể là người biết Khải.”
“Có thể là người học từ Khải.”
“Có thể.”
“Có thể là người tiếp tục công việc của Khải.”
Vũ không trả lời.
Nam nhìn ông.
“Hoặc…”
“Đừng nói.”
“Vì chưa đủ?”
“Vì câu tiếp theo của cậu sẽ là điều cậu muốn tin.”
Nam im lặng.
Một lúc sau, cậu đóng hồ sơ.
“Vậy bước tiếp theo?”
Vũ đứng dậy.
“Không tìm ông ta bằng cách chui vào máy của ông ta.”
“Vậy?”
“Tìm xem ông ta đã đi đâu.”
Nam hiểu.
Con người để lại dấu vết khác với máy tính.
Lịch họp.
Người gặp.
Tài liệu ký.
Hợp đồng.
Khoảng thời gian xuất hiện ở một nơi.
Những việc tưởng như không liên quan.
Vũ nhìn màn hình lần cuối.
“Code nói người viết có thói quen.”
Ông nói.
“Con người nói người đó có lịch sử.”
Nam gật.
Ngoài hành lang, tiếng bước chân của Nghĩa xa dần.
Trên màn hình vẫn còn hồ sơ Lê Minh Quang.
Ảnh chân dung bình thường.
Chức danh bình thường.
Lý lịch bình thường.
Một chuyên gia bảo mật cấp cao đang làm việc cho các hệ thống tài chính của thành phố.
Không có gì chứng minh ông ta là kẻ phản bội.
Chưa có gì chứng minh ông ta là người của Khải.
Nhưng lần đầu tiên sau mười năm, Lão Cửu nhìn thấy một cái tên nằm giữa quá khứ và hiện tại.
Một người còn sống.
Một người đang hoạt động công khai.
Một người có phong cách code trùng với dấu vết của kẻ mà Vũ từng nghĩ đã biến mất cùng Trần Minh Khải.
Vũ tắt màn hình.
“Nam.”
“Dạ?”
“Đừng săn người.”
Nam nhìn ông.
“Săn dấu vết.”
Vũ cầm chiếc áo khoác.
“Người có thể diễn.”
Ông mở cửa.
“Lịch sử thì khó diễn hơn.”
Cánh cửa phòng lab khép lại.
Trên bàn, bản sao tài liệu vẫn còn đó.
Dòng ký hiệu FX nằm ở cuối trang.
Và bên cạnh nó là một cái tên:
LÊ MINH QUANG — CHUYÊN GIA TƯ VẤN BẢO MẬT CẤP CAO.
Lần đầu tiên, cuộc săn không còn chỉ hướng vào một chiếc máy chủ.
Nó đã chạm tới một con người đang đứng ngay trong hệ thống mà họ đang cố bảo vệ.
--=---
PLS FOLLOW KÊNH ĐỂ TẠO ĐỘNG LỰC CHO TÁC GIẢ VÀ THEO DÕI CÁC CHƯƠNG TIẾP THEO …
---==--