- Trên GitHub, có thể truy cập dữ liệu từ các fork đã bị xóa, các kho lưu trữ đã bị xóa, thậm chí cả các kho lưu trữ riêng tư
- GitHub biết về điều này và đây là cách được thiết kế có chủ đích
- Vì đây là một vector tấn công rất lớn đối với mọi tổ chức sử dụng GitHub, bài viết đưa ra một thuật ngữ mới là "Cross Fork Object Reference (CFOR)"
- Lỗ hổng CFOR xảy ra khi một fork của kho lưu trữ có thể truy cập dữ liệu quan trọng từ một fork khác, bao gồm cả dữ liệu từ các fork riêng tư và đã bị xóa
Truy cập dữ liệu fork đã xóa
- Hãy xét một quy trình làm việc phổ biến trên GitHub: fork một kho lưu trữ công khai, commit mã vào fork đó, rồi xóa fork
- Mã đã commit vào fork vẫn có thể truy cập được và sẽ có thể truy cập vĩnh viễn
- Bạn có thể nghĩ rằng chỉ cần biết hash commit mới truy cập được thì sẽ an toàn, nhưng hash này có thể bị tìm ra
- Việc tìm dữ liệu từ các fork đã xóa xảy ra khá thường xuyên
Truy cập dữ liệu kho lưu trữ đã xóa
- Hãy xét một kịch bản trong đó có một kho lưu trữ công khai trên GitHub, người dùng fork kho đó, commit dữ liệu sau khi fork, rồi xóa toàn bộ kho lưu trữ,
- Mã được commit sau khi fork vẫn có thể truy cập được
- GitHub lưu kho lưu trữ và các fork trong một mạng kho lưu trữ, trong đó kho "upstream" ban đầu đóng vai trò nút gốc
- Khi kho công khai "upstream" đã được fork bị "xóa", GitHub sẽ gán lại vai trò nút gốc cho một trong các fork downstream
- Tuy nhiên, mọi commit của kho "upstream" vẫn tồn tại và có thể truy cập thông qua mọi fork
Truy cập dữ liệu kho lưu trữ riêng tư
- Hãy xét một quy trình làm việc phổ biến khi open source một công cụ mới trên GitHub,
- Có trường hợp tạo một kho lưu trữ riêng tư sẽ được công khai sau này, tạo một phiên bản nội bộ riêng tư của kho đó (thông qua fork), commit thêm mã cho các tính năng sẽ không được công khai, rồi công khai kho "upstream" trong khi vẫn giữ fork ở trạng thái riêng tư
- Việc các tính năng riêng tư và mã liên quan (ở bước 2) có bị nhìn thấy công khai hay không phụ thuộc vào việc có thể truy cập chúng từ kho công khai hay không
- Mọi thứ được commit vào fork riêng tư sau khi kho "upstream" đã được công khai thì sẽ không nhìn thấy được
Thực tế truy cập dữ liệu như thế nào?
- Bằng cách truy cập trực tiếp vào commit
- Trong mạng kho lưu trữ của GitHub, các thao tác mang tính phá hủy (như 3 kịch bản nêu trên) sẽ xóa tham chiếu đến dữ liệu commit khỏi UI GitHub tiêu chuẩn và các thao tác git thông thường
- Tuy nhiên, dữ liệu này vẫn tồn tại và có thể truy cập được nếu biết hash commit
- Hash commit là giá trị SHA-1, và nếu người dùng biết hash commit SHA-1 của commit cụ thể mà họ muốn xem, họ có thể truy cập trực tiếp commit đó qua endpoint https://github.com/<user/org>/…;
- Hash commit có thể bị brute-force thông qua UI của GitHub
- Cũng có thể truy vấn hash commit thông qua endpoint public events API của GitHub
Chính sách của GitHub
- Gần đây, tác giả đã gửi các phát hiện này thông qua chương trình VDP của GitHub, và GitHub đã làm rõ rằng kho lưu trữ được thiết kế để hoạt động theo cách này
- Sau khi xem lại tài liệu, có thể thấy GitHub đã ghi chép khá rõ người dùng nên kỳ vọng điều gì trong các trường hợp được mô tả ở trên
Tác động
- Chỉ cần còn tồn tại dù chỉ một fork, mọi commit trong mạng kho lưu trữ đó (commit của kho "upstream" hoặc của các fork "downstream") sẽ tồn tại vĩnh viễn
- Kiến trúc kho lưu trữ của GitHub đòi hỏi khiếm khuyết thiết kế này, và phần lớn người dùng GitHub không hiểu mạng kho lưu trữ thực sự vận hành như thế nào nên sẽ kém an toàn hơn
- Khi secret scanning tiếp tục phát triển để có thể quét mọi commit trong mạng kho lưu trữ, người dùng có thể nhận cảnh báo về các secret không phải của mình
- Ba kịch bản này tuy gây sốc nhưng vẫn chưa bao quát hết mọi cách GitHub có thể lưu giữ dữ liệu đã bị xóa khỏi kho lưu trữ
Ý kiến của GN⁺
- Bài viết này nêu ra một vấn đề bảo mật quan trọng đối với các tổ chức sử dụng GitHub. Việc dữ liệu từ các kho lưu trữ đã bị xóa hoặc đặt ở chế độ riêng tư vẫn có thể truy cập được là điều gây sốc. Đây có vẻ là một lỗi thiết kế nền tảng do kiến trúc mạng kho lưu trữ của GitHub gây ra
- Các nhà phát triển cần nhận thức được vấn đề này và thận trọng khi commit dữ liệu quan trọng hoặc secret lên GitHub. Một khi đã push lên kho công khai, dữ liệu đó có thể truy cập được vĩnh viễn. Nếu secret quan trọng đã bị lộ, chỉ có xoay vòng khóa mới có thể giải quyết triệt để
- GitHub có công khai minh bạch và tài liệu hóa vấn đề này, nhưng phần lớn người dùng có thể sẽ không hiểu đầy đủ cách mạng kho lưu trữ vận hành. GitHub cần nỗ lực hơn để nâng cao nhận thức và đào tạo người dùng về vấn đề này
- Các vấn đề tương tự cũng có thể tồn tại trong những hệ thống quản lý phiên bản khác. Các nhà phát triển và tổ chức cần hiểu rõ kiến trúc cũng như giới hạn của công cụ mình đang dùng khi quản lý dữ liệu quan trọng
- Để ngăn rò rỉ dữ liệu quan trọng, cần có các biện pháp bảo mật đa lớp như kiểm soát truy cập nghiêm ngặt, áp dụng nguyên tắc đặc quyền tối thiểu, quét secret định kỳ và giám sát liên tục. Trên hết, nhận thức bảo mật cao của nhà phát triển là yếu tố then chốt
1 bình luận
Ý kiến Hacker News