Giải quyết bí ẩn về lỗ hổng gián tiếp – sửa các lỗ hổng gián tiếp mà không phá vỡ cây phụ thuộc của bạn

lỗ hổng

Sửa chữa các lỗ hổng gián tiếp là một trong những nhiệm vụ phức tạp, tẻ nhạt và khá thú vị là nhàm chán mà không ai thực sự muốn chạm vào. Có vẻ như không ai ngoại trừ Debricked. Chắc chắn, có rất nhiều cách để làm điều đó theo cách thủ công, nhưng liệu nó có thể được thực hiện tự động với rủi ro thay đổi nhỏ nhất không? Nhóm Debricked quyết định tìm hiểu.

Một khu rừng đầy những cây mỏng manh

Vì vậy, bạn thậm chí bắt đầu từ đâu?

Thứ nhất, cần phải có một cách để sửa chữa lỗ hổng bảo mật, mà đối với những trường hợp phụ thuộc gián tiếp, không được phép đi bộ trong công viên. Thứ hai, nó cần phải được thực hiện một cách an toàn, hoặc, không có bất cứ điều gì bị phá vỡ.

Bạn thấy đấy, các phụ thuộc gián tiếp được đưa vào sâu bên dưới cây phụ thuộc và rất khó để có được phiên bản chính xác mà bạn muốn. Như Trưởng bộ phận R & D của Debricked đã từng nói: “Bạn đang xoay chuyển các nút thắt bằng cách nghịch ngợm các yếu tố phụ thuộc trực tiếp của mình và cầu nguyện với Torvalds rằng các gói gián tiếp chính xác được giải quyết. Khi Torvalds có lợi cho bạn, bạn phải hy sinh một số dung lượng lưu trữ đám mây cho chú Bob để đảm bảo các bản cập nhật không làm hỏng ứng dụng của bạn. “

Nói cách khác, thực sự cần có một cách dễ dàng hơn, ít căng thẳng hơn để làm điều đó.

Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách giải quyết các lỗ hổng bắc cầu có thể được thực hiện theo cách thủ công và cuối cùng, sẽ chỉ cho bạn giải pháp Debricked, cho phép bạn thực hiện điều đó tự động. Nếu bạn thực sự chỉ quan tâm đến giải pháp, tôi khuyên bạn nên bắt đầu cuộn.

Xem tiếp:   Lỗi RCE nghiêm trọng được báo cáo trong Plugin trình tạo trang web WordPress Elementor

Giải phẫu chính xác trên cây phụ thuộc của bạn

Trong giai đoạn nghiên cứu dự án cơ sở dữ liệu đồ thị, hoặc cách Debricked ngày nay khắc phục các lỗ hổng nguồn mở của bạn với tốc độ ánh sáng, nhóm đã tình cờ gặp một số bài báo giải thích cách sửa các lỗ hổng gián tiếp trong NPM.

Như đã nêu trong bài báo, gói ‘minimist` bị ảnh hưởng bởi các lỗ hổng, cụ thể là CVE-2021-44906 và CVE-2020-7598.

Đây là cả hai lỗ hổng “Ô nhiễm nguyên mẫu”, có nghĩa là các đối số không được khử trùng đúng cách. May mắn thay, những người bảo trì của “ minimist` đã sửa các lỗ hổng này trong phiên bản 1.2.6.

Thật không may, `mocha` phiên bản 7.1.0 giải quyết` minimist` 0.0.8, nằm trong phạm vi dễ bị tấn công của các lỗ hổng này. Theo đề xuất của tác giả bài viết này, các lỗ hổng này có thể được sửa theo một số cách khác nhau.

Nhưng mà! Điều gì về những thay đổi phá vỡ?

Đề xuất đầu tiên là chỉ cần kích hoạt cập nhật cả các “phụ thuộc gián tiếp”, nghĩa là chúng tôi sẽ không thực sự thay đổi phiên bản của `mocha`. Để thực hiện cập nhật này, chỉ cần chạy `npm update`, xóa tệp` npm.lock` của bạn và chạy `npm install`. Điều này tạo lại cây phụ thuộc với phiên bản mới nhất có thể (theo các ràng buộc) của các phụ thuộc gián tiếp của bạn. Với phương pháp này, nguy cơ phá vỡ các thay đổi là rất thấp vì bạn thực sự không cập nhật bất kỳ phần phụ thuộc gốc nào của mình mà chỉ cập nhật các phần phụ thuộc gián tiếp của bạn.

Xem tiếp:   Reborn of Emotet: Các tính năng mới của Botnet và cách phát hiện nó

Các thay đổi bị hỏng xảy ra khi chức năng hoặc giao diện của gói không tương thích về phía trước, có nghĩa là bản cập nhật cho gói có thể khiến ứng dụng của bạn bị hỏng. Các thay đổi vi phạm phổ biến là loại bỏ lớp / hàm, thay đổi các đối số thành một hàm hoặc thay đổi giấy phép (hãy cẩn thận với điều đó!).

Nhưng cuộc sống không phải lúc nào cũng dễ dàng như vậy, và bản cập nhật đơn giản này của cây sẽ không giải quyết được lỗ hổng. Vấn đề là `mkdirp` đã thực sự khóa phiên bản` minimist` của họ xuống 0.0.8. Điều này có nghĩa là những người đóng góp cho `mkdirp` đã đi đến kết luận rằng họ không tương thích với các phiên bản mới hơn của` minimist` và buộc cập nhật `minimist` có thể đưa ra những thay đổi đột phá giữa` mkdirp` và `minimist`.

Hãy suy nghĩ… đồ thị!

Vì vậy, câu hỏi trị giá hàng triệu đô la là: nên sử dụng phiên bản nào của `mocha` để chuyển sang phiên bản an toàn của` `minimist` ‘mà không phá vỡ cây phụ thuộc? Đây thực sự là một vấn đề về đồ thị, đã được mô tả trong bài viết này.

Thuật toán đồ thị nào sẽ giải quyết vấn đề này? Cách NPM giải quyết các phụ thuộc có thể hơi phức tạp, vì chúng được phép “tách” cây phụ thuộc. Điều này có nghĩa là chúng có thể có nhiều phiên bản của một phụ thuộc để đảm bảo rằng chúng ta luôn có một cây tương thích. Để giải quyết lỗ hổng bảo mật, chúng ta cần đảm bảo rằng tất cả các phiên bản của `minimist` đều an toàn bằng cách cập nhật tất cả các gốc có thể nhỏ giọt xuống` minimist`.

Thuật toán được sử dụng để giải quyết vấn đề này được gọi là “Tất cả các đường dẫn tối đa an toàn”. Bằng cách đi xuống biểu đồ phụ thuộc và giữ các phiên bản tối đa, tất cả trong khi lược bỏ tất cả các phiên bản khác của gói đó trong mỗi giao điểm, chúng ta có thể tạo một biểu diễn gần đúng cho cây phụ thuộc của mình. Nếu giá trị gần đúng là an toàn, điều đó có nghĩa là cây thật của chúng ta cũng sẽ an toàn!

Xem tiếp:   Over a Dozen Flaws được tìm thấy trong Hệ thống quản lý mạng công nghiệp của Siemens

Bằng cách thực hiện thuật toán này cho tất cả các phiên bản tiềm năng của `mocha`, chúng tôi tìm thấy bản nâng cấp nhỏ nhất để khắc phục lỗ hổng này. Để có được tốc độ mà chúng tôi mong muốn cho thuật toán này, nhóm đã phải xây dựng một quy trình Neo4j tùy chỉnh, có thể xử lý tìm kiếm trên 100 phiên bản gốc với độ sâu tìm kiếm là 30+ trong ~ 150 mili giây. Nhanh quá, hả?

Trong trường hợp này, chúng ta không cần phải tìm kiếm đâu xa… vì 7.1.1 của `mocha` là an toàn! Đây chỉ là bản cập nhật vá lỗi, điều này cho thấy nguy cơ phá vỡ các thay đổi là rất thấp. Đối với các trường hợp ít phức tạp hơn (như ví dụ này), ‘npm Audit’ có thể giúp bạn với lệnh ‘npm Audit fix’ tuyệt vời của họ.

Đừng tỏ ra đặc biệt, hãy bước vào cách làm việc của con người trong quán rượu!

Bây giờ, nếu bạn đã đạt được điều này (xin chúc mừng, rất ấn tượng) và nghĩ rằng, “điều này nghe có vẻ phức tạp và giống như một công việc khủng khiếp”, đừng lo lắng – bạn không phải là người duy nhất. May mắn thay, tất cả điều này xảy ra hoàn toàn tự động trong công cụ Debricked khi nhấp vào nút nhỏ này:

Ngay bây giờ, điều này có sẵn cho . Sắp tới, hỗ trợ sẽ được mở rộng sang Java, Golang, C #, Python và PHP.

Nếu bạn chưa phải là người dùng Debricked, bạn còn chần chừ gì nữa? Nó miễn phí cho các nhà phát triển đơn lẻ, các nhóm nhỏ hơn và các dự án nguồn mở (và nếu bạn là một tổ chức lớn hơn, đừng lo. Có một bản dùng thử miễn phí rộng rãi). Đăng kí miễn phí tại đây.

.

Related Posts

Check Also

Nhà phát triển tiền mặt Tornado bị bắt sau lệnh trừng phạt của Hoa Kỳ Máy trộn tiền điện tử

Các nhà chức trách Hà Lan hôm thứ Sáu đã thông báo về việc bắt …