Cách để mất 1,3TB bí mật, theo cách của Novo Nordisk.
Một access token trong JavaScript của một subdomain bị lãng quên đã trở thành 1,3TB bí mật bị đánh cắp. Két sắt doanh nghiệp bảo vệ con người. Vụ xâm nhập đi vào qua thông tin xác thực của máy — phần không ai quản trị.
Tháng này Novo Nordisk — hãng dược phẩm Đan Mạch đứng sau Ozempic và Wegovy — xác nhận rằng kẻ tấn công đã xâm nhập được vào hệ thống của hãng [1]. Các nhà nghiên cứu cho biết đường đi vào là một access token có đặc quyền cao nằm trong JavaScript của một subdomain bị lãng quên, công khai: một bí mật được ship tới trình duyệt, ai mở View Source cũng đọc được [2]. Cẩu thả, đúng. Nhưng một công ty quy mô như vậy không cẩu thả với thông tin xác thực nói chung — gần như chắc chắn họ có hệ thống quản lý thông tin xác thực nghiêm túc, bộ máy quản trị truy cập đặc quyền quyết định ai đăng nhập được vào đâu. Tất cả điều đó đều vô nghĩa, vì tất cả đều canh giữ nhầm phía của ngôi nhà.
Chuyện gì thực sự đã xảy ra
Token đầu tiên đó có đặc quyền đủ để clone các private repository của Novo Nordisk. Và trong các repository đó chứa đầy thông tin xác thực khác — vì đó là nơi thông tin xác thực của máy trú ngụ, ở gần như mọi công ty trên đời: hard-code trong source, nằm trong config, nướng vào CI pipeline, commit một lần rồi quên. Clone repo không chỉ giao mã nguồn cho kẻ tấn công. Nó giao cho họ bộ khóa tiếp theo, và bộ khóa sau đó nữa.
Đó là cách một token bất cẩn biến thành sự xâm phạm toàn bộ. Một nhóm tự xưng FulcrumSec nói rằng họ xoay trục theo cách này trong hai tháng rưỡi và mang đi hơn 700.000 file — khoảng 1,3 terabyte — gồm mã nguồn, dữ liệu thuốc đã và chưa được bán, hồ sơ thử nghiệm lâm sàng, công nghệ sản xuất, và các mô hình AI nội bộ của công ty [3]. Khi khoản tiền chuộc được cho là 25 triệu USD bị từ chối, nhóm này bắt đầu công bố chiến lợi phẩm. (Novo Nordisk đã xác nhận truy cập trái phép vào một số lượng hạn chế hệ thống; phạm vi đầy đủ là tuyên bố của kẻ tấn công, chưa được xác minh độc lập [1][3].)
Một token bị rò rỉ là tay nắm cửa. Các repository chứa đầy thông tin xác thực tồn tại lâu dài chính là tòa nhà không khóa cửa phía sau.
Đây không phải sự bất cẩn. Đây là một khoảng trống về loại hình.
Quản lý thông tin xác thực cấp doanh nghiệp — những két sắt hạng CyberArk, bộ công cụ truy cập đặc quyền mà mọi công ty lớn đều vận hành — được xây dựng cho con người: tài khoản người dùng, phiên đăng nhập, ai-đi-tới-đâu. Nó làm tốt điều đó. Những thông tin xác thực đã đổ sập qua vụ xâm nhập này lại hoàn toàn ở phía bên kia. Token trong JavaScript, các bí mật trong repo, các khóa trong CI pipeline là thông tin xác thực của máy — loại mà ứng dụng, dịch vụ, và giờ đây là các agent dùng để xác thực với nhau, không có con người trong vòng lặp. Phía đó chưa bao giờ có một két sắt.
Và đó chính là phía đang bùng nổ. Mỗi tích hợp mới, mỗi microservice, mỗi AI agent bạn triển khai đều nhân lên số thông tin xác thực máy tồn tại lâu dài mà không ai quản trị. Mối nguy đã chuyển sang phía ứng dụng-và-agent, còn bộ công cụ thì không di chuyển theo. Vậy nên các bản post-mortem sẽ chốt ở câu "đừng đặt token trong JavaScript", và đó là đánh nhầm trận. Token sẽ luôn bị rò rỉ — vào một log, một screenshot, một bundle bị lãng quên. Bạn không thể thắng trong trò không bao giờ làm lộ thông tin xác thực đầu tiên. Điều biến một lần rò rỉ thành 1,3 terabyte là tòa nhà thông tin xác thực máy tồn tại lâu dài nằm phía sau nó, trong code, chờ bị clone. Lấy được một cái, là có bản đồ tới phần còn lại.
Xây dựng cho điều này, có chủ đích
Khoảng trống đó chính là lý do Clavitor tồn tại: một két sắt cho phía mà CyberArk chưa bao giờ được xây dựng để phục vụ — thông tin xác thực mà ứng dụng và agent sử dụng. Với Clavitor, không có thông tin xác thực nào trong các repository để mà thu hoạch. Code không bao giờ nắm giữ một bí mật có thể bị commit; nó hỏi két sắt để sử dụng một thông tin xác thực đúng vào thời điểm cần, và giá trị không bao giờ rơi vào source, config, hay bản build. Kẻ tấn công đánh cắp token đầu tiên và clone mọi repo của bạn sẽ tìm thấy đúng thứ đáng lẽ phải ở đó: code, và không có khóa. Chuỗi biến một lần rò rỉ thành tất cả sẽ đứt ở mắt xích đầu tiên.
Token ban đầu cũng bị bẻ vuốt theo cách tương tự. Một thông tin xác thực Clavitor được giới hạn cho một hành động duy nhất và có hạn, vì vậy một token tìm thấy trong bundle lạc chỗ không còn là vạn năng khóa — nó không thể clone cả tổ chức hay chạm tới bí mật tiếp theo, vì nó chỉ có hiệu lực cho đúng việc mà tên nó được đặt ra để làm. Nó gắn với máy mà nó được cấp, nên bản sao dùng ở nơi khác sẽ vô hiệu. Không một thông tin xác thực đơn lẻ nào trở thành đường ống exfiltration âm thầm: mỗi lần cấp đều bị giới hạn tần suất và kích hoạt khóa khi có đợt bất thường, để 700.000 file không lọt ra ngoài theo từng request trông hợp lý trong mười tuần. Và mọi lần sử dụng đều được ghi log ngoài máy và xâu chuỗi bằng hash, khiến việc cư trú âm thầm khó thực hiện hơn nhiều khi bản ghi không nằm trên một máy mà kẻ xâm nhập sở hữu.
Không điều nào trong số này khiến bạn bất khả xâm phạm, và ai hứa điều đó thì đang bán hàng. Hard-code một master key sống lâu và ai tìm ra nó có thể dùng nó, một lần, cho đúng phạm vi mà nó cho phép. Điều thay đổi là tìm ra một thông tin xác thực không còn giao nộp phần còn lại: không có repository chứa đầy bí mật tồn tại lâu dài phía sau nó, không có chuỗi từ lần rò rỉ tới 1,3 terabyte. Bán kính thiệt hại của một token bị rò rỉ thu hẹp lại về đúng token đó.
Phần đáng giữ lại
Tiêu đề sẽ là các công thức thuốc và phiên đấu giá trên dark web, và đó là phần gây xót. Bài học thì lặng lẽ hơn: một công ty tinh vi với hệ thống quản lý thông tin xác thực thật sự vẫn bị lấy mất 1,3 terabyte — vì két sắt của họ canh giữ con người trong khi vụ xâm nhập đi vào qua các ứng dụng. Thông tin xác thực của máy là nơi nguy hiểm đang ở hiện tại, và đó là phía duy nhất vẫn còn phơi bày. Câu trả lời không phải là lau sạch các repo — mà là một thông tin xác thực chưa từng tồn tại trong đó để mà lau, một thứ mà kể cả khi bị đánh cắp cũng chỉ dùng được cho một hành động được giới hạn, không có tủ khóa nào phía sau. Vụ rò rỉ vẫn là một vụ rò rỉ. Nó chỉ thôi không còn là chìa khóa của mọi thứ.
Chúng tôi đã ghi lại những quy tắc mà một công cụ thông tin xác thực nên tuân thủ cho phía ứng dụng-và-agent — đủ mười điều ở đây.
Clavitor (@clavitorai) là két sắt thông tin xác thực được xây dựng cho AI agent, và để chống lại chính chúng. clavitor.ai
Nguồn
[1] Novo Nordisk (@novonordisk) — Incident update. Xác nhận truy cập trái phép vào một số lượng hạn chế hệ thống CNTT nội bộ của hãng.
[2] CybelAngel (@CybelAngel) — Novo Nordisk Was Breached Through JavaScript: what the coverage got wrong. Truy vết lối vào ban đầu tới một access token có đặc quyền cao bị bỏ lại trong JavaScript phía client đã minify trên một subdomain công khai bị lãng quên.
[3] TechRepublic (@TechRepublic) — Ozempic Maker Novo Nordisk Confirms Security Incident After $25M Hacker Demand. Nhóm FulcrumSec tuyên bố thời gian cư trú ~2,5 tháng và ~700.000 file / 1,3TB — mã nguồn, dữ liệu thuốc đã và chưa bán, hồ sơ thử nghiệm lâm sàng, và mô hình AI nội bộ — sau khi clone các repository và thu thập thêm thông tin xác thực; dữ liệu bị rò rỉ sau khi khoản tiền chuộc bị từ chối.