Trong năm qua, @pewdiepie đã trở thành một trong những người ủng hộ nổi bật nhất cho điện toán cá nhân, tự lưu trữ, và thực sự rất thú vị khi theo dõi hành trình này.
Khởi đầu cuối năm 2025 như một thử nghiệm giải trí - một dàn máy tại nhà với các GPU đã mod chạy mô hình mã nguồn mở, chatbot bỏ phiếu trong một "hội đồng," tài nguyên tính toán dư thừa được quyên góp cho nghiên cứu gấp protein - đã phát triển qua khoảng mười hai tháng thành một thứ có sứ mệnh rõ ràng.
Vào ngày 31 tháng 5 năm 2026, nó ra mắt với tên gọi Odysseus, một không gian làm việc AI mã nguồn mở, miễn phí, tự lưu trữ mà anh ấy thẳng thắn mô tả như một đòn nhắm vào mô hình đăng ký: ưu tiên cục bộ, ưu tiên quyền riêng tư, không theo dõi, dữ liệu của bạn ở trên phần cứng của chính bạn thay vì chảy vào tay một số ít công ty lớn.
Đối với một người có tầm ảnh hưởng như vậy, việc đưa suy luận cục bộ đến trước một lượng khán giả phổ thông, không chuyên về kỹ thuật, là điều mà giới bảo vệ quyền riêng tư đã mong muốn trong nhiều năm, và tôi hoàn toàn ủng hộ điều đó.
Nhưng tôi cũng chính là người, khi kiểm tra bản triển khai được ủy quyền của riêng mình, đã tìm ra cách chiếm quyền điều khiển một trong những máy chủ này chỉ bằng một cú nhấp chuột. Hai điều này không hề mâu thuẫn. Phần mềm đầy tham vọng, được phát hành nhanh chóng, trong một thể loại mới mẻ như thế này, chính là nơi ẩn náu của những lỗ hổng bảo mật thú vị, và việc phát hiện ra chúng sớm là cách để dự án trở nên đáng tin cậy sau này.
Vì vậy, với tinh thần giúp đỡ, đây là toàn bộ chuỗi lỗ hổng, được giải thích từ cơ bản đến nâng cao, cùng với những gì nó nói lên về thời điểm chúng ta đang xây dựng.
một cánh cửa không khóa, và một cổng tưởng chừng vô hại
Odysseus có thể chuyển các tác vụ nặng sang các máy GPU từ xa mà nó kết nối qua SSH, phương thức tiêu chuẩn để một máy tính chạy lệnh trên máy tính khác.
Do đó, một số điểm cuối nội bộ của nó được phép truy cập vào một shell lệnh - dòng lệnh thô, nơi mà nếu bạn có thể truy cập được, bạn có thể khiến máy tính làm hầu hết mọi thứ.
Một cách hợp lý, hầu hết mọi điểm cuối trong số đó đều bắt đầu bằng cách kiểm tra xem người gọi có phải là quản trị viên hay không.
Ngoại lệ là một điểm cuối nhỏ bé, lặng lẽ, có nhiệm vụ liệt kê các gói Python đã được cài đặt trên một máy chủ từ xa, và chính ngoại lệ này là nơi mọi thứ sụp đổ.
Vấn đề đầu tiên là điểm cuối này không bao giờ nhận được thông tin cần thiết để xác định người gọi, và do đó nó hoàn toàn không thực hiện kiểm tra quản trị viên và không thể làm điều đó, ngay cả trên lý thuyết.
Thứ duy nhất đứng trước nó là quy tắc chung của ứng dụng yêu cầu bạn phải đăng nhập, điều đó có nghĩa là bất kỳ tài khoản nào - kể cả tài khoản do người lạ đăng ký một phút trước - đều có thể đến được một cánh cửa chạm tới shell mà mọi điểm cuối cùng cấp khác đều cẩn thận canh giữ.

Nguyên nhân gốc rễ về mặt cấu trúc: một trình xử lý không thể thấy người đang gọi thì không thể thực thi quyền ai được phép truy cập như minh họa bên dưới.

Riêng điều đó có thể vẫn sống sót được, nhưng có một vấn đề thứ hai trong cách điểm cuối này thực hiện công việc thực tế của nó, và đó là trái tim của toàn bộ cuộc tấn công.
Để tìm ra gói nào đã được cài đặt trên một máy từ xa, chương trình viết một chỉ dẫn dưới dạng một dòng văn bản thuần và chuyển dòng đó đến một phần của hệ thống gọi là shell, có nhiệm vụ đọc dòng lệnh và thực hiện nó.
Cách dễ nhất để hình dung về shell là một trợ lý làm theo hướng dẫn bằng văn bản một cách hoàn toàn theo nghĩa đen, nơi một vài dấu câu mang ý nghĩa đặc biệt.
Dấu hiệu quan trọng ở đây là dấu chấm phẩy, mà shell hiểu là "chỉ dẫn đó đã kết thúc, bây giờ làm việc tiếp theo," do đó một dòng duy nhất có chứa dấu chấm phẩy sẽ được thực hiện như nhiều lệnh liên tiếp.


Bởi vì điều đó, các chương trình cẩn thận sẽ lấy bất cứ thứ gì mà một người đã nhập và bọc nó trong dấu ngoặc kép trước khi chuyển nó đến shell - cách để shell hiểu rằng hãy coi các ký tự đó là văn bản thông thường, không có khả năng chạy như lệnh.
Nhà phát triển đã làm đúng điều này cho tên máy chủ và cho lệnh đang được gửi, vì vậy các đầu vào đó an toàn.
Tuy nhiên, số cổng lại bị thả vào dòng một cách trần trụi, không có dấu ngoặc kép bao quanh, dựa trên giả định có vẻ hợp lý rằng một cổng luôn chỉ là một con số và một con số không thể gây hại gì. (Đường dẫn môi trường ảo cũng được nối vào mà không có dấu ngoặc kép, với cùng lý do.)
Lỗ hổng trong giả định là số cổng không nhất thiết phải là một con số. Nó đến dưới dạng văn bản thuần được lấy trực tiếp từ địa chỉ web, và người thực hiện yêu cầu có quyền quyết định nội dung của nó.
Vì vậy, thay vì 22, kẻ tấn công viết 22; id; hostname #.
Shell đọc phần đầu tiên, cố gắng kết nối và thất bại một cách vô hại, sau đó đến dấu chấm phẩy đầu tiên và ngoan ngoãn chạy hai lệnh của chính kẻ tấn công, trong khi dấu # ở cuối bảo nó bỏ qua phần văn bản còn lại đáng lẽ phải theo sau.

Một dấu chấm phẩy biến "liệt kê các gói trên một máy từ xa" thành "chạy lệnh của tôi trên máy này."
Để tiếp cận nó, bạn chỉ cần một phiên đã đăng nhập và một địa chỉ web được chế tạo:

Yêu cầu trả về HTTP 200 với JSON gói thông thường — trong khi các lệnh được chèn sẽ chạy ở phía máy chủ.
Các lệnh tôi đã chèn vào là các thăm dò vô hại, và khi đầu ra của chúng trả về và đặt tên cho tài khoản dịch vụ của chính máy chủ, nó xác nhận rằng các chỉ dẫn của tôi đã chạy trên chính máy đó.

Kết hợp hai lỗ hổng lại với nhau và bức tranh cục bộ có thể gói gọn trong một câu - bất kỳ người dùng nào đã đăng nhập đều có thể chạy các lệnh do họ chọn trên máy chủ.
Rủi ro về quy mô được gia tăng bởi chính điều khiến Odysseus trở nên thú vị.
Nếu một nhà sáng tạo với hàng trăm triệu người đăng ký thành công trong việc đưa một lượng lớn khán giả không chuyên về kỹ thuật vào việc tự lưu trữ, kết quả là hàng nghìn phiên bản tương tự, được cấu hình tương tự, tiếp xúc tương tự, tạo thành một nền văn hóa đơn nhất, và các nền văn hóa đơn nhất chính là thứ mà sâu máy tính yêu thích.
@ashnichrist đã nói rất đúng.
biến nó thành một cú nhấp chuột duy nhất
Một lỗi mà "bất kỳ người dùng nào đã đăng nhập" đều có thể kích hoạt nghe có vẻ như cần một kẻ nội bộ độc hại, và bước tiếp theo là thứ loại bỏ ngay cả yêu cầu đó, bởi vì nó khiến trình duyệt của chính nạn nhân thực hiện cuộc tấn công.
Kỹ thuật này là giả mạo yêu cầu trên trang web khác (cross-site request forgery), và nó dựa trên một thói quen lặng lẽ của trình duyệt.
Khi bạn đăng nhập vào một trang web, trình duyệt của bạn lưu trữ một mã thông báo nhỏ và sau đó tự động đính kèm nó vào các yêu cầu gửi đến trang web đó, chỉ dựa trên đích đến của yêu cầu, mà không quan tâm đến trang nào đã khởi tạo nó.

Odysseus đặt mã thông báo đó với chính sách SameSite=Lax, đây là mặc định hợp lý và chặn mã thông báo đi theo trên các yêu cầu nền lén lút - nhưng cố tình vẫn gửi nó trên một điều hướng cấp cao nhất, nghĩa là một cú nhấp chuột thông thường di chuyển toàn bộ tab của bạn đến một nơi nào đó.
Vì điểm cuối dễ bị tấn công trả lời một liên kết đơn giản, không thực hiện kiểm tra nơi xuất phát của yêu cầu và không sử dụng mã thông báo chống giả mạo, kẻ tấn công chỉ cần lưu trữ một trang có một nút hấp dẫn.
Cho bản trình diễn, tôi đã xây dựng chính xác điều đó - một trang tri ân CoComelon vui tươi, thân thiện với trẻ em và quan trọng nhất là chính xác theo cốt truyện - màu sắc của vần điệu trẻ thơ, phông chữ Comic Sans, một nút "phát" lớn.

Nút này không phải là một liên kết đến một bài hát. Trình xử lý nhấp chuột của nó mở mục tiêu thực sự trong một cửa sổ popup nhỏ dùng một lần, để yêu cầu độc hại xảy ra như một điều hướng cấp cao nhất - mang theo cookie phiên SameSite=Lax - mà không chiếm quyền tập trung, sau đó tự động đóng lại một lát sau. Địa chỉ nó mở chỉ là điểm cuối gói với lệnh được giấu trong "cổng":

Trong khi cú nhấp chuột đó được thực hiện, trang mồi nhử trình diễn một màn trình diễn cho máy quay: tác phẩm nghệ thuật CoComelon nhấp nháy trên màn hình như chớp sáng đầu nòng súng, và một thiết bị đầu cuối tự đánh máy và tường thuật từng bước của cuộc chiếm quyền điều khiển. (Văn bản thiết bị đầu cuối là lời tường thuật đã được dàn dựng cho bản demo; việc thực thi thực sự là yêu cầu thầm lặng mà popup vừa thực hiện.)

Để làm cho tác động cụ thể, một cú nhấp chuột đó đã làm ba việc: nó viết lại giao diện được phục vụ cho một sự phá hoại trực quan rõ ràng (một lớp phủ toàn màn hình "🍉 Odysseus của bạn đã bị CoComelon hóa 🍉", biểu tượng dưa hấu, ứng dụng được đổi tên), nó đọc bất cứ thứ gì người dùng dịch vụ có thể đọc, và - lâu dài nhất - nó ghi một tài khoản quản trị viên ẩn trực tiếp vào auth.json của ứng dụng.

Điều đau đớn: khởi động lại dọn dẹp đống hỗn độn rõ ràng và giữ lại tài khoản của kẻ tấn công.
Đây là bản demo trực tiếp.
tại sao đây là loại lỗi tồi tệ nhất để có trong một công cụ tác nhân (agentic tool)
Lý do một sự xâm phạm một phiên bản duy nhất nên khiến bạn lo lắng vào năm 2026 là vì một phiên bản hiếm khi là nơi những thứ này dừng lại, và con sâu máy tính đã định nghĩa năm nay cho thấy lý do tại sao.
Shai-Hulud, con sâu npm tự lan truyền được phát hiện lần đầu vào tháng 9 năm 2025 và quay trở lại với các làn sóng lớn hơn kể từ đó, chạy một vòng lặp tàn bạo đơn giản - một tập lệnh độc hại tại thời điểm cài đặt thực thi ngay khi một gói được cài đặt, quét máy để tìm các bí mật như mã thông báo npm và GitHub, khóa SSH và thông tin xác thực đám mây, và sau đó sử dụng các thông tin xác thực bị đánh cắp đó để xuất bản các phiên bản có cửa hậu của các gói khác của nạn nhân, do đó mỗi lần cài đặt mới trở thành điểm khởi động tiếp theo mà không cần nỗ lực thêm từ kẻ tấn công.
Bài học đáng mang theo là công việc khó khăn nhất của một con sâu là thu thập thông tin xác thực và tìm đường sang máy tiếp theo.
Một trợ lý AI tác nhân trao cho một con sâu
cả hai
thứ đó miễn phí, bởi vì việc nắm giữ những bí mật mạnh mẽ và tiếp cận các máy khác là toàn bộ mục đích của nó.
Cú nhấp chuột duy nhất nhắm vào Odysseus đã mang lại nhiều hơn là thực thi mã. Nó chuyển giao một kho lưu trữ đã được thu thập sẵn các khóa API đã lưu, cơ sở dữ liệu, cấu hình và quyền truy cập SSH mà công cụ sử dụng để đăng nhập vào các máy chủ GPU từ xa mà nó quản lý. Đó chính là nhiên liệu chính xác mà một cuộc tấn công tự lan truyền chạy trên đó, nằm ở một nơi với nhãn hướng ra ngoài, và kịch bản sử dụng nó đã tồn tại ngoài thực tế.

tất cả điều này có nghĩa là gì
Điều khiến tôi ấn tượng nhất là lỗi thực sự đã chiếm được máy chủ là một lỗi cổ xưa. Việc chèn lệnh (command injection) và giả mạo yêu cầu (request forgery) có các bản sửa lỗi kinh điển mà một nhà phát triển vào năm 2005 sẽ nhận ra, và chúng đang sống bên trong một trong những phần mềm AI tiêu dùng có tư duy tiến bộ nhất hiện nay - đó là mô hình xuyên suốt toàn bộ ngành công nghiệp trong năm nay, nơi các lỗ hổng AI được chú ý hóa ra lại là những lỗ hổng cổ điển nằm bên trong các công cụ mới sáng bóng.
Biên giới đã để những nguyên tắc cơ bản đó hoàn toàn có hiệu lực, sau đó xếp chồng một lớp mạnh mẽ, di chuyển nhanh chóng, thường bị tin tưởng quá mức lên trên chúng và kết nối lớp đó với mọi thứ bạn sở hữu.

cái chuông cửa chưa được đấu dây
Có một chi tiết nữa đáng để học hỏi, bởi vì đó là phần ít liên quan đến mã nhất.
Khi lần đầu tiên tôi muốn báo cáo điều này, đã có một chính sách bảo mật trong kho lưu trữ - một chính sách chu đáo, với hướng dẫn triển khai hợp lý.
Nhưng phần báo cáo của nó đã hướng những người muốn báo cáo đến "các tư vấn bảo mật GitHub nếu có," và lúc đầu, kênh riêng tư đó đơn giản là không mở.
Điều nhạy cảm nhất mà một người lạ có thể tìm thấy về dự án không có nơi riêng tư để đáp xuống. Khoảng cách đó đã được thu hẹp kể từ đó - chuỗi chèn lệnh hiện đang được theo dõi bởi một tư vấn nghiêm trọng, và các bản sửa lỗi đã được hợp nhất - nhưng sự vắng mặt ban đầu là dấu hiệu cho thấy.
May mắn thay, tôi đã có thể trò chuyện với một trong những người duy trì, người đã mở tính năng tư vấn - và kể từ đó tôi đã gửi một số bản sửa lỗi khác.

Tuy nhiên, ngoài tất cả những điều đó ra... đó là một dấu hiệu của thời đại.
Các dự án bây giờ đi từ một sở thích trên một dàn GPU tại nhà đến một lượng khán giả hàng trăm triệu người trong khoảng thời gian của một thông báo duy nhất, và giàn giáo bảo mật - một hộp thư riêng tư cho tin xấu, một quy trình tư vấn, thói quen coi đầu ra của mô hình là thù địch - tụt hậu so với mã, mà đến lượt nó lại tụt hậu so với khán giả.
Thứ tự đó hoàn toàn ngược lại với những gì kẻ thù cần có.
Một lượng người hâm mộ lớn, tin tưởng, phần lớn không rành về kỹ thuật, cài đặt cùng một phần mềm trong cùng một tuần, được hướng dẫn bởi một người mà họ đã tin tưởng, là mục tiêu hấp dẫn nhất hiện có - lớn, đồng nhất và đã được bán trước.
Đó chính xác là nền văn hóa đơn nhất mà một con sâu muốn, với thảm chào đón đã được trải sẵn.
Vì vậy, nửa đáng khích lệ của câu chuyện này không phải là mã hoàn hảo - nó không phải - mà là dự án đã đấu dây chuông cửa và gửi các bản sửa lỗi trong vòng khoảng một ngày kể từ khi nghe thấy tiếng gõ.
Đối với phần mềm di chuyển nhanh như vậy, trước một lượng khán giả lớn như vậy, phản xạ đó - mở một kênh riêng tư, trả lời nhanh chóng, sửa lỗi một cách công khai - đáng giá hơn là đã có một thành tích không tì vết ngay từ đầu. Cuối cùng, đó là cách mà sự tin tưởng vào việc tự lưu trữ thực sự được xây dựng.
Còn bây giờ... đó là tất cả, các bạn!

https://x.com/Grummz/status/2061300454907371953
https://x.com/ashnichrist/status/2061481763516399737





