Trong bài viết trước của chúng tôi về... CI/CD Pipelines, chúng tôi đã thấy cách hack một CI/CD kịch bản đó có lẽ đã được bảo vệ.
Hãy nhớ lại luận điểm của chúng ta trong bài viết trước: chúng tôi bắt đầu với một số pipeline dễ bị tổn thương Ngộ độc gián tiếp Pipeline Thực hiện (I-PPE) và để khắc phục điều đó, chúng tôi quyết định chia nhỏ pipeline chia làm hai:
- Ngày 1 pipeline (Xây dựng CI), an toàn cho D-PPE và I-PPE, sẽ kiểm tra mã PR, thực hiện bản dựng và tạo ra một artifact.
- 2nd pipeline (Kiểm thử CI), cũng an toàn cho D-PPE và I-PPE khi kiểm tra mã nguồn cơ bản (để tránh sửa đổi tập lệnh shell) và thực thi các tập lệnh gốc đối với hiện vật.
- Để đồng bộ hóa Kiểm thử CI pipeline chạy SAU khi Build CI pipeline, chúng tôi đã sử dụng workflow_run Kích hoạt.
Chúng tôi đặt tên cho tình huống này là Tình huống số 3.
Mặc dù, như chúng tôi đã đề cập trong bài viết đó, có những giải pháp khác, nhưng chúng tôi quyết định triển khai "giải pháp" này vì lý do sư phạm, để chúng ta có thể đi sâu vào các lỗ hổng bảo mật. CI/CD pipelines.
Sau đó, chúng ta đã thấy cách để vượt qua tình huống này bằng cách... đầu độc cổ vật. Đây là những gì chúng ta gọi là Nhiễm độc cổ vật, tức là khả năng sửa đổi (hack) pipeline logic bằng cách sửa đổi một pipeline hiện vật.
Cách tiếp cận này có vấn đề gì? Chúng ta thấy rằng vấn đề phát sinh khi bất kỳ người dùng nào “tạo” một mục mới. pipeline.
Nếu người dùng mở một yêu cầu kéo (PR) có chứa nội dung mới... pipelineGitHub sẽ thực thi điều đó. pipeline (với một số điều kiện nhất định, như chúng ta đã thấy) trong bài).
Sau đó, người dùng có thể tạo một cái mới. pipeline Với cùng tên gọi như Build CI!! Vâng, điều này khá bất ngờ, nhưng GitHub cho phép bạn tạo hai cái. pipelinecó cùng tên!!
Khi người dùng mở một yêu cầu kéo (PR) với những thay đổi này, cái mới" pipeline sẽ được thực thi (tải lên một hiện vật bị nhiễm độc) và triển khai CI pipeline Sau đó, tập lệnh shell "đã sửa đổi" sẽ được thực thi, dẫn đến việc tập lệnh shell "gốc" ghi đè lên tập lệnh shell "ban đầu" nằm trong thư mục đó. pipeline không gian làm việc. Vì vậy, "giải pháp" này không tránh khỏi lỗ hổng I-PPE (như chúng ta có thể thấy bên dưới).
Những vấn đề đó là gì? Ít nhất thì cũng có một vài vấn đề:
- Đầu tiên, Làm thế nào để chắc chắn rằng quá trình xây dựng không bị can thiệp? Trong trường hợp này, người dùng độc hại đã có thể sửa đổi quy trình xây dựng dự định bằng cách sử dụng chúng. pipeline để tạo ra một vật phẩm tẩm độc.
- Thứ hai, Làm thế nào chúng ta có thể đánh giá nguồn gốc xuất xứ của một hiện vật?
Những câu hỏi này đẩy chúng ta vào vòng tay của... Chứng thực phần mềm lãnh địa!!
Chứng thực phần mềm
An chứng thực là một phần của dữ liệu đại diện bằng chứng về một sự kiệnTrong thực tế, chúng ta thường gọi những thứ này là... chứng chỉ.
Ví dụ, khi phòng thí nghiệm xét nghiệm máu của bạn, dữ liệu về xét nghiệm sẽ được ghi lại và chứng nhận. Kết quả xét nghiệm máu là... có thể kiểm chứng và truy nguyên.
Gần hơn với lĩnh vực CNTT của chúng ta, bạn có thể đoán được quá trình này sẽ được dịch như thế nào sang, ví dụ, một quá trình biên dịch.
Thông tin về môi trường và công cụ máy chủ biên dịch, các tài liệu (mã nguồn) và các sản phẩm/tác phẩm (mã nhị phân) sẽ là một phần của quá trình chứng thực đó.
Rõ ràng, chứng thực phải được lập bởi người chứng thực có thẩm quyền (đã được xác thực và không thể phủ nhận) để đảm bảo tính đáng tin cậy.
Có lẽ một số bạn đang nghĩ... vậy thì... sự khác biệt giữa chữ ký và chứng thực?
Chữ ký và chứng thực mã
Ở cấp độ cao, một chữ ký Nó được tạo ra bằng cách sử dụng một cặp khóa và một hiện vật. Cặp khóa bao gồm một khóa công khai và một khóa riêng tư.
Người dùng ký vào một hiện vật bằng khóa riêng, và những người khác sau đó có thể xác minh chữ ký bằng khóa công khai. Khóa riêng phải được giữ bí mật, nhưng khóa công khai được phân phối rộng rãi.
Chữ ký có thể được sử dụng để chứng minh rằng người nắm giữ khóa riêng đã sử dụng khóa riêng đó để ký vào hiện vật..
Chữ ký đừng chứng minh
- Người dùng ý định để ký tên lên hiện vật (có thể họ đã bị lừa), hoặc
- Ý định của người dùng là thực hiện bất kỳ tuyên bố cụ thể về hiện vật
Với Chứng thựcThay vì ký trực tiếp vào hiện vật, người dùng tạo ra một loại nào đó... tài liệu việc này nắm bắt được ý định của họ đằng sau việc ký tên lên hiện vật và bất kỳ yêu cầu cụ thể được tạo ra như một phần của chữ ký này.
Khung chứng thực In-toto
Khung cấu trúc phổ biến nhất là Khung chứng thực in-toto
- định nghĩa một standard mẫu chứng thực Điều đó liên kết các đối tượng, tức là các hiện vật được mô tả, với siêu dữ liệu đã được xác thực về hiện vật đó.
- cung cấp một tập hợp các vị ngữ được định nghĩa trước để truyền tải siêu dữ liệu đã được xác thực xuyên suốt và giữa các chuỗi cung ứng phần mềm.
Chúng ta hãy cùng đi sâu hơn vào định dạng chứng thực.
An Chứng thực là một tài liệu được ký điện tử nó bao gồm Các câu lệnh.
Tuyên bố là lớp trung gian của chứng thực, ràng buộc nó với một đối tượng cụ thể. Tiêu Đề và xác định rõ ràng các loại của Thuộc tính:
- Tiêu Đề: The tham chiếu được bảo mật bằng mật mã đến hiện vật (thường thông qua hàm băm), và
- Dự đoán: một tập hợp các đặc điểm cụ thể tuyên bố Những thông tin về hiện vật đó được gọi là Tuyên bố. Những tuyên bố này có thể được sử dụng để diễn đạt (và sau này chứng minh) bất cứ điều gì bạn nghĩ đến! Chúng có thể đại diện cho sự phê duyệt thủ công, nguồn gốc hiện vật, kết quả kiểm thử tự động, nhật ký kiểm toán, hoặc nhiều hơn nữa!
Khi Tuyên bố này được ký bằng mật mã, nó được gọi là một Tuyên bố. Chứng thực
Theo cách này, ví dụ, Alice tạo một Bản Tuyên bố về một hiện vật và ký vào đó bằng khóa riêng của mình, tạo ra một Giấy chứng nhận.
- Bob sau đó có thể xác minh chữ ký trong bản xác nhận đó, cho phép anh ta tin vào những lời khẳng định phía trong.
Bob sau đó có thể sử dụng những tuyên bố đó. quyết định Liệu có cho phép sử dụng hiện vật này hay không.
Liệu việc chứng thực có thể giúp giải quyết vấn nạn nhiễm độc cổ vật?
Sau phần giới thiệu về Chứng thực, chúng ta hãy quay lại với vấn đề chính. Các chứng thực có thể giúp chúng ta giải quyết vấn đề như thế nào, tức là tránh làm nhiễm độc hiện vật?
Người dùng độc hại đã có thể tạo ra một hiện vật bằng cách vượt qua cơ chế "chính thức", tức là bằng cách sử dụng... pipeline để tạo ra hiện vật.
Sẽ thật tuyệt vời nếu chúng ta có thể chứng minh rằng các hiện vật đang được tải xuống đã được tạo ra bằng phần mềm chính thức. pipelineĐây chỉ là một ví dụ về những gì chúng ta có thể gọi là "điểm can thiệp", nhưng có thể còn nhiều điểm khác nữa.
Như bạn có thể thấy trong hình ảnh trên, có nhiều điểm để can thiệp. Bằng cách này, người tiêu dùng pipeline (Kiểm tra CI trong ví dụ của chúng tôi) phải đánh giá tính toàn vẹn của quá trình xây dựng cũng như các tính toàn vẹn của chính hiện vật.
Trong ví dụ của chúng ta, vật phẩm bị nhiễm độc được tạo ra bằng cách đưa vào một chất mới (bị nhiễm độc). pipeline Điều đó can thiệp vào quá trình xây dựng. Nhưng người dùng độc hại có thể đã thực hiện được những việc sau:
- Chỉnh sửa mã sau khi đã được kiểm xuất từ... SCM để tạo ra một tệp nhị phân độc hại
- Thay thế tệp nhị phân chính xác được tạo ra bởi quá trình biên dịch bằng bất kỳ tệp nhị phân độc hại nào khác.
- xâm nhập vào Kho lưu trữ hiện vật và tải lên một hiện vật bị nhiễm độc được tạo ra bằng bất kỳ cách nào khác.
- và vv
Như bạn thấy, có thể có nhiều điểm "can thiệp" khác nhau.
Điều quan trọng ở đây là gì? Rõ ràng là để bảo vệ tất cả những điểm "chống can thiệp". Nhưng cuối cùng, điều quan trọng nhất là... Điều đó có nghĩa là “người tiêu dùng” của hiện vật có thể đánh giá tính toàn vẹn của hiện vật và quyết định có tiếp tục sử dụng nó hay không.
Chúng ta có thể đánh giá tính toàn vẹn của một hiện vật trong hai cách.
Một cách là bằng cách đánh giá nguồn gốc của hiện vật.
Bằng cách tạo ra một Giấy chứng nhận nguồn gốcChúng tôi cung cấp siêu dữ liệu hữu ích (được xác thực đúng cách và không thể phủ nhận) về hiện vật. Trong các ví dụ sau, chúng ta sẽ sử dụng Xygeni SALT (Lớp xác thực phần mềm cho sự tin cậy), thành phần dùng để tạo, đăng ký và xác minh các chứng thực phần mềm.
Trong đoạn mã trên, bạn có thể thấy có một bước xây dựng tệp war và bước thứ hai tạo ra tệp đó. Giấy chứng nhận nguồn gốcĐể làm được điều đó, pipeline Sử dụng khóa riêng và cũng bao gồm khóa công khai trong chứng thực.
Đằng sau hậu trường, Xygeni's muối lệnh lưu trữ chứng thực trong một sổ cái (còn gọi là sổ đăng ký chứng thực, kỷ lục (Trong trường hợp của chúng tôi, nhưng bạn có thể sử dụng bất kỳ trường hợp nào khác). Đã xong việc đó, người tiêu dùng pipeline có thể bao gồm Xygeni's Công cụ xác minh Để xác minh nguồn gốc xuất xứ của hiện vật và đánh giá tính toàn vẹn của hiện vật.
Quá trình xác minh đánh giá:
- Mã băm sha256sum của hiện vật là hợp lệ (tức là có một bản xác nhận về “đối tượng” đó), và
- Giấy chứng nhận đã được xác thực đúng cách. (Nó được tạo ra bằng cách sử dụng khóa riêng phù hợp)
Quá trình xác minh này có thể đánh giá xem cả hiện vật và giấy chứng nhận đều có giá trị hay không.
Nhưng, như các bạn còn nhớ, trong trường hợp của chúng ta, hiện vật đó được tạo ra bởi một "kẻ ác". pipeline (tức là không phải bản gốc mà là bản đã được chỉnh sửa) pipeline). Sau đó, chúng ta phải tiếp tục kiểm tra một khía cạnh khác: đó là Vật phẩm này được tạo ra bởi "bản gốc". pipelineKhông phải bất kỳ cái nào khác.
Để làm điều đó, chỉ cần thêm một dòng đơn giản để kiểm tra điều kiện đó, ví dụ:
Bước kiểm tra bổ sung này sẽ thất bại nếu hiện vật không được tạo ra bởi "hệ thống an toàn" của chúng tôi. pipeline.
Nếu hiện vật được tạo ra bởi nguồn gốc ban đầu của chúng ta pipeline (cicd_top10_3_salt/.github/workflows/build.yml), lệnh grep sẽ thành công, ngược lại, nó sẽ thất bại, gây lỗi. pipeline và hủy bỏ mọi bước tiếp theo.
Người “xây dựng” pipeline Đây chỉ là một điểm kiểm tra khả năng bị làm giả, nhưng như đã đề cập trước đó, còn có một số điểm kiểm tra khả năng bị làm giả khác mà chúng ta nên kiểm tra.
Ví dụ, Điều gì sẽ xảy ra nếu mã nguồn bị chỉnh sửa sau khi sao chép kho lưu trữ và trước khi thực hiện lệnh biên dịch? Trong trường hợp này, mã cần biên dịch không giống với mã được lưu trữ trong... SCM.
Việc kiểm tra điểm giả mạo này rất dễ dàng, chỉ cần kiểm tra mã băm của vật liệu ở mỗi bước.
Kết luận
Tóm lại, một Chứng thực phần mềm Đây là một khẳng định được đưa ra về một phần mềm, tức là một tuyên bố được xác thực (siêu dữ liệu) về một thành phần phần mềm hoặc một tập hợp các thành phần phần mềm.
Chứng thực phần mềm là sự khái quát hóa của việc ký mã/sản phẩm thô. Chứng thực là một tài liệu đã ký (theo một định dạng nhất định, thường dựa trên JSON) liên kết siêu dữ liệu với một sản phẩm. Chúng đại diện cho bằng chứng liên kết đầu vào (vật liệu) và đầu ra (sản phẩm được tạo ra) ở mỗi bước xây dựng.
Giấy chứng nhận cung cấp hồ sơ có thể kiểm chứng về các bước đã thực hiện để xây dựng các sản phẩm phần mềm cuối cùng, bao gồm các tài liệu đầu vào cho mỗi bước và các lệnh xây dựng đã chạy.
Tóm lại, Chứng thực Phần mềm là một cơ chế tuyệt vời để kiểm tra nhiều khía cạnh về tính toàn vẹn khác nhau của quy trình xây dựng phần mềm của chúng ta.
Đã xem hết loạt phim rồi? Đừng lo! Cứ thoải mái quay lại phần 'Ngộ độc Pipeline Thi hành (PPE)hoặc bất kỳ bài đăng nào khác thu hút sự quan tâm của bạn!
Hãy đón chờ, chúng ta sẽ đi sâu vào vấn đề chứng thực phần mềm và build security trong các bài đăng blog tiếp theo.




