Skip to content

Commit

Permalink
[Test] Bad boundary+FreemailCC
Browse files Browse the repository at this point in the history
  • Loading branch information
korgoth1 committed Sep 29, 2019
2 parents be0972d + 916a45c commit efce730
Show file tree
Hide file tree
Showing 21 changed files with 119 additions and 53 deletions.
3 changes: 2 additions & 1 deletion src/client/rspamc.c
Expand Up @@ -564,7 +564,8 @@ add_options (GQueue *opts)
if (ip != NULL) {
rspamd_inet_addr_t *addr = NULL;

if (!rspamd_parse_inet_address (&addr, ip, strlen (ip))) {
if (!rspamd_parse_inet_address (&addr, ip, strlen (ip),
RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
/* Try to resolve */
struct addrinfo hints, *res, *cur;
gint r;
Expand Down
6 changes: 4 additions & 2 deletions src/controller.c
Expand Up @@ -434,7 +434,8 @@ rspamd_controller_check_forwarded (struct rspamd_controller_session *session,
comma = hdr->begin;
}
if (rspamd_parse_inet_address (&addr, comma,
(hdr->begin + hdr->len) - comma)) {
(hdr->begin + hdr->len) - comma,
RSPAMD_INET_ADDRESS_PARSE_NO_UNIX)) {
/* We have addr now, so check if it is still trusted */
if (ctx->secure_map &&
rspamd_match_radix_map_addr (ctx->secure_map, addr) != NULL) {
Expand Down Expand Up @@ -463,7 +464,8 @@ rspamd_controller_check_forwarded (struct rspamd_controller_session *session,
hdr = rspamd_http_message_find_header (msg, alt_hdr_name);

if (hdr) {
if (rspamd_parse_inet_address (&addr, hdr->begin, hdr->len)) {
if (rspamd_parse_inet_address (&addr, hdr->begin, hdr->len,
RSPAMD_INET_ADDRESS_PARSE_NO_UNIX)) {
/* We have addr now, so check if it is still trusted */
if (ctx->secure_map &&
rspamd_match_radix_map_addr (ctx->secure_map, addr) != NULL) {
Expand Down
3 changes: 2 additions & 1 deletion src/libmime/message.c
Expand Up @@ -1287,7 +1287,8 @@ rspamd_message_parse (struct rspamd_task *task)
if (recv->real_ip) {
if (!rspamd_parse_inet_address (&task->from_addr,
recv->real_ip,
strlen (recv->real_ip))) {
strlen (recv->real_ip),
RSPAMD_INET_ADDRESS_PARSE_NO_UNIX)) {
msg_warn_task ("cannot get IP from received header: '%s'",
recv->real_ip);
task->from_addr = NULL;
Expand Down
17 changes: 12 additions & 5 deletions src/libmime/mime_headers.c
Expand Up @@ -32,6 +32,9 @@ struct rspamd_mime_headers_table {
ref_entry_t ref;
};

#define RSPAMD_INET_ADDRESS_PARSE_RECEIVED \
(RSPAMD_INET_ADDRESS_PARSE_REMOTE|RSPAMD_INET_ADDRESS_PARSE_NO_UNIX)

static void
rspamd_mime_header_check_special (struct rspamd_task *task,
struct rspamd_mime_header *rh)
Expand Down Expand Up @@ -1320,7 +1323,8 @@ rspamd_smtp_received_process_host_tcpinfo (struct rspamd_task *task,
if (brace_pos) {
addr = rspamd_parse_inet_address_pool (data + 1,
brace_pos - data - 1,
task->task_pool);
task->task_pool,
RSPAMD_INET_ADDRESS_PARSE_RECEIVED);

if (addr) {
rh->addr = addr;
Expand All @@ -1334,7 +1338,7 @@ rspamd_smtp_received_process_host_tcpinfo (struct rspamd_task *task,
if (g_ascii_isxdigit (data[0])) {
/* Try to parse IP address */
addr = rspamd_parse_inet_address_pool (data,
len, task->task_pool);
len, task->task_pool, RSPAMD_INET_ADDRESS_PARSE_RECEIVED);
if (addr) {
rh->addr = addr;
rh->real_ip = rspamd_mempool_strdup (task->task_pool,
Expand All @@ -1355,7 +1359,8 @@ rspamd_smtp_received_process_host_tcpinfo (struct rspamd_task *task,
if (ebrace_pos) {
addr = rspamd_parse_inet_address_pool (obrace_pos + 1,
ebrace_pos - obrace_pos - 1,
task->task_pool);
task->task_pool,
RSPAMD_INET_ADDRESS_PARSE_RECEIVED);

if (addr) {
rh->addr = addr;
Expand Down Expand Up @@ -1420,7 +1425,8 @@ rspamd_smtp_received_process_from (struct rspamd_task *task,
if (brace_pos) {
addr = rspamd_parse_inet_address_pool (rpart->data + 1,
brace_pos - rpart->data - 1,
task->task_pool);
task->task_pool,
RSPAMD_INET_ADDRESS_PARSE_RECEIVED);

if (addr) {
seen_ip_in_data = TRUE;
Expand All @@ -1434,7 +1440,8 @@ rspamd_smtp_received_process_from (struct rspamd_task *task,
/* Try to parse IP address */
rspamd_inet_addr_t *addr;
addr = rspamd_parse_inet_address_pool (rpart->data,
rpart->dlen, task->task_pool);
rpart->dlen, task->task_pool,
RSPAMD_INET_ADDRESS_PARSE_RECEIVED);
if (addr) {
seen_ip_in_data = TRUE;
rh->addr = addr;
Expand Down
6 changes: 4 additions & 2 deletions src/libserver/cfg_rcl.c
Expand Up @@ -3254,13 +3254,15 @@ rspamd_rcl_parse_struct_addr (rspamd_mempool_t *pool,
struct rspamd_rcl_struct_parser *pd = ud;
rspamd_inet_addr_t **target;
const gchar *val;
gsize size;

target = (rspamd_inet_addr_t **)(((gchar *)pd->user_struct) + pd->offset);

if (ucl_object_type (obj) == UCL_STRING) {
val = ucl_object_tostring (obj);
val = ucl_object_tolstring (obj, &size);

if (!rspamd_parse_inet_address (target, val, strlen (val))) {
if (!rspamd_parse_inet_address (target, val, size,
RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
g_set_error (err,
CFG_RCL_ERROR,
EINVAL,
Expand Down
3 changes: 2 additions & 1 deletion src/libserver/dns.c
Expand Up @@ -300,7 +300,8 @@ rspamd_dns_resolv_conf_on_server (struct rdns_resolver *resolver,
msg_info_config ("parsed nameserver %s from resolv.conf", name);

/* Try to open a connection */
if (!rspamd_parse_inet_address (&addr, name, strlen (name))) {
if (!rspamd_parse_inet_address (&addr, name, strlen (name),
RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
msg_warn_config ("cannot parse nameserver address %s", name);

return FALSE;
Expand Down
3 changes: 2 additions & 1 deletion src/libserver/protocol.c
Expand Up @@ -545,7 +545,8 @@ rspamd_protocol_handle_headers (struct rspamd_task *task,
case 'I':
IF_HEADER (IP_ADDR_HEADER) {
if (!rspamd_parse_inet_address (&task->from_addr,
hv_tok->begin, hv_tok->len)) {
hv_tok->begin, hv_tok->len,
RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
msg_err_protocol ("bad ip header: '%T'", hv_tok);
}
else {
Expand Down
67 changes: 46 additions & 21 deletions src/libutil/addr.c
Expand Up @@ -315,8 +315,10 @@ rspamd_accept_from_socket (gint sock, rspamd_inet_addr_t **target,
}

static gboolean
rspamd_parse_unix_path (rspamd_inet_addr_t **target, const char *src,
rspamd_mempool_t *pool)
rspamd_parse_unix_path (rspamd_inet_addr_t **target,
const char *src, gsize len,
rspamd_mempool_t *pool,
enum rspamd_inet_address_parse_flags how)
{
gchar **tokens, **cur_tok, *p, *pwbuf;
glong pwlen;
Expand All @@ -325,19 +327,35 @@ rspamd_parse_unix_path (rspamd_inet_addr_t **target, const char *src,
rspamd_inet_addr_t *addr;
bool has_group = false;

tokens = g_strsplit_set (src, " ,", -1);
addr = rspamd_inet_addr_create (AF_UNIX, pool);

rspamd_strlcpy (addr->u.un->addr.sun_path, tokens[0],
sizeof (addr->u.un->addr.sun_path));
#if defined(FREEBSD) || defined(__APPLE__)
addr->u.un->addr.sun_len = SUN_LEN (&addr->u.un->addr);
#endif

addr->u.un->mode = 00644;
addr->u.un->owner = (uid_t)-1;
addr->u.un->group = (gid_t)-1;

if (!(how & RSPAMD_INET_ADDRESS_PARSE_REMOTE)) {
tokens = rspamd_string_len_split (src, len, " ,", -1, pool);

if (tokens[0] == NULL) {
return FALSE;
}

rspamd_strlcpy (addr->u.un->addr.sun_path, tokens[0],
sizeof (addr->u.un->addr.sun_path));
#if defined(FREEBSD) || defined(__APPLE__)
addr->u.un->addr.sun_len = SUN_LEN (&addr->u.un->addr);
#endif
}
else {
rspamd_strlcpy (addr->u.un->addr.sun_path, src,
MIN (len + 1, sizeof (addr->u.un->addr.sun_path)));
#if defined(FREEBSD) || defined(__APPLE__)
addr->u.un->addr.sun_len = SUN_LEN (&addr->u.un->addr);
#endif
return TRUE;
}

/* Skip for remote */
cur_tok = &tokens[1];
#ifdef _SC_GETPW_R_SIZE_MAX
pwlen = sysconf (_SC_GETPW_R_SIZE_MAX);
Expand Down Expand Up @@ -679,12 +697,13 @@ static gboolean
rspamd_parse_inet_address_common (rspamd_inet_addr_t **target,
const char *src,
gsize srclen,
rspamd_mempool_t *pool)
rspamd_mempool_t *pool,
enum rspamd_inet_address_parse_flags how)
{
gboolean ret = FALSE;
rspamd_inet_addr_t *addr = NULL;
union sa_inet su;
const char *end;
const char *end = NULL;
char ipbuf[INET6_ADDRSTRLEN + 1];
guint iplen;
gulong portnum;
Expand All @@ -698,8 +717,9 @@ rspamd_parse_inet_address_common (rspamd_inet_addr_t **target,

rspamd_ip_check_ipv6 ();

if (src[0] == '/' || src[0] == '.') {
return rspamd_parse_unix_path (target, src, pool);
if (!(how & RSPAMD_INET_ADDRESS_PARSE_NO_UNIX) &&
(src[0] == '/' || src[0] == '.')) {
return rspamd_parse_unix_path (target, src, srclen, pool, how);
}

if (src[0] == '[') {
Expand All @@ -726,15 +746,16 @@ rspamd_parse_inet_address_common (rspamd_inet_addr_t **target,
ret = TRUE;
}

if (ret && end[1] == ':') {
if (!(how & RSPAMD_INET_ADDRESS_PARSE_NO_PORT) && ret && end[1] == ':') {
/* Port part */
rspamd_strtoul (end + 1, srclen - iplen - 3, &portnum);
rspamd_inet_address_set_port (addr, portnum);
}
}
else {

if ((end = memchr (src, ':', srclen)) != NULL) {
if (!(how & RSPAMD_INET_ADDRESS_PARSE_NO_PORT) &&
(end = memchr (src, ':', srclen)) != NULL) {
/* This is either port number and ipv4 addr or ipv6 addr */
/* Search for another semicolon */
if (memchr (end + 1, ':', srclen - (end - src + 1)) &&
Expand Down Expand Up @@ -789,19 +810,21 @@ rspamd_parse_inet_address_common (rspamd_inet_addr_t **target,
gboolean
rspamd_parse_inet_address (rspamd_inet_addr_t **target,
const char *src,
gsize srclen)
gsize srclen,
enum rspamd_inet_address_parse_flags how)
{
return rspamd_parse_inet_address_common (target, src, srclen, NULL);
return rspamd_parse_inet_address_common (target, src, srclen, NULL, how);
}

rspamd_inet_addr_t *
rspamd_parse_inet_address_pool (const char *src,
gsize srclen,
rspamd_mempool_t *pool)
rspamd_mempool_t *pool,
enum rspamd_inet_address_parse_flags how)
{
rspamd_inet_addr_t *ret = NULL;

if (!rspamd_parse_inet_address_common (&ret, src, srclen, pool)) {
if (!rspamd_parse_inet_address_common (&ret, src, srclen, pool, how)) {
return NULL;
}

Expand Down Expand Up @@ -1224,7 +1247,8 @@ rspamd_resolve_addrs (const char *begin, size_t len, GPtrArray **addrs,

rspamd_ip_check_ipv6 ();

if (rspamd_parse_inet_address (&cur_addr, begin, len)) {
if (rspamd_parse_inet_address (&cur_addr,
begin, len, RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
if (*addrs == NULL) {
*addrs = g_ptr_array_new_full (1,
(GDestroyNotify) rspamd_inet_address_free);
Expand Down Expand Up @@ -1387,7 +1411,8 @@ rspamd_parse_host_port_priority (const gchar *str,
}
}

if (!rspamd_parse_inet_address (&cur_addr, str, strlen (str))) {
if (!rspamd_parse_inet_address (&cur_addr,
str, strlen (str), RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
msg_err_pool_check ("cannot parse unix socket definition %s: %s",
str,
strerror (errno));
Expand Down
16 changes: 13 additions & 3 deletions src/libutil/addr.h
Expand Up @@ -86,6 +86,13 @@ rspamd_inet_addr_t *rspamd_inet_address_from_rnds (
gboolean rspamd_parse_inet_address_ip6 (const guchar *text, gsize len,
gpointer target);

enum rspamd_inet_address_parse_flags {
RSPAMD_INET_ADDRESS_PARSE_DEFAULT = 0,
RSPAMD_INET_ADDRESS_PARSE_REMOTE = 1u << 0u,
RSPAMD_INET_ADDRESS_PARSE_NO_UNIX = 1u << 1u,
RSPAMD_INET_ADDRESS_PARSE_NO_PORT = 1u << 2u,
};

/**
* Parse string with ipv4 address of length `len` to `target` which should be
* at least sizeof (in4_addr_t)
Expand All @@ -105,7 +112,8 @@ gboolean rspamd_parse_inet_address_ip4 (const guchar *text, gsize len,
* @return
*/
gboolean rspamd_parse_inet_address_ip (const char *src,
gsize srclen, rspamd_inet_addr_t *target);
gsize srclen,
rspamd_inet_addr_t *target);

/**
* Try to parse address from string
Expand All @@ -115,7 +123,8 @@ gboolean rspamd_parse_inet_address_ip (const char *src,
*/
gboolean rspamd_parse_inet_address (rspamd_inet_addr_t **target,
const char *src,
gsize srclen);
gsize srclen,
enum rspamd_inet_address_parse_flags how);

/**
* Use memory pool allocated inet address
Expand All @@ -126,7 +135,8 @@ gboolean rspamd_parse_inet_address (rspamd_inet_addr_t **target,
*/
rspamd_inet_addr_t *rspamd_parse_inet_address_pool (const char *src,
gsize srclen,
rspamd_mempool_t *pool);
rspamd_mempool_t *pool,
enum rspamd_inet_address_parse_flags how);

/**
* Returns string representation of inet address
Expand Down
3 changes: 2 additions & 1 deletion src/libutil/map.c
Expand Up @@ -1469,7 +1469,8 @@ rspamd_map_common_http_callback (struct rspamd_map *map,
/* Try address */
rspamd_inet_addr_t *addr = NULL;

if (rspamd_parse_inet_address (&addr, data->host, strlen (data->host))) {
if (rspamd_parse_inet_address (&addr, data->host,
strlen (data->host), RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
rspamd_inet_address_set_port (addr, cbd->data->port);
g_ptr_array_add (cbd->addrs, (void *)addr);
cbd->conn = rspamd_http_connection_new_client (
Expand Down
3 changes: 2 additions & 1 deletion src/libutil/upstream.c
Expand Up @@ -788,7 +788,8 @@ rspamd_upstreams_add_upstream (struct upstream_list *ups, const gchar *str,
break;
case RSPAMD_UPSTREAM_PARSE_NAMESERVER:
addrs = g_ptr_array_sized_new (1);
if (rspamd_parse_inet_address (&addr, str, strlen (str))) {
if (rspamd_parse_inet_address (&addr, str, strlen (str),
RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
if (ups->ctx) {
upstream->name = rspamd_mempool_strdup (ups->ctx->pool, str);
}
Expand Down
3 changes: 2 additions & 1 deletion src/lua/lua_http.c
Expand Up @@ -984,7 +984,8 @@ lua_http_request (lua_State *L)
cbd->session = session;
}

if (rspamd_parse_inet_address (&cbd->addr, msg->host->str, msg->host->len)) {
if (rspamd_parse_inet_address (&cbd->addr,
msg->host->str, msg->host->len, RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
/* Host is numeric IP, no need to resolve */
gboolean ret;

Expand Down
6 changes: 4 additions & 2 deletions src/lua/lua_ip.c
Expand Up @@ -375,7 +375,8 @@ lua_ip_from_string (lua_State *L)
if (ip_str) {
ip = lua_ip_new (L, NULL);

if (!rspamd_parse_inet_address (&ip->addr, ip_str, len)) {
if (!rspamd_parse_inet_address (&ip->addr,
ip_str, len, RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
msg_warn ("cannot parse ip: %*s", (gint) len, ip_str);
ip->addr = NULL;
}
Expand Down Expand Up @@ -560,7 +561,8 @@ rspamd_lua_ip_push_fromstring (lua_State *L, const gchar *ip_str)
else {
ip = g_malloc0 (sizeof (struct rspamd_lua_ip));

if (rspamd_parse_inet_address (&ip->addr, ip_str, strlen (ip_str))) {
if (rspamd_parse_inet_address (&ip->addr,
ip_str, strlen (ip_str), RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {

pip = lua_newuserdata (L, sizeof (struct rspamd_lua_ip *));
rspamd_lua_setclass (L, "rspamd{ip}", -1);
Expand Down
6 changes: 4 additions & 2 deletions src/lua/lua_redis.c
Expand Up @@ -896,7 +896,8 @@ rspamd_lua_redis_prepare_connection (lua_State *L, gint *pcbref, gboolean is_asy
else if (lua_type (L, -1) == LUA_TSTRING) {
host = lua_tostring (L, -1);

if (rspamd_parse_inet_address (&ip, host, strlen (host))) {
if (rspamd_parse_inet_address (&ip,
host, strlen (host), RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
addr = g_alloca (sizeof (*addr));
addr->addr = ip;

Expand Down Expand Up @@ -1165,7 +1166,8 @@ lua_redis_make_request_sync (lua_State *L)
}
else if (lua_type (L, -1) == LUA_TSTRING) {
host = lua_tostring (L, -1);
if (rspamd_parse_inet_address (&ip, host, strlen (host))) {
if (rspamd_parse_inet_address (&ip,
host, strlen (host), RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
addr = g_alloca (sizeof (*addr));
addr->addr = ip;

Expand Down

0 comments on commit efce730

Please sign in to comment.