djangoproject Django GeoDjango Spatial Lookup Cho Phép Ghi Tệp Phía Máy Chủ và SSRF

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-2026-15307 là gì?

Lỗ hổng CVE-2026-15307 là lỗ hổng thuộc các loại External Control of File Name or Path và Server-Side Request Forgery (SSRF), ảnh hưởng tới Django (phiên bản bị ảnh hưởng: 6.0 – < 6.0.8 và 5.2 – < 5.2.17). Lỗ hổng này được xếp hạng ở mức Cao, với điểm CVSS 8.7. Các nguồn hiện có chưa ghi nhận lỗ hổng này bị khai thác.

Giới thiệu chung

Dữ liệu gốc

Một vấn đề đã được phát hiện trong Django 5.2 trước 5.2.17 và 6.0 trước 6.0.8. Các spatial lookup của GeoDjango phân tích một cách lạc quan giá trị ở vế phải như một raster bằng cách truyền giá trị đó vào constructor django.contrib.gis.gdal.GDALRaster. Mọi giá trị được sử dụng trong spatial lookup đối với GeometryField hoặc RasterField đều đi tới constructor này, kể cả dữ liệu đầu vào không tin cậy, chẳng hạn bộ lọc trên trường spatial được gửi qua chuỗi truy vấn của changelist trong Django admin bởi một staff user có quyền xem. Một dict, hoặc một str chứa biểu diễn JSON của nó, bị mở ở chế độ ghi bất kể giá trị mặc định write=False của constructor, cho phép ghi một tệp có tên và nội dung do kẻ tấn công chọn thông qua file-backed GDAL driver. Mọi str khác được coi là datasource, cho phép gửi yêu cầu mạng outbound thông qua GDAL virtual filesystem handler. Việc ghi tệp vào vị trí mà ứng dụng nhập vào về sau có thể dẫn đến remote code execution. Các series Django cũ hơn và không còn được hỗ trợ (chẳng hạn 5.1.x, 5.0.x và 4.2.x) chưa được đánh giá và cũng có thể bị ảnh hưởng. Django xin cảm ơn Bence Nagy, localhost-detect và kimchunbok_ đã báo cáo vấn đề này.

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

  • Django 6.0 trước 6.0.8 được đánh dấu affected.
  • Django 5.2 trước 5.2.17 được đánh dấu affected.
  • Các series Django cũ hơn và không còn được hỗ trợ, như 5.1.x, 5.0.x và 4.2.x, chưa được đánh giá và cũng có thể bị ảnh hưởng.
  • Thông báo của nhà cung cấp cho biết bản vá đã được áp dụng trên các nhánh main, 6.1, 6.0 và 5.2. Bản ghi chuẩn hóa chỉ thiết lập ranh giới affected cụ thể cho 5.2 và 6.0, nên không suy ra một bản phát hành cố định cụ thể cho main hoặc 6.1.

Chi tiết kỹ thuật

GeoDjango xử lý giá trị ở vế phải của spatial lookup bằng cách thử phân tích giá trị đó như một raster thông qua constructor django.contrib.gis.gdal.GDALRaster trước khi xử lý như hình học. Một dict, hoặc một str chứa biểu diễn JSON của dict, có thể khiến GDAL mở raster ở chế độ ghi dù constructor có mặc định write=False, từ đó cho phép ghi tệp với tên và nội dung do kẻ tấn công kiểm soát thông qua file-backed GDAL driver. Các str khác được xem là datasource và có thể kích hoạt yêu cầu mạng outbound thông qua GDAL virtual filesystem handler. Đường đi này áp dụng cho các giá trị được dùng trong spatial lookup đối với GeometryField hoặc RasterField, bao gồm dữ liệu không tin cậy từ bộ lọc trên Django admin changelist. Staff user có quyền xem mô hình đăng ký trong admin có thể khai thác đường đi này khi ứng dụng cho phép lọc trên trường spatial; chi tiết về GDAL driver, vị trí tệp đích, đích mạng và việc ứng dụng có nhập tệp đó sau này hay không phụ thuộc vào triển khai.

Khả năng khai thác

Lỗi có thể được tiếp cận qua mạng khi ứng dụng cung cấp spatial lookup, đặc biệt qua bộ lọc trên Django admin changelist. Điều kiện được ghi nhận là kẻ tấn công cần quyền thấp, với ví dụ cụ thể là staff user có quyền xem một mô hình đã đăng ký có trường spatial; không cần người dùng khác tương tác thêm sau khi truy vấn được gửi. Bản chất xử lý có độ phức tạp thấp vì giá trị do kẻ tấn công kiểm soát được chuyển trực tiếp vào đường phân tích raster. Bản ghi được cung cấp đánh dấu không có public exploit và không xác định trạng thái known exploited; điều này không chứng minh rằng chưa từng có khai thác trong thực tế.

Tác động kỹ thuật

Kết quả kỹ thuật trực tiếp là một giá trị spatial lookup do kẻ tấn công kiểm soát có thể khiến GDAL ghi tệp hoặc gửi yêu cầu mạng thay mặt cho tiến trình Django. Phạm vi ghi tệp bị giới hạn bởi khả năng của GDAL driver và quyền của tiến trình, nhưng tên và nội dung tệp có thể do kẻ tấn công lựa chọn trong đường đi bị ảnh hưởng. Yêu cầu mạng outbound có thể tạo SSRF và làm lộ khả năng kết nối từ máy chủ tới các dịch vụ nội bộ hoặc bên ngoài, tùy thuộc vào môi trường. Nếu tệp được ghi vào vị trí được ứng dụng tự động nạp hoặc thực thi, remote code execution là hậu quả có thể xảy ra, không phải kết quả được đảm bảo trong mọi triển khai. Việc khai thác cần quyền truy cập phù hợp vào endpoint hoặc admin lookup và không tự động vượt qua các giới hạn quyền của tiến trình.

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

Lỗi có thể làm thay đổi hoặc tạo tệp trên máy chủ với nội dung do người dùng có quyền thấp kiểm soát, ảnh hưởng đến tính toàn vẹn của hệ thống và dữ liệu ứng dụng. Nếu tệp được ghi vào vị trí sau đó được ứng dụng import hoặc thực thi, hậu quả có thể mở rộng thành remote code execution với quyền của tiến trình Django. Nhánh SSRF có thể khiến máy chủ gửi yêu cầu đến các đích mà người dùng bên ngoài không thể truy cập trực tiếp, tùy thuộc vào cấu hình mạng và GDAL virtual filesystem handler. Việc truy vấn hoặc ghi tệp bất thường cũng có thể làm gián đoạn dịch vụ nếu tác động đến tệp cấu hình, dữ liệu hoặc tài nguyên mà ứng dụng cần. Bản ghi không xác nhận một vụ xâm nhập, nạn nhân hay chiến dịch cụ thể.

Cách khắc phục

  1. Với nhánh Django 6.0, nâng cấp lên Django 6.0.8.
  2. Với nhánh Django 5.2, nâng cấp lên Django 5.2.17.
  3. Nếu đang chạy một series không còn được hỗ trợ, hãy coi series đó là có khả năng bị ảnh hưởng và chuyển sang một nhánh được hỗ trợ; bản ghi này không cung cấp ranh giới bản sửa lỗi cụ thể cho các series đó.
  4. Rà soát và xác thực mọi dữ liệu không tin cậy trước khi đưa vào spatial lookup. Không truyền trực tiếp dict, chuỗi JSON hoặc chuỗi tùy ý vào lookup. Nếu ứng dụng thực sự cần dùng một raster dạng này trong lookup, hãy tạo GDALRaster một cách có chủ đích sau khi đã kiểm soát và xác thực nguồn dữ liệu.
  5. Kiểm thử các custom lookup và chức năng admin sau khi cập nhật vì việc chặn các giá trị raster dạng chuỗi và dict là thay đổi không tương thích ngược. Việc gán các kiểu dữ liệu này vào model field là hành vi khác với spatial lookup và không phải là biện pháp khắc phục cho đường đi bị lỗi.

Cách phát hiện

  1. Kiểm kê phiên bản Django và xác định các triển khai sử dụng GeoDjango, đặc biệt các mô hình có GeometryField hoặc RasterField.
  2. Rà soát các mô hình được đăng ký trong Django admin và các changelist filter hoặc custom lookup cho phép staff user cung cấp giá trị spatial qua request.
  3. Tìm trong mã nguồn các đường đi truyền trực tiếp dict, chuỗi JSON hoặc chuỗi không tin cậy vào spatial lookup thay vì xác thực và chuyển đổi chúng trước.
  4. Sau khi cập nhật, kiểm thử các lookup với những kiểu dữ liệu này để xác nhận chúng bị từ chối trước khi tới GDALRaster; việc gán giá trị cho model field là đường đi khác và không nên được dùng làm bằng chứng rằng lookup đã an toàn.
  5. Có thể rà soát bổ sung hoạt động outbound network và tạo hoặc sửa tệp của tiến trình Django như biện pháp giám sát phòng ngừa. Đây là dấu hiệu cần điều tra, không phải IOC được xác nhận cho lỗi này.
Nguồn (24)
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.