Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

[Bug] raw-API DHCP server reads client option values without bounds checks (OOB read)

Đang mở Phù hợp với người mới
#11,913 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
78/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
c
Lĩnh vực
networking, security

Hướng nghiên cứu

Đọc components/net/lwip-dhcpd/dhcp_server_raw.c, bắt đầu với dhcp_server_option_find và các hàm gọi nó tại những dòng được trích dẫn; so sánh các bước kiểm tra của chúng với dhcp_server.c sử dụng socket. Xác minh giới hạn của header tùy chọn và độ dài giá trị được khai báo trước khi đọc, sau đó xác nhận rằng các tùy chọn bị cắt cụt sẽ bị từ chối và các tùy chọn DHCP hợp lệ vẫn được xử lý chính xác.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

bug Component component: net
RT-Thread Version

master @ 1c801efabc.

Affected area

Networking

Hardware/BSP vendor

Not applicable / Other

Architecture

Not applicable / Other

Board and hardware details

Not applicable.

Develop Toolchain

GCC

Describe the bug

The raw-API DHCP server parses client packets without bounding the option walk or the option-value reads.

components/net/lwip-dhcpd/dhcp_server_raw.c:296:

static u8_t *dhcp_server_option_find(u8_t *buf, u16_t len, u8_t option) {
    u8_t *end = buf + len;
    while ((buf < end) && (*buf != DHCP_OPTION_END)) {
        if (*buf == option) return buf;
        buf += (buf[1] + 2);        /* buf[1] read even when buf == end-1 */
    }
    return NULL;
}

buf[1] is read without verifying buf + 1 < end, so a final option header at end-1 reads one byte past the buffer. The function also only guarantees the returned pointer is < end, and the callers read the value with no length check:

node = dhcp_client_find_by_ip(dhcpserver, (ip4_addr_t *)(&opt[2]));  /* :209, reads 4 bytes */
msg_type = *(opt + 2);                                               /* :372 */

A REQUESTED_IP (50) or MESSAGE_TYPE (53) option placed at the tail lets opt[2]..opt[5] read up to 4 bytes past the buffer. The packet buffer is a fixed pbuf_alloc(PBUF_TRANSPORT, 1500, PBUF_RAM) (:331), so the over-reads land just past that heap allocation.

The sibling socket-based server dhcp_server.c performs exactly the checks this file omits (dhcp_opt + 2 > dhcp_opt_end, declared-length validation, length < 4 / length < 1), which confirms the raw variant is missing them.

Steps / trigger. Any host on the same L2 segment sends a DHCP packet to UDP/67 whose option area ends with a REQUESTED_IP / MESSAGE_TYPE option header positioned so its value bytes fall at or past the buffer end. No authentication. Reproduced at logic level under ASan (reports/repro/dhcpd-raw/).

Expected. Short or truncated options are rejected before their length/value bytes are read, as dhcp_server.c already does.

Actual. Out-of-bounds read of a few bytes past the 1500-byte heap allocation. The values are used only for dispatch / IP comparison and are not returned to the attacker, so the practical impact is a crash / DoS if the allocation abuts an unmapped page.

Suggested fix. Port the socket variant's checks: require buf + 1 < end before reading buf[1] and buf + 2 + buf[1] <= end before advancing; in each caller verify the matched option's declared length and that opt + 2 + opt[1] <= end before reading the value.

Other additional context

No response

Ngôn ngữ chính
C
Star
12.3k
Fork
5.5k
Merge trung bình
7 ngày 22 giờ
Pull request đã merge (30 ngày)
30

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của RT-Thread/rt-thread

Tất cả issue của RT-Thread/rt-thread

Issue tương tự

Thêm issue về C

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.