Rủi ro bảo mật ẩn của Go: Cách Unicode Variation Selectors có thể vượt qua hệ thống phát hiện tệp kiểm thử

BigGo Editorial Team
Rủi ro bảo mật ẩn của Go: Cách Unicode Variation Selectors có thể vượt qua hệ thống phát hiện tệp kiểm thử

Cộng đồng ngôn ngữ lập trình Go hiện đang thảo luận về một mối lo ngại bảo mật tinh vi nhưng đáng kể liên quan đến Unicode variation selectors trong quy ước đặt tên tệp, đặc biệt là cách chúng có thể bị lợi dụng để vượt qua hệ thống phát hiện tệp kiểm thử của Go.

Lỗ hổng Bảo mật

Một cuộc thảo luận quan trọng đã nổi lên xung quanh cách trình biên dịch Go xử lý các tệp có ký tự Unicode đặc biệt, đặc biệt là trong các tệp kiểm thử. Mặc dù Go thường bỏ qua các tệp kết thúc bằng _test.go trong quá trình biên dịch thông thường, nhưng có một lỗ hổng đáng lo ngại cho phép kẻ tấn công thao túng tên tệp bằng Unicode variation selectors để tạo ra các tệp có vẻ như là tệp kiểm thử nhưng thực tế lại được biên dịch vào chương trình chính.

Bảo vệ của Hệ thống Module

Theo bình luận của Russ Cox, hệ thống module của Go cung cấp một số biện pháp bảo vệ chống lại lỗ hổng này. Mặc dù các gói cục bộ có thể được tạo và xây dựng với Unicode variation selectors (như U+FE0E) trong tên tệp, hệ thống module ngăn chặn việc tạo hoặc tải xuống các module chứa các ký tự như vậy. Điều này có nghĩa là vector tấn công chỉ giới hạn ở các kho lưu trữ cấp cao nhất và không thể ảnh hưởng đến các dependencies.

Lỗ hổng Trạng thái Toàn cục

Cuộc thảo luận cũng đã làm nổi bật một mối lo ngại bảo mật rộng lớn hơn trong kiến trúc của Go. Theo phản hồi từ cộng đồng, các gói có trạng thái toàn cục vừa quan trọng về mặt bảo mật vừa có thể thay đổi được trên toàn cầu tạo ra một lỗ hổng đáng kể. Một ví dụ điển hình là (crypto/rand).Reader trong thư viện chuẩn, có thể bị ghi đè bằng bất kỳ giá trị io.Reader nào. Mặc dù vấn đề này đã được thảo luận trên GitHub, nhưng các người duy trì ngôn ngữ đã chọn không triển khai các bản sửa lỗi trực tiếp, với lý do rằng những thay đổi như vậy có thể chỉ tạo ra ảo tưởng về bảo mật.

Tác động và Giảm thiểu

Các tác động bảo mật của lỗ hổng này đặc biệt đáng lo ngại vì:

  1. Hầu hết các công cụ phát triển (bao gồm Vim, VSCode và các nền tảng lưu trữ mã chính) không hiển thị rõ ràng sự hiện diện của các ký tự đặc biệt này
  2. Việc review code có thể bỏ sót những thao túng tinh vi này
  3. Mã độc có thể xuất hiện như mã kiểm thử hợp lệ trong khi được biên dịch vào chương trình chính

Mặc dù hệ thống module của Go cung cấp một số biện pháp bảo vệ, các tổ chức nên xem xét triển khai thêm các quy trình review code và công cụ có thể phát hiện Unicode variation selectors trong tên tệp, đặc biệt là đối với mã nguồn ở kho lưu trữ cấp cao nhất.

Tình trạng Hiện tại

Mặc dù đã được báo cáo cho các nền tảng lưu trữ mã chính như GitHub, GitLab và BitBucket, không có nền tảng nào phân loại đây là vấn đề bảo mật. Đội ngũ bảo mật Go (security@golang.org) cũng chưa phản hồi về các báo cáo về lỗ hổng này, cho thấy rằng cộng đồng có thể cần thực hiện các bước bổ sung để giải quyết mối lo ngại bảo mật này.