Sự phát triển nhanh chóng của công nghệ đã tạo ra nhu cầu cao cho các nhà phát triển lành nghề. Phần mềm nguồn mở (OSS) đã trở thành một công cụ quan trọng cho lực lượng lao động ngày càng tăng này. Hàng trăm ngàn gói OSS được thiết lập tốt hiện đang tồn tại trên các ngôn ngữ lập trình khác nhau. Hơn 90% các nhà phát triển tận dụng các thành phần nguồn mở này trong các ứng dụng độc quyền của họ, làm nổi bật hiệu quả và đề xuất giá trị của OSS. Nhấn mạnh hơn nữa tầm quan trọng của nó, thị trường phần mềm nguồn mở toàn cầu dự kiến sẽ đạt 80,7 tỷ đô la vào năm 2030, phản ánh tốc độ tăng trưởng dự kiến là 16,7% hàng năm.
Software là một phần không thể thiếu trong hoạt động kinh doanh trên toàn thế giới và do đó thường xuyên bị các tác nhân đe dọa nhắm đến. Năm 2023, chi tiêu cho Bảo mật ứng dụng là khoảng 5,76 tỷ đô la, với dự báo đạt 6,67 tỷ đô la vào năm 2024. Trong AppSec, bảo mật chuỗi cung ứng phần mềm đã trở nên nổi bật trong ba năm qua, đại diện cho danh mục tấn công phát triển nhanh nhất, với các vi phạm và khai thác lớn thường xuyên gây chú ý.
Các tổ chức thường cho rằng hầu hết các rủi ro bắt nguồn từ các ứng dụng web công khai. Tuy nhiên, quan điểm này đã thay đổi trong những năm gần đây. Với hàng chục thành phần nhỏ trong mỗi ứng dụng, rủi ro giờ đây có thể xuất hiện từ bất cứ đâu trong cơ sở mã. Điều quan trọng hơn bao giờ hết đối với các tổ chức là làm quen với các lỗi bảo mật hiện có và mới nổi trong vòng đời phát triển phần mềm. Trong bài đăng trên blog này, các Nghiên cứu sinh sau đại học của chúng tôi cung cấp cái nhìn sâu hơn về CVE-2023-23924, một lỗ hổng bảo mật nghiêm trọng được phát hiện trong thư viện dompdf được sử dụng rộng rãi — một công cụ PHP mạnh mẽ cho phép tạo động các tài liệu PDF từ HTML và CSS.
Thông qua phân tích toàn diện, chúng tôi sẽ khám phá những phức tạp về mặt kỹ thuật của lỗ hổng này, các công nghệ liên quan đóng vai trò quan trọng và mô phỏng quá trình khai thác. Chúng tôi cũng sẽ xem xét cách OPSWAT MetaDefender Core , đặc biệt là công cụ Software Bill of Materials (SBOM) của nó, có thể được tận dụng để phát hiện và giảm thiểu lỗ hổng này, trao quyền cho các nhà phát triển phần mềm và nhóm bảo mật luôn đi trước một bước so với các mối đe dọa tiềm ẩn.
Bối cảnh về CVE-2023-23924
Một lỗ hổng bảo mật đã được phát hiện trong dompdf phiên bản 2.0.1 và được công bố vào đầu năm 2023:
- Xác thực URI trên dompdf 2.0.1 có thể được bỏ qua trên phân tích cú pháp SVG bằng cách vượt qua
<image>
có chữ hoa. Điều này cho phép kẻ tấn công gọi các URL tùy ý với các giao thức tùy ý, dẫn đến việc hủy tuần tự hóa đối tượng tùy ý trong các phiên bản PHP trước 8.0.0. Thông qua trình bao bọc URL PHAR, lỗ hổng này có thể gây ra việc xóa tệp tùy ý và thậm chí thực thi mã từ xa, tùy thuộc vào các lớp có sẵn. - Các nhà phân tích của NVD đã chỉ định điểm CVSS là 9,8 CRITICAL cho CVE-2023-23924.
Hiểu lỗ hổng Dompdf
Để hiểu đầy đủ về lỗ hổng CVE-2023-23924 trong dompdf, điều cần thiết là phải làm quen với hai công nghệ liên quan chặt chẽ: Đồ họa vector có thể mở rộng (SVG) và tệp PHAR.
SVG (Scalable Vector Graphics) là một định dạng hình ảnh đa năng đã trở nên phổ biến rộng rãi do khả năng hiển thị đồ họa chất lượng cao trên web trong khi vẫn nhẹ và có thể mở rộng. Không giống như hình ảnh raster, SVG dựa trên đánh dấu XML, cho phép kiểm soát chính xác các yếu tố như dòng, hình dạng và văn bản. Một trong những ưu điểm chính của SVG là khả năng mở rộng quy mô liền mạch mà không làm giảm chất lượng hình ảnh, khiến chúng trở nên lý tưởng cho thiết kế web đáp ứng và màn hình độ phân giải cao.
PHAR (PHP Archive) tương tự như khái niệm tệp JAR nhưng dành cho PHP. Nó cho phép triển khai dễ dàng bằng cách đóng gói tất cả mã PHP và tệp tài nguyên vào một tệp lưu trữ duy nhất.
Tệp PHAR bao gồm 4 phần:
- Sơ khai: chứa mã để khởi động kho lưu trữ.
- Tệp kê khai: chứa siêu dữ liệu của kho lưu trữ. Siêu dữ liệu được lưu trữ ở định dạng nối tiếp, có thể được sử dụng để kích hoạt cuộc tấn công deserialized PHP trong tệp PHAR độc hại.
- Nội dung tệp: chứa nội dung của kho lưu trữ, bao gồm mã PHP, tệp tài nguyên.
- Chữ ký (Tùy chọn): chứa dữ liệu để xác minh tính toàn vẹn của tệp.
Do siêu dữ liệu được lưu trữ ở định dạng tuần tự, sự kết hợp của trình bao bọc PHAR và siêu dữ liệu của tệp PHAR có khả năng kích hoạt một cuộc tấn công deserialization khi được sử dụng làm đầu vào trong các hàm PHP như file_get_contents(), fopen(), file(), file_exists(), md5_file(), filemtime(),
hoặc Kích thước tập tin()
. Việc giám sát bảo mật này có thể cho phép kẻ tấn công thực thi mã từ xa thông qua tệp PHAR.
Cách Dompdf tạo tệp PDF
Qua phân tích, OPSWAT Nghiên cứu sinh sau đại học xác định rằng có ba giai đoạn trong quá trình chuyển đổi trên dompdf. Để chuyển đổi tệp HTML sang định dạng PDF, trước tiên thư viện dompdf phân tích cú pháp tệp đầu vào vào cây DOM và lưu trữ thông tin định vị và bố cục của từng đối tượng. Tiếp theo, kiểu CSS được phân tích cú pháp và áp dụng cho từng đối tượng. Cuối cùng, các đối tượng được tổ chức lại để phù hợp với trang và được hiển thị thành tệp PDF cuối cùng.
Để tăng cường bảo mật, dompdf thực hiện xác thực để đảm bảo an toàn cho đầu vào URI trước khi tiến hành bước tiếp theo. Quá trình xác thực này được thể hiện rõ trong quá trình xử lý tệp SVG trong giá trị của Xlink:HREF
thuộc tính.
Nếu tệp đầu vào SVG chứa <image>
bên dưới <svg>
, một điều kiện được thực hiện để chỉ cho phép một số giao thức nhất định, chẳng hạn như http://
, https://
và file://
, đối với Xlink:HREF
trường.
Các resolve_url()
hàm sẽ xác thực URI trước khi xử lý nó bằng drawImage()
chức năng. Nếu lược đồ trong URI không nằm trong số các giao thức được phép, resolve_url()
hàm sẽ trả về một ngoại lệ cho ứng dụng.
Nếu URI vượt qua xác thực, nó sẽ được chuyển đến drawImage()
hàm, sử dụng file_get_contents()
chức năng xử lý giá trị URI trong Xlink:HREF
thuộc tính. Lỗ hổng bảo mật phát sinh tại thời điểm này: một cuộc tấn công deserialization PHAR có thể được kích hoạt nếu kẻ tấn công có thể bỏ qua xác nhận và chuyển trình bao bọc PHAR vào URI.
Sau khi phân tích, người ta phát hiện ra rằng việc xác nhận chỉ được thực thi trên các thẻ có hình ảnh tên chính xác.
Do đó, nó có thể dễ dàng bỏ qua bằng cách viết hoa một hoặc nhiều ký tự trong tên của tên thẻ, chẳng hạn như Hình ảnh. Do đó, một tệp SVG được tạo đặc biệt sử dụng Hình ảnh thay vì hình ảnh có thể trốn tránh xác thực này.
Trong bước tiếp theo, các drawImage()
hàm được gọi, chuyển URI từ tệp SVG sang file_get_contents()
chức năng. Do đó, sự kết hợp của bỏ qua xác thực và một cuộc tấn công deserialization trên một tập tin PHAR cho phép kẻ tấn công tiến hành thực thi mã từ xa. Lỗ hổng này mở ra cánh cửa cho kẻ tấn công độc hại xâm phạm máy chủ ứng dụng thông qua tệp SVG nếu nó được xử lý bởi phiên bản dompdf dễ bị tấn công.
Mô phỏng khai thác Dompdf
Để mô phỏng việc khai thác này như một kịch bản trong thế giới thực, OPSWAT Graduate Fellows đã phát triển một ứng dụng web có tính năng chuyển đổi HTML sang PDF bằng cách sử dụng thư viện dompdf phiên bản 2.0.1. Ứng dụng này cho phép người dùng tải lên các loại tệp như HTML, XML hoặc SVG, sau đó chuyển đổi chúng thành tệp PDF.
Kẻ tấn công sẽ làm theo các bước sau để khai thác lỗ hổng này trong ứng dụng bằng cách sử dụng phiên bản dompdf dễ bị tấn công (phiên bản 2.0.1):
Thứ nhất, kẻ tấn công tạo ra một đối tượng độc hại tạo ra một vỏ ngược khi trình hủy diệt được gọi.
Thứ hai, kẻ tấn công tạo một tệp PHAR chứa đối tượng siêu dữ liệu độc hại. Khi tệp PHAR được gọi bởi trình bao bọc PHAR trong file_get_content()
chức năng, siêu dữ liệu được không tuần tự hóa và đối tượng được chỉ định được xử lý. Trong quá trình deserialization này, nó kích hoạt các destructors và thực hiện shell ngược.
Cuối cùng, kẻ tấn công nhúng liên kết URI có chứa trình bao bọc PHAR vào giá trị của Xlink:HREF
trong thẻ Hình ảnh để vượt qua xác thực, thực thi mã độc và tải tệp độc hại này lên ứng dụng.
Trong quá trình xử lý tệp SVG độc hại được tải lên, ứng dụng sẽ thiết lập kết nối ngược với kẻ tấn công, cho phép chúng xâm phạm máy chủ ứng dụng.
Bảo mật các thành phần nguồn mở với OPSWAT MetaDefender Core
Để phát hiện và giảm thiểu lỗ hổng CVE-2023-23924 trong dompdf, các Nghiên cứu sinh sau đại học của chúng tôi đã sử dụng OPSWAT MetaDefender Core, một sản phẩm an ninh mạng nhiều lớp cung cấp các công nghệ phát hiện và ngăn chặn phần mềm độc hại tiên tiến, bao gồm SBOM.
OPSWAT SBOM bảo mật chuỗi cung ứng phần mềm bằng cách cung cấp một kho thành phần toàn diện cho mã nguồn và container. Bằng cách phân tích thư viện dompdf và các phụ thuộc của nó, OPSWAT SBOM có thể nhanh chóng xác định sự hiện diện của phiên bản 2.0.1 dễ bị tấn công và cảnh báo người dùng về rủi ro tiềm ẩn.
Ngoài ra OPSWAT SBOM có thể phát hiện các công nghệ liên quan, chẳng hạn như tệp SVG và PHAR, rất cần thiết để hiểu và giảm thiểu lỗ hổng CVE-2023-23924. Cái nhìn toàn diện này về các thành phần phần mềm của ứng dụng cho phép các nhóm bảo mật đưa ra quyết định sáng suốt và thực hiện các hành động thích hợp để giải quyết các rủi ro đã xác định.
Ngoài việc phát hiện phiên bản dompdf dễ bị tấn công, OPSWAT SBOM cũng cung cấp thông tin chi tiết có giá trị về các thành phần bị ảnh hưởng, phiên bản của chúng và mọi bản cập nhật hoặc bản vá có sẵn. Thông tin này cho phép các nhóm bảo mật ưu tiên các nỗ lực khắc phục của họ và đảm bảo ứng dụng được cập nhật lên phiên bản dompdf an toàn, giải quyết hiệu quả lỗ hổng CVE-2023-23924.
Bằng cách tận dụng động cơ SBOM trong MetaDefender Core, các tổ chức có thể chủ động giám sát chuỗi cung ứng phần mềm của họ, xác định các lỗ hổng tiềm ẩn trong các thành phần nguồn mở và thực hiện các chiến lược giảm thiểu kịp thời, đảm bảo tính bảo mật và tính toàn vẹn tổng thể của các ứng dụng của họ.
Bớt tư tưởng
Việc phát hiện ra CVE-2023-23924 trong thư viện dompdf nhấn mạnh nhu cầu quan trọng về cảnh giác trong bối cảnh năng động của bảo mật ứng dụng. Bằng cách tận dụng những hiểu biết và chiến lược được nêu trong bài đăng trên blog này, các nhóm bảo mật có thể phát hiện, giảm thiểu và bảo vệ hiệu quả các ứng dụng của họ chống lại các lỗ hổng đó, đảm bảo tính bảo mật và tính toàn vẹn tổng thể của hệ sinh thái phần mềm của họ.