Chương 1: Clone Repo Không Có Nghĩa Sở Hữu
Trần Đình Khải phát hiện chuyện bất thường lúc một giờ bốn mươi bảy phút sáng, và không phải bằng một dòng chữ đỏ ghi “bị đánh cắp”. Đó chỉ là một cảnh báo từ hệ thống quản lý truy cập: tài khoản của Nguyễn Minh Kiệt vừa tạo một bản lưu trữ dung lượng lớn từ kho mã chính trong khung giờ khuya, đồng thời chạy vài lệnh xuất dữ liệu từ một môi trường mà bình thường Kiệt hiếm khi động tới.
Khải nhìn màn hình lâu hơn thường lệ. Kiệt là đồng sáng lập LearnVN, CTO trên danh thiếp, người dựng phần lớn hạ tầng, quy trình triển khai, hệ thống giám sát và nhiều dịch vụ backend từ năm thứ hai. Kiệt không phải “kẻ lạ đột nhập”. Vào thời điểm đó, tài khoản của anh vẫn có quyền truy cập hoàn toàn hợp lệ, và chính điều ấy khiến mọi chuyện khó hơn gấp bội.
Khải bấm gọi. Kiệt bắt máy sau ba hồi chuông.
“Mày vừa nén cả repo chính à?”
Đầu dây bên kia im lặng một nhịp. “Ừ.”
“Để làm gì?” Khải hỏi, cố giữ giọng bình thường, và Kiệt đáp gọn: “Sao lưu phần tao viết.”
“Còn dữ liệu vừa xuất ra?”
“Tao cần thử chuyển đổi dữ liệu cho dự án mới.”
Khải đứng bật dậy khỏi ghế. “Dự án mới nào?”
“EduPro,” Kiệt đáp, giọng bình thản đến lạ. “Tao tách ra.”
Khải thấy máu nóng dồn lên tận mang tai. LearnVN bây giờ đã là một công ty hơn ba mươi nhân viên, hàng triệu tài khoản đăng ký và một hệ thống thanh toán gói cao cấp tương đối ổn định. Nó không còn là cái app viết trong phòng trọ của riêng Khải. Hai người đã lập pháp nhân từ lâu, dù nhiều thứ vẫn được quản lý rất tệ: thỏa thuận giữa các nhà sáng lập chưa hoàn chỉnh, việc chuyển giao sở hữu trí tuệ từ giai đoạn đầu sang công ty được làm muộn, tỷ lệ cổ phần có giấy tờ về sau nhưng một số đóng góp trước khi thành lập công ty chưa được hệ thống hóa. Quyền truy cập thì rộng hơn mức cần thiết, chỉ vì hai người từng tin nhau.
“Mày mang repo của công ty sang công ty mới?”
“Tao viết rất nhiều code trong đó.”
“Viết nhiều không có nghĩa mày được bê cả repo đi.”
Kiệt vặc lại ngay, như thể đã chuẩn bị câu này từ lâu: “Mày cũng đâu có hợp đồng nào từ đầu chứng minh tất cả thuộc về mày.”
“Tao không nói nó thuộc về tao.”
Khải khựng lại. Câu đó làm chính anh ngạc nhiên. Ba năm trước, anh sẽ buột miệng “code của tao” mà không nghĩ ngợi. Nhưng giờ có công ty, có nhân viên, cộng tác viên bên ngoài, thư viện mã nguồn mở, nội dung có bản quyền và dữ liệu người dùng. Kho mã không còn là thứ có thể chia bằng câu “tao viết sáu mươi phần trăm, mày bốn mươi”.
“Còn dữ liệu người dùng?” Khải hỏi.
Kiệt thở dài. “Tao xuất một phần nhỏ để thử cấu trúc dữ liệu.”
“Dữ liệu thật?”
“Ừ.”
“Mày đưa sang môi trường của EduPro rồi?” Lần này Kiệt không trả lời. Khải không chửi. Sự im lặng ấy đã đủ nói lên nhiều điều. Anh cúp máy và gọi ba người khác: trưởng bộ phận kỹ thuật, chuyên gia bảo mật thuê ngoài, và luật sư Lê Minh Anh, người từng nhắc hai nhà sáng lập phải phân tách quyền hạn từ sáu tháng trước mà chưa ai coi là việc gấp.
Minh Anh nghe xong chỉ hỏi một câu: “Kiệt còn quyền truy cập không?” Nghe Khải xác nhận là còn, chị dặn ngay: “Đừng xóa nhật ký. Lưu giữ trước đã.”
“Em định thu hồi quyền ngay.”
“Thu hồi sau khi đội kỹ thuật xác định được phạm vi cần lưu giữ. Đổi toàn bộ khóa bí mật và thông tin đăng nhập theo kế hoạch xử lý sự cố. Và đừng tự vào tài khoản của Kiệt hay xóa thứ gì để trả đũa.”
“Nhưng repo đã đi rồi chị.”
“Repo là một vấn đề. Dữ liệu người dùng là vấn đề khác. Khóa bí mật là vấn đề khác nữa. Cổ phần và quyền sở hữu trí tuệ lại là chuyện riêng.”
Khải ngồi phịch xuống. “Em muốn chặn EduPro.”
“Trước tiên phải biết EduPro đang dùng cái gì, và LearnVN có quyền gì với thứ đó.”
“Lịch sử Git có hết mà.”
“Git cho biết rất nhiều về trình tự và ai viết dòng nào. Nó không tự quyết định ai sở hữu về mặt pháp lý.” Khải ghét câu đó, nhưng biết nó đúng.
Chuyên gia bảo mật mở một kênh riêng cho sự cố thay vì bàn trong nhóm chat thông thường. Họ ghi lại thời điểm truy cập bất thường, tài khoản liên quan, các hệ thống bị chạm tới, những loại dữ liệu có thể đã bị xuất, các khóa cần thay, nhật ký cần lưu giữ và những điều chưa biết. Không có dòng nào ghi “Kiệt đã đánh cắp mười triệu người dùng”, vì họ chưa biết điều đó.
Đến bốn giờ sáng, đội kỹ thuật xác định được vài điều. Bản lưu trữ kho mã được tạo từ tài khoản Kiệt, trong phạm vi quyền truy cập hợp lệ. Một số khóa bí mật của hệ thống thật có khả năng nằm trong lịch sử cấu hình hoặc môi trường build tự động, nên cần thay ngay. Có một lệnh xuất dữ liệu chạy từ bản sao cơ sở dữ liệu dùng cho phân tích, nhưng chưa rõ chính xác tập dữ liệu nào và nó đã đi tới đâu. Ngay lúc ấy, chưa có bằng chứng nào cho thấy toàn bộ cơ sở dữ liệu mười triệu người dùng đã bị sao chép.
Khải thở ra, nhưng không thấy nhẹ nhõm. Ngay cả một phần nhỏ dữ liệu người dùng thật bị đưa sang một công ty mới cũng đã là chuyện nghiêm trọng.
“Bây giờ công ty phải xử lý chuyện này như một sự cố về quyền riêng tư và bảo mật,” Minh Anh nói, “không chỉ là chuyện hai nhà sáng lập cãi nhau.”
“Em muốn thông báo cho người dùng ngay.”
“Có thể sẽ phải thông báo. Nhưng phải xác định sự thật, nghĩa vụ pháp lý và nội dung chính xác trước. Đừng tung ra con số mười triệu khi chưa biết phạm vi.” Khải gật đầu.
Khi trời sáng, quyền truy cập của Kiệt bị đình chỉ theo một quyết định quản trị khẩn cấp. Các khóa và thông tin đăng nhập quan trọng được thay mới, nhật ký được giữ nguyên, trạng thái hệ thống được ghi lại theo quy trình của chuyên gia bảo mật. Không ai “tấn công ngược” EduPro để lấy bằng chứng. Không ai xóa được bản repo Kiệt đã tải về, vì không ai biết nó đang nằm ở đâu.
Khải gửi email chính thức cho Kiệt: yêu cầu dừng sử dụng hoặc chuyển giao bất kỳ tài liệu mật hay dữ liệu người dùng nào của LearnVN ngoài phạm vi được phép, và yêu cầu giữ nguyên các bản sao, nhật ký liên quan để luật sư xử lý. Anh không tuyên bố quyền sở hữu cá nhân, cũng không đe dọa công khai.
Kiệt trả lời ngắn gọn: “Tôi không đồng ý rằng toàn bộ code thuộc về LearnVN. Tôi bảo lưu quyền đối với phần tôi đã phát triển.”
Minh Anh đọc xong, đặt điện thoại xuống bàn. “Đây mới là tranh chấp thật.”
“Anh ấy sai rõ ràng mà chị.”
“Có thể sai ở chỗ mang code và dữ liệu sang công ty mới. Nhưng đóng góp thật của anh ấy vẫn phải được xem xét. Và quyền sở hữu của công ty không được chứng minh bằng việc em giận hơn anh ấy.”
Khải nhìn bảng điều khiển của kho mã. Ngày trước anh nghĩ một repo riêng tư là ranh giới an toàn. Thực ra “riêng tư” chỉ có nghĩa là quyền truy cập bị giới hạn; nếu hai nhà sáng lập cùng nắm quyền quá rộng, cả hệ thống vẫn chỉ dựa vào niềm tin.
Lần đầu tiên, Khải hiểu bảo mật và quyền sở hữu là hai câu hỏi khác nhau: ai được truy cập, và ai được phép mang thứ đã truy cập đi đâu. LearnVN chưa từng trả lời hai câu đó đủ rõ.
Giờ cả công ty phải trả học phí.