Logo Zephyrnet

OpenSSL đưa ra một bản sửa lỗi cho bản sửa lỗi trước đó

Ngày:

Nếu bạn là người dùng OpenSSL, có thể bạn đã biết về phiên bản mới nhất sửa lỗi cao cấp phát hành, ra mắt vào tháng 2022 năm XNUMX.

Bản sửa lỗi đó đã mang lại cho chúng tôi OpenSSS 3.0.21.1.1n, bản cập nhật cho hai phiên bản hiện được hỗ trợ đầy đủ của sản phẩm.

(Có phiên bản cũ, 1.0.2, nhưng các bản cập nhật cho phiên bản đó chỉ sẵn có cho những khách hàng trả tiền cho dịch vụ hỗ trợ cao cấp và với những thay đổi cũng như cải tiến trong sản phẩm kể từ phiên bản 1.0.2, chúng tôi khuyên bạn nên chuyển sang phiên bản mới hơn. thậm chí cả phiên bản chính thống - có lẽ đặc biệt - nếu bạn dự định tiếp tục trả tiền để được hỗ trợ.)

Bản cập nhật tháng 2022 năm XNUMX là một lời nhắc nhở quan trọng rằng mã bị chôn sâu với các lỗi bất thường có thể bị bỏ qua trong nhiều năm, đặc biệt nếu mã đó là một phần của chức năng cấp thấp, phức tạp, chuyên biệt.

Lỗi đã được sửa hồi đó liên quan đến một thuật toán có mục đích đặc biệt để tính toán cái được gọi là căn bậc hai mô-đun, việc tính toán phức tạp hơn căn bậc hai thông thường.

Thật không may, mã để thực hiện phép tính này, sử dụng thuật toán được phát hiện lần đầu tiên vào những năm 1890, được mã hóa vụng về, viết quanh co, nhận xét kém và khó theo dõi.

Tuy nhiên, do nó không nằm trong một phần rõ ràng “hướng ra bên ngoài” của OpenSSL và do việc viết lại nó sẽ là một nhiệm vụ khó khăn nên chúng tôi cho rằng nó đã được kiểm tra cẩn thận về tính chính xác của các câu trả lời khi được trình bày với những con số được định dạng đúng, nhưng chưa được kiểm tra độ bền của nó khi gặp phải những đầu vào không mong muốn.

Bởi vì, khi phải đối mặt với các chứng chỉ số đã bị gài bẫy để tạo ra các số không đúng định dạng, OpenSSL BN_mod_sqrt() hàm có thể bị lừa lặp lại mãi mãi, cố gắng tìm ra câu trả lời không tồn tại.

Khi bạn chỉ làm việc với số nguyên và không cho phép phân số thuộc bất kỳ loại nào, bạn sẽ thấy rằng nhiều số không có căn bậc hai theo mô đun, cũng giống như bạn thấy rằng nhiều số nguyên không có căn bậc hai thông thường. Do đó 7×7 = 49, vậy 49 có căn bậc hai là một số nguyên, cụ thể là 7. Nhưng không có số nguyên nào có thể nhân với chính nó để cho 50 hoặc 51, vì “bình phương hoàn hảo” tiếp theo là 8×8 = 64. Bạn có thể thử bao lâu tùy thích, nhưng bạn sẽ không bao giờ tìm được câu trả lời là số nguyên cho √51.

Không bao giờ thực sự sai, chỉ là không đầy đủ

Nói cách khác, mặc dù mã BigNumber của OpenSSL (nhiều thuật toán mã hóa dựa vào việc làm việc với các số dài hàng trăm hoặc thậm chí hàng nghìn chữ số) chưa bao giờ đưa ra một sai trả lời, đôi khi nó không nhận ra rằng không có câu trả lời nào để tìm và sẽ bị mắc kẹt trong một vòng lặp vô tận.

Vòng lặp vô hạn này có thể bị lạm dụng để kích động cái được gọi là Từ chối dịch vụ cuộc tấn công (DoS), có thể được kích hoạt nếu một trang web độc hại được gửi qua chứng chỉ kỹ thuật số bị gài bẫy.

Điều này có nghĩa là, trớ trêu thay, phần mềm cẩn thận trong việc xác thực chứng chỉ kỹ thuật số có thể bị phá sản bởi lỗi này, được đặt tên là CVE-2022-0778, trong khi các chương trình không bận tâm đến việc xác thực chứng chỉ thì không bị ảnh hưởng bởi nó.

Do lỗi này tiết lộ “những khoảnh khắc có thể dạy được” quan trọng, chúng tôi đã trình bày chi tiết về nó không chỉ trên Naked Security, nơi chúng tôi đã giải thích cách viết một kiểu mã tốt hơn, mà còn trên Sophos News, nơi SophosLabs hiển thị những chi tiết đẫm máu về cách một chứng chỉ bị bẫy có thể kích hoạt lỗ hổng và cách gỡ lỗi mã để hiểu lỗi.

Trong khi đó, có thêm hai lỗ hổng bảo mật

Bản cập nhật OpenSSL tiếp theo là 3.0.3, hoặc là 1.1.1o dành cho người dùng phiên bản trước đã vá một lỗi không được coi là lỗ hổng lớn (ít nhất, chúng tôi không đề cập đến nó trên Naked Security), chủ yếu là do lỗi không có trong chính mã thư viện mã hóa OpenSSL.

Thay vì ảnh hưởng đến tất cả phần mềm dựa vào OpenSSL với tư cách là nhà cung cấp mật mã, CVE-2022-1292 vừa ảnh hưởng đến một tập lệnh tiện ích, được viết bằng Perl, đi kèm với bộ công cụ OpenSSL.

Kịch bản này, được gọi là c_rehash (viết tắt của thử lại thư mục chứng chỉ) là một công cụ ít được biết đến, lấy một thư mục chứa các tệp chứng chỉ mật mã, chẳng hạn như các tệp được Mozilla duy trì là tổ chức phát hành chứng chỉ đáng tin cậy (CA) và tạo danh sách băm tệp có thể giúp phần mềm tìm chứng chỉ cụ thể nhanh hơn so với tìm kiếm một danh sách tên theo thứ tự bảng chữ cái.

Ví dụ: thư mục chứng chỉ CA của Mozilla trông như thế này…

$ ls -l /usr/share/ca-certificates/mozilla -rw-r--r-- 1 vịt vịt 2772 2022-06-23 05:32 ACCVRAIZ1.crt -rw-r--r-- 1 vịt vịt 1972 2022-06-23 05:32 AC_RAIZ_FNMT-RCM.crt -rw-r--r-- 1 vịt vịt 904 2022-06-23 05:32 AC_RAIZ_FNMT-RCM_SERVIDORES_SEGUROS.crt [. . .] -rw-r--r-- 1 vịt vịt 1302 2022-06-23 05:32 emSign_Root_CA_-_G1.crt -rw-r--r-- 1 vịt vịt 774 2022-06-23 05:32 vTrus_ECC_Root_CA .crt -rw-r--r-- 1 vịt vịt 1911 2022-06-23 05:32 vTrus_Root_CA.crt

…trong khi OpenSSL c_rehash tập lệnh tạo danh sách các liên kết tượng trưng cho phép định vị các chứng chỉ riêng lẻ thông qua hàm băm dựa trên tên của nhà phát hành trong chính chứng chỉ đó, thay vì thông qua tên tệp của nó:

lrwxrwxrwx 1 vịt vịt 23 2022-06-24 13:41 002c0b4f.0 -> GlobalSign_Root_R46.crt lrwxrwxrwx 1 vịt vịt 45 2022-06-24 13:41 02265526.0 -> Entrust_Root_Certification_Authority_-_G2.cr t lrwxrwxrwx 1 vịt vịt 36 2022-06 -24 13:41 03179a64.0 -> Staat_der_Nederlanden_EV_Root_CA.crt [. . .] lrwxrwxrwx 1 vịt vịt 19 2022-06-24 13:41 fe8a2cd8.0 -> SZAFIR_ROOT_CA2.crt lrwxrwxrwx 1 vịt vịt 23 2022-06-24 13:41 feffd413.0 -> GlobalSign_Root_E46.crt lrwxrwxrw x 1 vịt vịt 49 2022 -06-24 13:41 ff34af3f.0 -> TUBITAK_Kamu_SM_SSL_Kok_Sertifikasi_-_Surum_1.crt

Một số phần mềm dựa vào các “liên kết băm” này để hoạt động như một loại hệ thống cơ sở dữ liệu cơ bản nhằm lập chỉ mục và tìm kiếm các chứng chỉ cụ thể.

Hơn nữa, một số bản phân phối hệ điều hành tự động gọi c_rehash tập lệnh ở chế độ nền để luôn cập nhật các liên kết có mục đích đặc biệt này.

Siêu ký tự Shell được coi là có hại

Thật không may, tập lệnh lại dựa vào Perl system() hàm (hoặc một lệnh tương đương) để tính toán giá trị băm của tệp và system() hệ thống tự động khởi chạy một shell lệnh, chẳng hạn như Bash, để khởi chạy bất kỳ chương trình con cần thiết nào.

Và, như bạn có thể biết, các shell lệnh không phải lúc nào cũng xử lý các đối số dòng lệnh của chúng theo nghĩa đen, do đó nếu bạn đặt các ký tự đặc biệt vào các đối số đó, shell sẽ xử lý chúng theo những cách tiềm ẩn nguy hiểm.

Ví dụ, lệnh echo runthis theo nghĩa đen là in văn bản runthis, nhưng lệnh echo $(runthis) không trực tiếp in ra các ký tự $(runthis).

Thay vào đó, cái gọi là siêu lệnh $(runthis) có nghĩa thay thế lệnh, nó báo là “Chạy lệnh runthis và thay thế $(...) một phần với đầu ra của lệnh đó khi nó kết thúc”:

   # đối số được xử lý theo nghĩa đen, không tìm thấy siêu ký tự $ echo runthis runthis # cố gắng thực thi 'runthis', nhưng không có lệnh nào như vậy tồn tại $ echo $(runthis) -bash: runthis: command not Found # chạy hai lệnh, thu thập đầu ra của cả hai $ echo $(whoami; uname -s -r) vịt Linux 5.18.6

Nếu rủi ro do $(...) Nghe quen quen, đó là vì lỗ hổng metacommand đã bị khai thác trong thời gian gần đây. Lỗi “Follina” trên Windows. Để tìm hiểu thêm và xem lỗi đó đang hoạt động như thế nào, bạn có thể xem hội thảo trên web được ghi lại của chúng tôi. Chỉ cần nhấp vào hình ảnh dưới đây. [Yêu cầu đăng ký, truy cập ngay sau đó.]

Điều gì đã được sửa chữa?

Các tập lệnh chấp nhận đầu vào không đáng tin cậy từ người khác – cho dù đó là một chuỗi được nhập vào biểu mẫu web hay tên tệp được tạo từ bên ngoài – cần phải hết sức cẩn thận để không cho phép các siêu lệnh đặc biệt này rò rỉ dưới dạng đối số shell khi dựa vào lệnh shell để chạy các tiện ích bên ngoài.

Dưới đây, bạn có thể thấy mã đã được thay đổi từ 1.1.1n đến 1.1.1o:

Một lệnh Perl có dạng `...` (một lệnh giữa các dấu phẩy ngược, chẳng hạn như `runthis`, chỉ đơn giản là một cách viết lỗi thời $(runthis) thay thế lệnh) đã được thay thế bằng một chức năng nội bộ chuyên dụng được gọi là compute_hash cần quan tâm nhiều hơn đến các siêu ký tự lạ trong chuỗi lệnh được xây dựng.

Chà, hóa ra là những người bảo trì đã không nắm bắt được tất cả các vị trí trong tập lệnh tiện ích này, nơi các lệnh bên ngoài được chạy mà không được quan tâm và chú ý đúng mức.

Vì thế tuần này thấy sự ra mắt của OpenSSL 3.0.41.1.1p, để khắc phục một lệnh hệ thống nguy hiểm khác trong c_rehash tiện ích:

Lần này, đó là lời kêu gọi cp (sao chép tập tin) lệnh thông qua shell system() chức năng đã được thay thế bằng chức năng nội bộ chuyên dụng, an toàn hơn được gọi là copy_file.

Bản sửa lỗi này có mã định danh chính thức CVE-2022-2068.

Như nhật ký thay đổi OpenSSL cảnh báo:

[The c_rehash] tập lệnh được một số hệ điều hành phân phối theo cách nó được thực thi tự động. Trên các hệ điều hành như vậy, kẻ tấn công có thể thực thi các lệnh tùy ý với các đặc quyền của tập lệnh.

Phải làm gì?

  • Cập nhật OpenSSL ngay khi có thể. Nếu bạn đang dựa vào bản phân phối Linux của mình để quản lý bản sao được cài đặt tập trung, hãy kiểm tra với nhà sản xuất bản phân phối của bạn để biết chi tiết. Nếu bạn đang dựa vào bản dựng OpenSSL của riêng mình thay vì (hoặc cũng như) bản dựng trên toàn hệ thống, đừng quên cập nhật bản sao đó. Bạn đang tìm 3.0.4 or 1.1.1p. Chạy openssl version để xem bạn có phiên bản nào.
  • Cân nhắc việc nghỉ hưu c_rehash tiện ích nếu bạn đang sử dụng nó. Tiện ích tất cả trong một openssl, vốn thường được sử dụng để tạo và ký chứng chỉ ngay từ đầu, giờ đây bao gồm một lệnh phụ tích hợp có tên rehash để làm cùng một công việc Thử openssl rehash -help để biết thêm thông tin.
  • Vệ sinh đầu vào và đầu ra của bạn. Đừng bao giờ cho rằng đầu vào bạn nhận được là an toàn để sử dụng nguyên trạng và hãy thận trọng với dữ liệu bạn chuyển dưới dạng đầu ra cho các phần khác trong mã của mình.
  • Hãy cảnh giác với nhiều lỗi khi xem lại mã cho các loại lỗi cụ thể. Một lập trình viên bất cẩn với một system() lệnh ở một nơi trong mã có thể mắc lỗi tương tự ở nơi khác.

Các lập trình viên thường tạo ra (hoặc tái tạo) cùng một loại lỗi nhiều lần, thường là vì những lý do hoàn toàn vô hại và dễ hiểu.

Hoặc là họ không biết về loại lỗi đó vào thời điểm họ làm việc với mã hoặc họ đã sử dụng “lối tắt tạm thời” để tăng tốc công việc của nguyên mẫu nhưng không bao giờ quay lại và dọn dẹp sau đó hoặc họ đã sao chép và dán ai đó mã sai sót của người khác và biến nó thành của riêng họ…


tại chỗ_img

Tin tức mới nhất

tại chỗ_img