Lộ plaintext secret trong phản hồi Git-stack của Finsys Dockhand

Lưu ý: Dữ liệu này chỉ có tính chất tham khảo, phục vụ nghiên cứu an ninh mạng.CyStack khuyến nghị người dùng không sử dụng các thông tin này nhằm các mục đích bất hợp pháp

Lỗ hổng CVE-2026-121449 là gì?

Lỗ hổng CVE-2026-121449 là lỗ hổng Exposure of Sensitive Information to an Unauthorized Actor ảnh hưởng tới dockhand (phiên bản bị ảnh hưởng: 1.0.47 – < 1.0.54). Lỗ hổng này được xếp hạng ở mức Cao, với điểm CVSS 7.1. Lỗ hổng này đã có mã hoặc bằng chứng khai thác công khai, nhưng điều đó chưa xác nhận việc khai thác trong thực tế.

Giới thiệu chung

Dữ liệu gốc

Dockhand từ 1.0.47 đến trước 1.0.54 làm lộ plaintext stack secret vì deployStack() gắn các giá trị secret đã được resolve vào kết quả dưới dạng resolvedSecrets, còn các Git-stack route trả về kết quả này mà không lọc. Người nắm webhook secret của một stack hoặc người dùng có quyền stacks:start có thể kích hoạt Git stack webhook, manual deploy hoặc create-and-deploy endpoint để nhận stored secret và secret từ external provider như giá trị của 1Password hoặc Vault.

Sản phẩm và phạm vi ảnh hưởng

  • Finsys dockhand: các bản 1.0.47 đến 1.0.53 bị ảnh hưởng theo dải semver từ 1.0.47 đến trước 1.0.54.
  • Bản 1.0.54 được nguồn CNA và advisory đánh dấu là bản đã vá hoặc không bị ảnh hưởng.
  • Phạm vi thực tế gồm các Git stack có secret được resolve, bao gồm stored secret và secret lấy từ external provider. Git-stack webhook, manual Git deploy và create-and-deploy là các đường dẫn bị ảnh hưởng.
  • Advisory phân biệt route non-Git POST /api/stacks/{name}/deploy, route này chỉ trả về kết quả giới hạn và không được mô tả là chịu lỗi tương tự.
  • Trạng thái của các release branch song song hoặc các branch sau bản được xác nhận là bản vá không được record xác lập riêng.

Chi tiết kỹ thuật

Trong quá trình triển khai Git stack, deployStack() gắn plaintext value của mọi secret đã được resolve vào đối tượng kết quả dưới trường resolvedSecrets. Kết quả này được truyền qua deployGitStack, sau đó ba Git-stack route trả về hoặc stream toàn bộ đối tượng mà không lọc trường nhạy cảm: Git-stack webhook trả về json(result), manual Git deploy gửi result qua SSE, còn create-and-deploy đưa kết quả vào deployResult. Yêu cầu tấn công phải đến từ người nắm webhook secret của stack hoặc người dùng có quyền stacks:start; ngoài ra stack phải có ít nhất một stored secret hoặc external-provider secret được resolve. Khi các điều kiện này tồn tại, response mạng có thể chứa mọi secret đã resolve của stack, kể cả những giá trị mà người dùng không có quyền secrets lẽ ra không được xem. Nguồn công khai mô tả cơ chế và hướng sửa, nhưng không xác nhận chi tiết triển khai của bản vá bên trong mã nguồn.

Khả năng khai thác

Lỗ hổng có thể bị khai thác qua mạng thông qua Git-stack webhook, manual deploy và create-and-deploy endpoint. Webhook yêu cầu webhook secret của stack; hai luồng deploy còn lại yêu cầu quyền stacks:start, vì vậy đây không phải là truy cập ẩn danh hoàn toàn. Khi đã có credential hoặc quyền cần thiết, không cần thêm user interaction và điều kiện khai thác không phức tạp. Bản ghi cho biết có public exploit material và advisory cung cấp hành vi tái hiện, nhưng không nêu chiến dịch, nạn nhân hoặc vụ lạm dụng cụ thể.

Tác động kỹ thuật

Lỗi làm mất tính bí mật của toàn bộ secret đã resolve trong Git stack mục tiêu, thay vì chỉ tiết lộ metadata triển khai. Người có webhook secret hoặc quyền stacks:start có thể nhận các giá trị stored secret và external-provider secret mà họ không nhất thiết được phép đọc. Việc forge hoặc CI lưu response có thể tạo thêm bản sao của credential và mở rộng phạm vi phơi nhiễm sang repository administrator hoặc người có quyền đọc log. Evidence không cho thấy lỗ hổng này trực tiếp cho phép thay đổi dữ liệu hay ảnh hưởng availability, nhưng credential bị lộ có thể gây hậu quả ngoài Dockhand tùy quyền của từng secret.

Tác động đến tổ chức

  • Plaintext credential từ stored secret và external provider có thể bị tiết lộ; tùy phạm vi của từng credential, kẻ nhận được chúng có thể truy cập các hệ thống hoặc dịch vụ mà credential bảo vệ.
  • Git forge có thể lưu webhook response body trong delivery history, còn script CI có thể ghi response vào CI log, làm mở rộng phạm vi người có thể đọc secret.
  • Người dùng chỉ có quyền stacks:start có thể nhìn thấy secret dù không có quyền secrets mà Dockhand thường yêu cầu trước khi bind provider vào stack.
  • Bản ghi mô tả đây là lỗi rò rỉ confidentiality; không mô tả việc lỗ hổng trực tiếp cho phép sửa dữ liệu hoặc làm gián đoạn dịch vụ.

Cách khắc phục

  1. Nâng cấp Finsys dockhand lên bản 1.0.54, là bản được advisory xác nhận đã vá. Không nên suy diễn trạng thái của các branch song song chưa được xác minh.
  2. Rotate các stored credential và external-provider credential có thể đã xuất hiện trong webhook response, SSE response, forge delivery history, CI log hoặc terminal log. Kiểm tra và rotate các secret của stack nếu response triển khai trước đó có thể đã bị lưu trữ.
  3. Cho đến khi nâng cấp, không in hoặc ghi toàn bộ webhook response body trong script và CI. Chỉ giữ các trường an toàn như success, skipped hoặc exitCode nếu ứng dụng thực sự cần chúng.
  4. Tạm thời không trỏ forge push hook vào Dockhand webhook nếu response body của forge được lưu lại, đồng thời rà soát delivery history hiện có.
  5. Với maintainers, bảo đảm resolvedSecrets không vượt qua API boundary của webhook, manual deploy hoặc create-and-deploy. Có thể loại trường này trước khi trả hoặc stream response, đồng thời thêm regression test xác nhận cả ba response không bao giờ chứa trường đó.

Cách phát hiện

  1. Kiểm kê các instance Dockhand và xác định Git stack nào chứa stored secret hoặc secret lấy từ external provider như 1Password, Bitwarden, Vault, Infisical hoặc Doppler.
  2. Rà soát API access log và nhật ký reverse proxy cho các request tới api/git/stacks/{id}/webhook, api/git/stacks/{id}/deploy và api/git/stacks có thao tác triển khai.
  3. Kiểm tra lịch sử delivery của GitHub, GitLab, Gitea hoặc Forgejo và các CI log có thể đã ghi lại webhook response body. Tìm trường resolvedSecrets hoặc các plaintext credential trong nội dung lưu trữ.
  4. Với manual deploy và create-and-deploy, kiểm tra network trace hoặc SSE capture của trình duyệt và client để tìm event result hoặc deployResult chứa resolvedSecrets.
  5. Nếu phát hiện response đã chứa secret, coi các giá trị liên quan là có khả năng bị lộ và rotate chúng. Việc không tìm thấy log hoặc response lưu trữ không chứng minh rằng instance an toàn.
Nguồn (19)
Tìm hiểu thêm

Kiểm tra chuyên sâu cùng giải pháp quản lý rủi ro Web toàn diện

Giải pháp CyStack VulnScan liên tục phát hiện tài sản, xác minh lỗ hổng và giúp đội ngũ bảo mật ưu tiên khắc phục cho toàn bộ doanh nghiệp.