Implement ns lookup allowlist (#1420)
The ns-lookup accepts domain names as well as suffixes, e.g.: ``` --allow-resolve=* # allow all domain names --allow-resolve=example.com # only allow example.com name resolution --allow-resolve=example.com --allow-resolve=*.example.com # allow example.com and its subdomains' name resolution ```
This commit is contained in:
@ -51,6 +51,8 @@ typedef struct WASIContext {
|
||||
struct fd_prestats *prestats;
|
||||
struct argv_environ_values *argv_environ;
|
||||
struct addr_pool *addr_pool;
|
||||
char *ns_lookup_buf;
|
||||
char **ns_lookup_list;
|
||||
char *argv_buf;
|
||||
char **argv_list;
|
||||
char *env_buf;
|
||||
@ -92,6 +94,14 @@ wasi_ctx_get_addr_pool(wasm_module_inst_t module_inst, wasi_ctx_t wasi_ctx)
|
||||
return wasi_ctx->addr_pool;
|
||||
}
|
||||
|
||||
static inline char **
|
||||
wasi_ctx_get_ns_lookup_list(wasi_ctx_t wasi_ctx)
|
||||
{
|
||||
if (!wasi_ctx)
|
||||
return NULL;
|
||||
return wasi_ctx->ns_lookup_list;
|
||||
}
|
||||
|
||||
static wasi_errno_t
|
||||
wasi_args_get(wasm_exec_env_t exec_env, uint32 *argv_offsets, char *argv_buf)
|
||||
{
|
||||
@ -1056,14 +1066,17 @@ wasi_sock_addr_resolve(wasm_exec_env_t exec_env, const char *host,
|
||||
wasm_module_inst_t module_inst = get_module_inst(exec_env);
|
||||
wasi_ctx_t wasi_ctx = get_wasi_ctx(module_inst);
|
||||
struct fd_table *curfds = NULL;
|
||||
char **ns_lookup_list = NULL;
|
||||
|
||||
if (!wasi_ctx)
|
||||
return __WASI_EACCES;
|
||||
|
||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||
ns_lookup_list = wasi_ctx_get_ns_lookup_list(wasi_ctx);
|
||||
|
||||
return wasi_ssp_sock_addr_resolve(curfds, host, service, hints, addr_info,
|
||||
addr_info_size, max_info_size);
|
||||
return wasi_ssp_sock_addr_resolve(curfds, ns_lookup_list, host, service,
|
||||
hints, addr_info, addr_info_size,
|
||||
max_info_size);
|
||||
}
|
||||
|
||||
static wasi_errno_t
|
||||
|
||||
@ -1038,7 +1038,7 @@ wasi_ssp_sock_bind(
|
||||
__wasi_errno_t
|
||||
wasi_ssp_sock_addr_resolve(
|
||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||
struct fd_table *curfds,
|
||||
struct fd_table *curfds, char **ns_lookup_list,
|
||||
#endif
|
||||
const char *host, const char* service,
|
||||
__wasi_addr_info_hints_t *hints, __wasi_addr_info_t *addr_info,
|
||||
|
||||
@ -161,6 +161,31 @@ convert_errno(int error)
|
||||
return errors[error];
|
||||
}
|
||||
|
||||
static bool
|
||||
ns_lookup_list_search(char **list, const char *host)
|
||||
{
|
||||
size_t host_len = strlen(host), suffix_len;
|
||||
|
||||
while (*list) {
|
||||
if (*list[0] == '*') {
|
||||
suffix_len = strlen(*list) - 1;
|
||||
if (suffix_len <= host_len
|
||||
&& strncmp(host + host_len - suffix_len, *list + 1, suffix_len)
|
||||
== 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (strcmp(*list, host) == 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
list++;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Converts a POSIX timespec to a CloudABI timestamp.
|
||||
static __wasi_timestamp_t
|
||||
convert_timespec(const struct timespec *ts)
|
||||
@ -3014,7 +3039,7 @@ wasi_ssp_sock_bind(
|
||||
__wasi_errno_t
|
||||
wasi_ssp_sock_addr_resolve(
|
||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
||||
struct fd_table *curfds,
|
||||
struct fd_table *curfds, char **ns_lookup_list,
|
||||
#endif
|
||||
const char *host, const char *service, __wasi_addr_info_hints_t *hints,
|
||||
__wasi_addr_info_t *addr_info, __wasi_size_t addr_info_size,
|
||||
@ -3027,6 +3052,10 @@ wasi_ssp_sock_addr_resolve(
|
||||
size_t _max_info_size;
|
||||
size_t actual_info_size;
|
||||
|
||||
if (!ns_lookup_list_search(ns_lookup_list, host)) {
|
||||
return __WASI_EACCES;
|
||||
}
|
||||
|
||||
if (!wamr_addr_info) {
|
||||
return __WASI_ENOMEM;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user