2 điểm bởi GN⁺ 2024-05-26 | 1 bình luận | Chia sẻ qua WhatsApp

Vấn đề

  • Tối qua, khi đang khám phá nội dung của cơ sở dữ liệu checksum của Go, tôi phát hiện ra một kết quả thú vị.
  • Kết quả khi chạy lệnh sqlite> select path, count(path) from modules group by path order by count(path) desc;:
    • github.com/homebrew/homebrew-core|39438
    • github.com/Homebrew/homebrew-core|30896
    • github.com/concourse/concourse|25372
    • github.com/openshift/release|24065
    • github.com/cilium/cilium|22138
  • Homebrew vốn được biết là dùng Ruby, nên mối liên hệ với Go khiến tôi thấy khó hiểu.
  • Thống kê ngôn ngữ của GitHub cũng xác nhận điều đó.
  • Tôi đã clone kho lưu trữ để tìm các tệp liên quan đến Go (go.mod hoặc tệp mã nguồn Go), nhưng không tìm thấy gì.

Nghiên cứu

  • Một ngày mới bắt đầu và sự tò mò đòi hỏi phải có câu trả lời.
  • Nếu kho Git không liên quan đến mã Go, tôi tự hỏi tại sao nó lại xuất hiện trong cơ sở dữ liệu checksum của Go.
  • Tôi biết rằng proxy.golang.org là proxy mô-đun mặc định và sum.golang.org là cơ sở dữ liệu checksum.
  • Đọc tài liệu của Go, tôi biết được rằng nếu phiên bản mô-đun chưa được ghi vào log, cơ sở dữ liệu checksum sẽ cố lấy mô-đun từ máy chủ gốc.
  • Để xác nhận xem kho mô-đun Go mới có được thêm vào cơ sở dữ liệu checksum và proxy hay không, tôi đã gọi endpoint lookup.
  • Sau khi tạo một mô-đun Go mới và tải nó lên tài khoản GitHub, tôi thử lệnh lookup theo hai cách nhưng cả hai đều báo lỗi.
  • Tôi tạo đúng pseudo-version và truy vấn lại cơ sở dữ liệu checksum để xác nhận rằng mô-đun đã được tải xuống.
  • Tôi truy vấn proxy và tải về zip của mô-đun để chứng minh rằng có thể lưu dữ liệu tùy ý trên hạ tầng Go.

Khả năng bị lạm dụng

  • Có thể bị dùng để vượt qua các giới hạn tải xuống trên máy của lập trình viên và máy chủ CI/CD.
  • Phần mềm độc hại có thể lưu payload và lấy nó từ proxy khi cần.
  • Có thể thực hiện tấn công từ chối dịch vụ (DoS) vào proxy.golang.org.
  • Có thể dễ dàng triển khai hệ thống chỉ huy và điều khiển (C2).

Kết luận

  • Tôi đã hiểu được quy trình của cơ sở dữ liệu checksum hoạt động như thế nào.
  • Hiện tại đây chưa phải là vấn đề nghiêm trọng đối với hạ tầng Go, nhưng có khả năng bị lạm dụng.
  • Vẫn còn những câu hỏi tiếp theo về lý do các dự án không phải Go lại có mặt trong cơ sở dữ liệu.
  • Nghiên cứu này đã mang lại cho tôi nhiều ý tưởng và tôi dự định sẽ tiếp tục khám phá.

Ý kiến của GN⁺

  1. Lỗ hổng bảo mật: Bài viết này chỉ ra một lỗ hổng bảo mật trong cơ sở dữ liệu checksum của Go, nơi có thể lưu trữ dữ liệu tùy ý. Điều này có thể tạo ra một con đường để mã độc được phát tán dễ dàng.
  2. Cần cải thiện: Cần cải thiện kiểm soát truy cập của cơ sở dữ liệu checksum và máy chủ proxy để tăng cường bảo mật và tính toàn vẹn của hạ tầng Go.
  3. Tích hợp với ngôn ngữ khác: Cần làm rõ vì sao các dự án không phải Go lại xuất hiện trong cơ sở dữ liệu checksum của Go, đồng thời cần thêm các bước xác thực để ngăn điều này.
  4. Đào tạo lập trình viên: Cần đào tạo để các lập trình viên nhận thức được những lỗ hổng bảo mật như vậy và hiểu các biện pháp tốt nhất để phòng tránh.
  5. Giải pháp thay thế: Có thể so sánh với cơ sở dữ liệu checksum và máy chủ proxy của các ngôn ngữ khác có chức năng tương tự để tham khảo cho việc cải thiện hạ tầng Go.

1 bình luận

 
GN⁺ 2024-05-26
Ý kiến Hacker News

Tóm tắt các bình luận trên Hacker News

  • Khả năng bị lạm dụng của các dịch vụ trực tuyến

    • Mọi dịch vụ trực tuyến rốt cuộc đều có thể bị lạm dụng cho mục đích chỉ huy và điều khiển, vi phạm bản quyền, hoặc lưu trữ CSAM. Twitter, Telegram, hạ tầng khóa PGP cũng đã có những trường hợp như vậy.
  • Vấn đề lưu trữ tệp của Google

    • Google thường xuyên xử lý vấn đề lưu trữ tệp độc hại, nên có khả năng nhóm Go đã phối hợp với GCP và Drive. Điều này không khác biệt quá lớn so với các endpoint khác mà Google vốn đã cho phép.
  • So sánh với GitHub

    • Có ý kiến cho rằng điều này không khác mấy so với việc tải tệp lên GitHub. GitHub cũng cho phép lưu trữ dữ liệu tùy ý miễn là có tài khoản.
  • Các dự án không phải Python trên PyPI

    • Trên PyPI cũng có các dự án không phải Python, và cần có khả năng phân phối wheel (binary đã biên dịch) để phòng trường hợp người dùng không thể biên dịch mã thư viện. Mã viết bằng C và Golang cũng có thể làm vậy.
  • Proxy Golang và nhật ký checksum

    • Có người từng thử ý tưởng ghi lại checksum của URL tùy ý một cách minh bạch bằng cách dùng proxy Golang và sumdb.
  • Khám phá tên miền

    • Khi khám phá một tên miền cụ thể, hầu hết những gì được dự đoán đều thực sự có trong đó.
  • Vấn đề đã biết

    • Có chia sẻ một liên kết về các vấn đề đã biết của Golang.
  • Hệ thống mô-đun của CUE

    • Hệ thống mô-đun của CUE đang được phát hành; dù thích MVS của Go, nó lại được xây dựng dựa trên hạ tầng OCI. Nếu quan tâm đến hệ thống quản lý phụ thuộc, có thể tham khảo liên kết liên quan.
  • Vấn đề bộ nhớ đệm web

    • W3C đã khiến mọi thứ trên web đều có thể được cache, nhưng có người thắc mắc vì sao gần như không có bộ nhớ đệm proxy dùng cho mục đích chung. Liệu có phải các nhà phát hành gửi phản hồi với Cache-Control: max-age ngắn một cách không cần thiết hoặc Vary: Cookie, hay là quá nhiều ISP phải trả chi phí transit?
  • Vấn đề bộ nhớ đệm proxy

    • Việc proxy cache các kho không phải Go có thể là lãng phí, nhưng nếu cho phép cache các kho Go thì lại có thể lưu trữ dữ liệu tùy ý. Có ý kiến cho rằng đây không phải vấn đề quá lớn.