Tràn số nguyên trong PHP ext-soap có thể dẫn đến heap buffer overflow

Lưu ý: Dữ liệu này chỉ có tính chất tham khảo, phục vụ nghiên cứu an ninh mạng.CyStack khuyến nghị người dùng không sử dụng các thông tin này nhằm các mục đích bất hợp pháp

Lỗ hổng CVE-2025-14181 là gì?

Lỗ hổng CVE-2025-14181 là lỗ hổng Integer Overflow or Wraparound ảnh hưởng tới PHP (phiên bản bị ảnh hưởng: 8.2.* – < 8.2.34, 8.3.* – < 8.3.35 và các phiên bản bị ảnh hưởng khác). Lỗ hổng này được xếp hạng ở mức Trung bình, với điểm CVSS 6.5. Lỗ hổng này đã có mã hoặc bằng chứng khai thác công khai, nhưng điều đó chưa xác nhận việc khai thác trong thực tế.

Giới thiệu chung

Dữ liệu gốc

SOAP HTTP client bảo vệ việc tăng kích thước bộ đệm phản hồi bằng một phép kiểm tra dựa trên signed integer overflow, đây là undefined behaviour và không được đảm bảo sẽ được kích hoạt. Khi phép kiểm tra bị tối ưu hóa và loại bỏ, một SOAP server độc hại có thể khiến client cấp phát một bộ đệm nhỏ hơn rất nhiều so với lượng dữ liệu mà nó sẽ ghi vào đó, tạo ra heap buffer overflow.

Sản phẩm và phạm vi ảnh hưởng

PHP Group PHP package ext-soap có các nhánh bị ảnh hưởng sau:

  • Nhánh 8.2.*: các phiên bản nhỏ hơn 8.2.34 bị ảnh hưởng; bản sửa lỗi là 8.2.34.
  • Nhánh 8.3.*: các phiên bản nhỏ hơn 8.3.35 bị ảnh hưởng; bản sửa lỗi là 8.3.35.
  • Nhánh 8.4.*: các phiên bản nhỏ hơn 8.4.26 bị ảnh hưởng; bản sửa lỗi là 8.4.26.
  • Nhánh 8.5.*: các phiên bản nhỏ hơn 8.5.11 bị ảnh hưởng; bản sửa lỗi là 8.5.11.

Dữ liệu được cung cấp chỉ xác nhận các nhánh và ranh giới trên. Không nên suy ra trạng thái của nhánh phát hành khác nếu chưa có thông tin riêng cho nhánh đó.

Chi tiết kỹ thuật

Trong PHP ext-soap, hàm get_http_body() tích lũy dữ liệu phản hồi SOAP dạng chunked và kiểm tra khả năng tràn bộ đệm bằng phép cộng trên các biến kiểu int. Điều kiện kiểm tra dựa vào signed integer overflow, là undefined behaviour trong C và có thể bị compiler loại bỏ. Khi nhánh kiểm tra không còn, zend_string_realloc() có thể nhận kích thước đã bị wrap, cấp phát ít bộ nhớ hơn lượng dữ liệu mà vòng lặp đọc tiếp theo ghi vào, dẫn đến heap buffer overflow.

Lỗi nằm trong thành phần SOAP HTTP client và có thể bị kích hoạt bởi dữ liệu phản hồi do SOAP server kiểm soát. Advisory cho biết bản sửa đổi chuyển kích thước tích lũy sang size_t, giới hạn từng bước tăng trước khi cấp phát và dùng zend_string_safe_realloc() để kiểm tra phép nhân, phép cộng. Hành vi cuối cùng sau khi ghi vượt vùng nhớ, chẳng hạn chỉ crash hay gây memory corruption, còn phụ thuộc vào heap layout và compiler dùng để build PHP.

Khả năng khai thác

Có thể tiếp cận qua mạng khi một PHP SoapClient nhận phản hồi từ SOAP server độc hại. Một man-in-the-middle trên kết nối SOAP plaintext cũng có thể cung cấp phản hồi do kẻ tấn công kiểm soát. Bản ghi cho biết không cần quyền xác thực hoặc user interaction, nhưng điều kiện khai thác có độ phức tạp cao: bản build phải loại bỏ kiểm tra signed-overflow và client phải chấp nhận phản hồi nhiều gigabyte.

Bản ghi đánh dấu public exploit là có sẵn, và advisory của PHP mô tả một proof of concept cùng regression test. Bằng chứng được cung cấp không xác lập việc lỗ hổng đã bị khai thác trong thực tế.

Tác động kỹ thuật

Kết quả kỹ thuật trực tiếp là ghi vượt giới hạn heap buffer trong tiến trình PHP đang xử lý SOAP response. Tùy heap layout và compiler, lỗi có thể gây crash hoặc memory corruption, từ đó ảnh hưởng đến tính sẵn sàng và có khả năng ảnh hưởng tính toàn vẹn của tiến trình. Bản ghi không xác lập tác động đến tính bí mật, cũng không chứng minh rằng lỗi luôn dẫn đến chiếm quyền thực thi.

Phạm vi ảnh hưởng vẫn nằm trong tiến trình PHP xử lý SoapClient. Khả năng khai thác bị giới hạn bởi yêu cầu compiler loại bỏ kiểm tra undefined overflow và yêu cầu client chấp nhận phản hồi nhiều gigabyte; nếu memory_limit chặn trước đó, advisory cho biết tiến trình sẽ gặp out-of-memory trước khi đến overflow.

Tác động đến tổ chức

  • Ứng dụng PHP xử lý SOAP response độc hại có thể bị crash, out-of-memory hoặc mất ổn định, gây gián đoạn dịch vụ.
  • Heap buffer overflow có thể dẫn đến memory corruption; mức ảnh hưởng thực tế phụ thuộc vào heap layout và compiler, nên không thể mặc định rằng mọi build đều cho cùng một kết quả.
  • Kết nối SOAP plaintext làm tăng rủi ro vì man-in-the-middle có thể thay thế phản hồi. Advisory không xác lập việc lỗ hổng tự nó dẫn đến rò rỉ dữ liệu hoặc arbitrary code execution.
  • Các hệ thống chỉ kết nối đến SOAP server đáng tin cậy vẫn cần kiểm tra vì điều kiện lỗi nằm trong client và liên quan đến kích thước phản hồi.

Cách khắc phục

  1. Nâng cấp PHP có ext-soap lên bản sửa lỗi tương ứng với nhánh đang triển khai: 8.2.34, 8.3.35, 8.4.26 hoặc 8.5.11. Chọn đúng bản cố định trong cùng nhánh; dữ liệu hiện có không chứng minh rằng mọi nhánh khác đều đã được sửa.
  2. Nếu chưa thể cập nhật ngay, giới hạn SOAP client chỉ kết nối đến các endpoint đáng tin cậy và ưu tiên transport được bảo vệ, nhằm giảm khả năng nhận phản hồi do server độc hại hoặc man-in-the-middle kiểm soát. Đây chỉ là biện pháp giảm rủi ro tạm thời.
  3. Có thể đặt memory_limit thấp để buộc lỗi out-of-memory xảy ra trước khi đạt tới overflow, theo workaround được advisory nêu. Biện pháp này có thể làm phát sinh lỗi dịch vụ và không thay thế bản vá.
  4. Sau khi cập nhật, xác minh runtime thực tế đã tải đúng phiên bản PHP và ext-soap, đặc biệt với các image, package backport hoặc bản build nội bộ.

Cách phát hiện

  • Kiểm kê các bản PHP có cài và bật ext-soap, sau đó đối chiếu từng nhánh với các ranh giới bị ảnh hưởng trong affected_summary.
  • Xác định ứng dụng có sử dụng SoapClient, các SOAP endpoint mà chúng kết nối, và liệu endpoint có thể bị thay đổi, không đáng tin cậy hoặc đi qua kết nối plaintext hay không.
  • Ghi nhận compiler và toolchain dùng để build PHP khi triage, vì advisory xác định việc compiler loại bỏ signed-overflow check là điều kiện liên quan đến khả năng biểu hiện lỗi.
  • Rà soát crash, out-of-memory và memory-corruption telemetry liên quan đến SOAP client, đặc biệt quanh các phản hồi chunked hoặc có kích thước bất thường. Đây là dấu hiệu cần điều tra, không phải IOC đã được xác nhận.
  • Kiểm tra memory_limit. Giá trị thấp có thể khiến tiến trình gặp out-of-memory trước khi đạt tới overflow, nhưng không thay thế cho việc cập nhật bản sửa lỗi.
Nguồn (19)
Tìm hiểu thêm

Kiểm tra chuyên sâu cùng giải pháp quản lý rủi ro Web toàn diện

Giải pháp CyStack VulnScan liên tục phát hiện tài sản, xác minh lỗ hổng và giúp đội ngũ bảo mật ưu tiên khắc phục cho toàn bộ doanh nghiệp.

Khám phá các giải pháp khác liên quan