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

hyper-util: SOCKS5 connector sends a bracketed IPv6 literal as a domain name

Đang mở Phù hợp với người mới
#4,206 0 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 3 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
88/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ệ
rust
Lĩnh vực
networking

Hướng nghiên cứu

Bắt đầu tại src/client/legacy/connect/proxy/socks/v5/mod.rs và kiểm tra cách host đích được phân tích thành địa chỉ SOCKS5. Thực hiện một yêu cầu SocksV5 tới https://[::1]:443, sau đó xác minh rằng yêu cầu được mã hóa sử dụng ATYP 0x04 với 16 byte IPv6 thô, thay vì ATYP 0x03 với văn bản có dấu ngoặc vuông.

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

Mô tả

My Claude discovered this.

Fable:

Affects hyper-util 0.1.20 (src/client/legacy/connect/proxy/socks/v5/mod.rs), seen through reqwest 0.13.5 with a socks5:// proxy (local DNS mode).

What happens

reqwest resolves the target locally and builds the destination URI with the address; an IPv6 address is written in brackets, as a URI requires (https://[2606:4700::6810:102]:443). SocksV5 then takes dst.host(), which for an IPv6 authority still carries the brackets ([2606:4700::6810:102]), and does:

let address = match host.parse::<IpAddr>() {
    Ok(ip) => Address::Socket(SocketAddr::new(ip, port)),
    Err(_) => ... Address::Domain(host, port)

"[2606:4700::6810:102]".parse::<IpAddr>() fails, so the literal goes out as ATYP 0x03 (domain name) with the brackets in the string. A SOCKS5 server that joins host and port (tailscaled's does, with Go's net.JoinHostPort) ends up with [[2606:4700::6810:102]]:443 and fails with "missing port in address". IPv4 literals have no brackets, so they parse and go out as ATYP 0x01.

Fix

Strip the URI brackets before parsing the host as an IP address, so an IPv6 literal goes out as ATYP 0x04:

-        let address = match host.parse::<IpAddr>() {
+        let bare = host.strip_prefix('[').and_then(|h| h.strip_suffix(']')).unwrap_or(&host);
+        let address = match bare.parse::<IpAddr>() {
             Ok(ip) => Address::Socket(SocketAddr::new(ip, port)),

A test: a SocksV5 request to https://[::1]:443 must encode ATYP 0x04 with the 16 raw bytes, not ATYP 0x03 with the text [::1].

How it showed up

A Rust server fetching pages through a Tailscale exit node (tailscaled --socks5-server) with reqwest::Proxy::all("socks5://…") and a custom resolver: every host with an AAAA record failed with error sending request (cause: the proxy's "missing port in address"), and hosts with only A records worked. Ordering the resolver's answers IPv4-first works around it.

Ngôn ngữ chính
Rust
Star
16.3k
Fork
1.8k
Merge trung bình
2 ngày 5 giờ
Pull request đã merge (30 ngày)
12

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

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 hyperium/hyper

Tất cả issue của hyperium/hyper

Issue tương tự

Thêm issue về Rust

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.