From afaf598378b7c5ebe22e794ab89801006550df1f Mon Sep 17 00:00:00 2001 From: Hassan Raza Date: Sun, 27 Sep 2026 23:56:46 +0500 Subject: [PATCH 1/2] Read SOCKS5 UDP hostname lengths as unsigned --- src/socks_server.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/socks_server.cpp b/src/socks_server.cpp index e0083ad..d44bbb7 100644 --- a/src/socks_server.cpp +++ b/src/socks_server.cpp @@ -620,7 +620,7 @@ namespace sim if (atyp == 3) { // hostname - int const len = buf[4]; + int const len = static_cast(buf[4]); buf += 5; bytes_transferred -= 5; From 29e52057dde0c6215f209340d8ab8f2d6d5bfeec Mon Sep 17 00:00:00 2001 From: Hassan Raza Date: Sun, 27 Sep 2026 23:56:46 +0500 Subject: [PATCH 2/2] Configure SOCKS5 UDP response headers --- include/simulator/socks_server.hpp | 14 ++++++++++++-- src/socks_server.cpp | 27 +++++++++++++++++---------- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/include/simulator/socks_server.hpp b/include/simulator/socks_server.hpp index fb37397..15968c7 100644 --- a/include/simulator/socks_server.hpp +++ b/include/simulator/socks_server.hpp @@ -54,10 +54,18 @@ enum socks_flag udp_associate_respond_empty_hostname = 2 }; +// Override UDP response fields to simulate malformed proxy replies. +struct socks_udp_header +{ + std::uint16_t reserved = 0; + // A negative value preserves the address type of the forwarded packet. + int address_type = -1; +}; + struct SIMULATOR_DECL socks_connection : std::enable_shared_from_this { socks_connection(asio::io_context& ios, int version, std::array& cmd_counts - , std::uint32_t flags, int& bind_port); + , std::uint32_t flags, int& bind_port, socks_udp_header header); asio::ip::tcp::socket& socket() { return m_client_connection; } @@ -149,6 +157,7 @@ struct SIMULATOR_DECL socks_connection : std::enable_shared_from_this& m_cmd_counts; std::uint32_t const m_flags; + socks_udp_header const m_udp_header; }; // This is a very simple socks4 and 5 server that only supports a single @@ -156,7 +165,7 @@ struct SIMULATOR_DECL socks_connection : std::enable_shared_from_this m_cmd_counts; std::uint32_t const m_flags; + socks_udp_header const m_udp_header; }; } diff --git a/src/socks_server.cpp b/src/socks_server.cpp index d44bbb7..b9ef83d 100644 --- a/src/socks_server.cpp +++ b/src/socks_server.cpp @@ -34,12 +34,14 @@ namespace sim using namespace aux; socks_server::socks_server(io_context& ios, unsigned short listen_port, int version - , std::uint32_t const flags) + , std::uint32_t const flags, socks_udp_header const header) : m_ios(ios) , m_listen_socket(ios) - , m_conn(std::make_shared(m_ios, version, m_cmd_counts, flags, m_bind_port)) + , m_conn(std::make_shared( + m_ios, version, m_cmd_counts, flags, m_bind_port, header)) , m_version(version) , m_flags(flags) + , m_udp_header(header) { m_cmd_counts.fill(0); address local_ip = ios.get_ips().front(); @@ -77,7 +79,8 @@ namespace sim m_conn->start(); // create a new connection to accept into - m_conn = std::make_shared(m_ios, m_version, m_cmd_counts, m_flags, m_bind_port); + m_conn = std::make_shared( + m_ios, m_version, m_cmd_counts, m_flags, m_bind_port, m_udp_header); // now we can accept another connection m_listen_socket.async_accept(m_conn->socket(), m_ep @@ -91,7 +94,8 @@ namespace sim } socks_connection::socks_connection(asio::io_context& ios - , int version, std::array& cmd_counts, std::uint32_t const flags, int& bind_port) + , int version, std::array& cmd_counts, std::uint32_t const flags + , int& bind_port, socks_udp_header const header) : m_bind_port(bind_port) , m_ios(ios) , m_udp_resolver(ios) @@ -106,6 +110,7 @@ namespace sim , m_command(0) , m_cmd_counts(cmd_counts) , m_flags(flags) + , m_udp_header(header) { } @@ -708,10 +713,11 @@ namespace sim if (it != m_name_mapping.left.end()) { std::vector header(7 + it->second.size()); - header[0] = 0; // RSV - header[1] = 0; + header[0] = static_cast(m_udp_header.reserved >> 8); // RSV + header[1] = static_cast(m_udp_header.reserved & 0xff); header[2] = 0; // fragment - header[3] = 3; // ATYP + header[3] = static_cast( + m_udp_header.address_type < 0 ? 3 : m_udp_header.address_type); // ATYP header[4] = static_cast(it->second.size()); int idx = 5; std::copy(it->second.begin(), it->second.end(), header.data() + idx); @@ -732,10 +738,11 @@ namespace sim // add UDP ASSOCIATE header and forward to client std::uint32_t const from_addr = m_udp_from.address().to_v4().to_uint(); std::array header; - header[0] = 0; // RSV - header[1] = 0; + header[0] = static_cast(m_udp_header.reserved >> 8); // RSV + header[1] = static_cast(m_udp_header.reserved & 0xff); header[2] = 0; // fragment - header[3] = 1; // ATYP + header[3] = static_cast( + m_udp_header.address_type < 0 ? 1 : m_udp_header.address_type); // ATYP header[4] = (from_addr >> 24) & 0xff; // Address header[5] = (from_addr >> 16) & 0xff; header[6] = (from_addr >> 8) & 0xff;