Lỗi thực thi mã SHA-3 được vá trong PHP – hãy kiểm tra phiên bản của bạn

Mặc dù tại thời điểm viết bài này[2022-11-01T11. 30][2022-11-01T11. 30], một lỗi nghiêm trọng trong OpenSSL đã được báo cáo trên các phương tiện truyền thông hàng ngày. Vì tin tức là về một bản cập nhật dự kiến ​​sẽ được phát hành vào cuối ngày hôm nay nhưng vẫn chưa được công khai [00Z], nên không ai phụ trách OpenSSL thực sự biết phải nói gì với bạn về lỗi này

Khi chúng tôi thực sự hiểu lỗi đó, chúng tôi sẽ giải thích thay vì chỉ đề xuất một bản vá ngay lập tức. (Nếu bạn không quan tâm đến các chi tiết cụ thể của lỗ hổng đó, bạn có thể chỉ cần vá bất kỳ phiên bản OpenSSL dễ bị tấn công nào trong hệ sinh thái của riêng bạn. ))

Tuy nhiên, có một lỗi thư viện mật mã khác, không liên quan đã được sửa gần đây và không nhận được nhiều sự chú ý;

Do đó, chúng tôi quyết định nhanh chóng thảo luận về CVE-2022-37454 trong khi chờ đợi sự tiết lộ OpenSSL trong căng thẳng và hào hứng

Mã mật mã SHA-3 được cung cấp bởi nhóm đã tạo thuật toán băm ban đầu được gọi là Keccak (phát âm là "ketchak", giống như "sốt cà chua") chứa một lỗi ghi đè bộ đệm do lỗi tràn số học

Gói mã Keccak mở rộng, viết tắt là XKCP, là tên của triển khai chính thức này. Nó bao gồm mã thư viện nguồn mở cho Keccak cũng như một số công cụ mã hóa liên quan do nhóm Keccak phát triển, chẳng hạn như thuật toán mã hóa được xác thực Ketje và Keyak và trình tạo số giả ngẫu nhiên Kravatte

Một nhóm chuyên gia cung cấp dịch vụ tìm kiếm, phát hiện và phản hồi mối đe dọa 24/7 dưới dạng dịch vụ được quản lý hoàn toàn
Tìm hiểu thêm

Khó khai thác

Vì lỗi CVE-2022-37454 phụ thuộc vào một chuỗi lệnh gọi rất bất thường đến thư viện băm, nên rất khó để kích hoạt từ xa, nếu không muốn nói là không thể

Nói một cách đơn giản, bạn phải thực hiện hàm băm bằng cách cung cấp cho nó một loạt các khối dữ liệu, mỗi khối phải có ít nhất 4.294.967.096 byte và không lớn hơn 4294967295 byte.

Như bạn có thể mong đợi, phần mềm băm dữ liệu được tải lên từ xa sẽ truy xuất toàn bộ đối tượng trước khi băm cục bộ, thường bằng cách xử lý lặp đi lặp lại bộ đệm có độ dài cố định hoặc xếp từng đoạn nhận được vào hàm băm khi nhận được

Tuy nhiên, lỗi này tương tự như lỗi mà chúng tôi đã viết vào đầu năm nay trong một giao thức mạng có tên là NetUSB, cho phép truy cập ảo hóa vào các thiết bị USB qua mạng, chẳng hạn như để bạn có thể cắm thiết bị USB như ổ đĩa, ổ flash

Bộ định tuyến gia đình hỗ trợ NetUSB có thể gặp lỗi hạt nhân nghiêm trọng

Bằng cách so sánh kích thước được khai báo trước của gói yêu cầu với giới hạn đã biết, mã trong lỗi đó đảm bảo rằng bạn không cố sử dụng quá nhiều bộ nhớ

Tuy nhiên, nó đã âm thầm thêm 17 byte bổ sung vào yêu cầu bộ nhớ trước khi kiểm tra, tạo cho chính nó một lượng nhỏ dung lượng bộ đệm bổ sung

Do đó, bạn có thể gây ra tràn số nguyên bằng cách nói cho mã NetUSB biết rằng bạn muốn gửi một lượng dữ liệu khổng lồ vừa mới xảy ra trong phạm vi 17 byte của giới hạn 4GB được áp đặt bằng cách sử dụng số nguyên 32 bit

Vì không có đủ dung lượng để lưu trữ câu trả lời 33 bit chính xác, nên 0xFFFFFFFF + 1 bao quanh thành 0x00000000 bằng cách sử dụng số nguyên 32 bit, giống như lỗi Thiên niên kỷ đã bao hàm giá trị 99+1 về 0 để biểu thị năm 1900 thay vì

Do đó, mã sẽ chỉ phân bổ một lượng nhỏ bộ nhớ (tối đa (0xFFFFFFFF + 17) mod 232, i. e. 16) nhưng sau đó sẽ chấp nhận hầu hết mọi lượng dữ liệu bạn muốn gửi, cố gắng đưa nó vào một khối bộ nhớ không đủ lớn

Tương tự như lỗi này là lỗi XKCP, nguyên nhân là do kiểm tra kích thước không đạt 200 byte so với giới hạn 4GB nhưng thực tế lại kiểm tra giới hạn 4GB, có khả năng dẫn đến nhiều kết quả không mong muốn

  • Một cuộc tấn công DoS (từ chối dịch vụ) có thể khai thác có thể xảy ra do sự cố chương trình được gọi là thư viện;
  • Nếu mã cuộc gọi không gặp sự cố hoặc nhận thấy lỗi không mong muốn, nó có thể tạo ra kết quả không chính xác, dẫn đến lỗi xác thực hàm băm. Về mặt lý thuyết, điều này có thể dẫn đến các kết quả như dữ liệu đã sửa đổi bị xác định nhầm là chưa sửa đổi trong quá trình kiểm tra danh sách cho phép hoặc dữ liệu bị cấm không được phát hiện trong quá trình kiểm tra danh sách chặn
  • Thường có khả năng tội phạm mạng am hiểu có thể thao túng sự cố và lừa CPU chạy mã độc, thay vì "không an toàn" dưới sự kiểm soát của kẻ tấn công, nếu sự cố có thể được kích hoạt từ xa với dữ liệu do kẻ tấn công chọn

phải làm gì?

Không giống như OpenSSL, có mã Keccak riêng và không bị ảnh hưởng bởi lỗi này, việc triển khai XKCP của SHA-3 không phổ biến lắm, nhưng nó xuất hiện ít nhất trong PHP 8

Cài đặt PHP8. 0 ngay nếu bạn có. 25 hoặc 8. 112 trở lên

Nếu bạn sử dụng Python 3. 10 hoặc phiên bản cũ hơn của Python11 sang triển khai SHA-3 khác không bị ảnh hưởng), bạn có thể bị lộ

May mắn thay, có một số bản dựng của Python 3. (Trên hệ thống Linux của riêng chúng tôi, Slackware hiện tại với Python 3, đây là trường hợp. )15), được xây dựng với các hàm hashlib sử dụng OpenSSL, giúp bảo vệ chúng khỏi lỗi cụ thể này

Điều này sẽ cho phép bạn xác định xem phiên bản Python của bạn sử dụng XKCP hay triển khai OpenSSL của SHA-3

_10

Thay vì tham chiếu _14, một phiên bản Python dễ bị tấn công sẽ nói điều gì đó như

Nhóm Python tuyên bố rằng "Python 3" phiên bản 8 trở về trước, bất kể phiên bản nào, đã không ủy quyền sha3 cho OpenSSL, khiến chúng dễ bị tấn công. "

Mã này có thể được sử dụng như một bằng chứng đơn giản về khái niệm để xem liệu bạn có gặp rủi ro hay không

________Đầu tiên

Nếu Python gặp sự cố tại thời điểm này với một lỗi như python3.x terminated by signal SIGSEGV (một nỗ lực truy cập vào bộ nhớ không phải của bạn), thì bạn phải đợi bản cập nhật phiên bản Python hoặc tổ chức lại mã của mình, chẳng hạn như bằng cách gói mã có vấn đề

Bạn có thể đã xem hết câu chuyện này đến câu chuyện khác trên các phương tiện truyền thông trong tuần qua về một lỗi nghiêm trọng trong OpenSSL, mặc dù tại thời điểm viết bài này[2022-11-01T11. 30. 00Z], không ai phụ trách OpenSSL thực sự biết phải nói gì với bạn về lỗi này, bởi vì tin tức là về một bản cập nhật dự kiến ​​sẽ ra mắt vào cuối ngày hôm nay, nhưng chưa được tiết lộ

Chúng tôi sẽ đề cập đến lỗi đó khi chúng tôi thực sự biết nó là gì, vì vậy chúng tôi có thể giải thích về nó thay vì chỉ nói, “Vá ngay lập tức. ” (Nếu bạn không quan tâm đến các chi tiết của lỗ hổng đó, bạn thực sự có thể chỉ cần vá bất kỳ phiên bản OpenSSL dễ bị tấn công nào trong hệ sinh thái của riêng bạn. )

Nhưng có một lỗi thư viện mật mã khác, không liên quan, đã được sửa gần đây, chưa được công bố rộng rãi và mặc dù chúng tôi đoán rằng nó ít nguy hiểm hơn nhiều so với lỗi OpenSSL sắp được tiết lộ, nhưng nó vẫn đáng để biết

Vì vậy, trong thời gian chờ đợi tiết lộ OpenSSL căng thẳng và thú vị, chúng tôi nghĩ rằng chúng tôi sẽ nhanh chóng đưa tin về CVE-2022-37454

Lỗ hổng đó là lỗi ghi đè bộ đệm gây ra bởi lỗi tràn số học trong mã mật mã SHA-3 được cung cấp bởi nhóm thiết kế ban đầu thuật toán băm SHA-3, ban đầu được gọi là Keccak (phát âm là 'ketchak', giống như 'sốt cà chua')

Việc triển khai chính thức này, được gọi là XKCP, viết tắt của eXtended Keccak Code Package, là một tập hợp mã thư viện nguồn mở cho Keccak và một loạt các công cụ mã hóa có liên quan từ nhóm Keccak, bao gồm các thuật toán mã hóa được xác thực của họ Ketje và Keyak, các trình tạo giả ngẫu nhiên có tên là Kravatte

Tìm kiếm, phát hiện và phản hồi mối đe dọa 24/7 được cung cấp bởi một nhóm chuyên gia dưới dạng dịch vụ được quản lý hoàn toàn

Tìm hiểu thêm

Khó khai thác

May mắn thay, lỗi CVE-2022-37454 gần như chắc chắn sẽ khó hoặc thậm chí không thể kích hoạt từ xa, vì nó phụ thuộc vào việc kích hoạt một chuỗi lệnh gọi rất đặc biệt đến thư viện băm

Nói một cách đơn giản, bạn cần thực hiện hàm băm bằng cách cung cấp cho nó một chuỗi các khối dữ liệu và đảm bảo rằng một trong các khối đó có kích thước gần, nhưng không hoàn toàn, 4GB (ít nhất 4.294.967.096 byte và nhiều nhất là 4294967295 byte)

Như bạn có thể tưởng tượng, mã băm dữ liệu được tải lên từ xa có khả năng truy xuất toàn bộ đối tượng trước khi băm cục bộ, thường bằng cách xử lý lặp đi lặp lại bộ đệm có độ dài cố định có kích thước nhỏ hơn nhiều hoặc gấp từng đoạn nhận được vào hàm băm như

Tuy nhiên, lỗi này gợi nhớ đến một lỗi mà chúng tôi đã viết vào đầu năm nay trong một giao thức mạng có tên là NetUSB, cho phép truy cập vào các thiết bị USB được ảo hóa trên một mạng, chẳng hạn như để bạn có thể cắm một thiết bị USB như ổ đĩa,

Bộ định tuyến gia đình có hỗ trợ NetUSB có thể có lỗ hổng nhân nghiêm trọng

Trong lỗi đó, mã đã kiểm tra xem bạn có đang cố sử dụng quá nhiều bộ nhớ hay không bằng cách so sánh kích thước được khai báo trước của gói yêu cầu với giới hạn đã biết…

…nhưng, trước khi kiểm tra, nó đã âm thầm bổ sung thêm 17 byte vào dung lượng bộ nhớ được yêu cầu, để cung cấp một chút dung lượng bộ đệm dự phòng cho mục đích sử dụng của chính nó

Vì vậy, nếu bạn nói với mã NetUSB rằng bạn muốn gửi một lượng dữ liệu lớn không thể tưởng tượng được nằm trong phạm vi 17 byte của giới hạn 4GB được áp đặt bằng cách sử dụng số nguyên 32 bit, thì bạn đã gây ra tràn số nguyên.

Sử dụng số nguyên 32 bit, 0xFFFFFFFF + 1 bị cắt bớt thành 32 bit, do đó, nó bao quanh như đồng hồ đo đường ô tô kiểu cũ thành 0x00000000. Không có chỗ để lưu trữ câu trả lời 33 bit chính xác 0x100000000, giống như cách mà lỗi Thiên niên kỷ đã gói giá trị 99+1 trở lại 0, đại diện cho năm 1900, thay vì đạt tới 100, đại diện cho năm 1900.

Do đó, mã sẽ chỉ phân bổ một vài byte bộ nhớ (tối đa (0xFFFFFFFF + 17) mod 232, i. e. 16) nhưng sau đó chấp nhận hầu hết mọi lượng dữ liệu bạn muốn gửi, dữ liệu này sau đó sẽ cố nén vào một khối bộ nhớ nơi nó không thể chứa vừa

Lỗi XKCP cũng tương tự, gây ra bởi một kiểm tra kích thước được cho là không đạt 200 byte so với giới hạn 4GB, nhưng thay vào đó, kiểm tra đó thực sự được kiểm tra theo giới hạn 4GB, do đó có khả năng dẫn đến một loạt kết quả có thể xảy ra, tất cả đều xấu

  • Sự cố của chương trình gọi thư viện. Điều này có thể gây ra một cuộc tấn công DoS (từ chối dịch vụ) có thể khai thác được, trong đó nếu không thì dữ liệu bị mắc bẫy vô hại có thể được gửi đi gửi lại để làm sập một máy chủ quan trọng, sau đó lại làm sập nó nhiều lần và nhiều lần nữa
  • Tính toán sai giá trị băm cuối cùng. Nếu mã cuộc gọi không gặp sự cố hoặc phát hiện lỗi không mong muốn, thì mã đó có thể tạo ra kết quả không chính xác, điều này có thể khiến quá trình xác thực hàm băm bị sai. Về lý thuyết, điều này có thể dẫn đến các kết quả như dữ liệu bị cấm không được chọn khi kiểm tra danh sách chặn hoặc dữ liệu đã sửa đổi bị xác định sai là chưa sửa đổi trong kiểm tra danh sách cho phép
  • Thực thi mã từ xa. Nếu sự cố có thể được kích hoạt từ xa với dữ liệu do kẻ tấn công chọn, thì thường có khả năng tội phạm mạng có đầy đủ thông tin có thể thao túng sự cố và lừa CPU chạy mã độc, thay vì “không an toàn” dưới sự kiểm soát của

phải làm gì?

Không giống như OpenSSL, việc triển khai XKCP của SHA-3 không được sử dụng rộng rãi (nhân tiện, OpenSSL có mã Keccak riêng và do đó không bị ảnh hưởng bởi lỗi này), nhưng mã XKCP xuất hiện ít nhất trong PHP 8,

Nếu bạn có PHP 8, hãy vá ngay bây giờ thành 8. 0. 25 hoặc 8. 1. 12 trở lên

Nếu bạn có Python 3. 10 hoặc sớm hơn (Python 3. 11 chuyển sang triển khai SHA-3 khác không bị ảnh hưởng), bạn có thể dễ bị tấn công

May mắn thay, một số bản dựng của Python 3. 9 và 3. 10 (đây là trường hợp trên hệ thống Linux của chúng tôi, Slackware-current với Python 3. 9. 15), được biên dịch để các hàm hashlib sử dụng OpenSSL, giúp chúng miễn nhiễm với lỗi cụ thể này

Bạn có thể kiểm tra xem phiên bản Python của mình có đang sử dụng triển khai OpenSSL của SHA-3 hay không, thay vì sử dụng XKCP, bằng cách thực hiện việc này

>>> import hashlib
>>> hashlib.sha3_224

Một phiên bản Python dễ bị tấn công sẽ nói điều gì đó như thay vì tham chiếu đến openssl_sha3_224

Theo nhóm Python, “Python 3. 8 trở về trước không ủy quyền sha3 cho OpenSSL bất kể phiên bản nào, vì vậy những phiên bản này dễ bị tổn thương”

Bạn có thể sử dụng mã này làm bằng chứng khái niệm cơ bản để xác định xem bạn có gặp rủi ro hay không

$ python3.x
>>> import hashlib
>>> h = hashlib.sha3_224()         # set up a SHA-3 hash calculation
>>> h.update(b"\x00" * 1)          # hash one byte
>>> h.update(b"\x00" * 4294967295) # then hash a further 2^32 - 1 bytes

Nếu Python gặp sự cố tại thời điểm này với một lỗi chẳng hạn như python3.x terminated by signal SIGSEGV (một nỗ lực truy cập vào bộ nhớ không phải của bạn), thì bạn cần đợi bản cập nhật cho phiên bản Python của mình hoặc sắp xếp lại mã của mình, chẳng hạn như bằng cách bọc lỗi