Plug some networking sysctl leaks.
Various network protocol sysctl handlers were not zero-filling their output buffers and thus would export uninitialized stack memory to userland. Fix a number of such handlers. Reported by: Thomas Barabosch, Fraunhofer FKIE Reviewed by: tuexen MFC after: 3 days Security: kernel memory disclosure Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D18301
This commit is contained in:
parent
ad2be38941
commit
79db6fe7aa
@ -4007,6 +4007,7 @@ void
|
|||||||
sotoxsocket(struct socket *so, struct xsocket *xso)
|
sotoxsocket(struct socket *so, struct xsocket *xso)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
bzero(xso, sizeof(*xso));
|
||||||
xso->xso_len = sizeof *xso;
|
xso->xso_len = sizeof *xso;
|
||||||
xso->xso_so = (uintptr_t)so;
|
xso->xso_so = (uintptr_t)so;
|
||||||
xso->so_type = so->so_type;
|
xso->so_type = so->so_type;
|
||||||
@ -4025,8 +4026,6 @@ sotoxsocket(struct socket *so, struct xsocket *xso)
|
|||||||
xso->so_incqlen = so->sol_incqlen;
|
xso->so_incqlen = so->sol_incqlen;
|
||||||
xso->so_qlimit = so->sol_qlimit;
|
xso->so_qlimit = so->sol_qlimit;
|
||||||
xso->so_oobmark = 0;
|
xso->so_oobmark = 0;
|
||||||
bzero(&xso->so_snd, sizeof(xso->so_snd));
|
|
||||||
bzero(&xso->so_rcv, sizeof(xso->so_rcv));
|
|
||||||
} else {
|
} else {
|
||||||
xso->so_state |= so->so_qstate;
|
xso->so_state |= so->so_qstate;
|
||||||
xso->so_qlen = xso->so_incqlen = xso->so_qlimit = 0;
|
xso->so_qlen = xso->so_incqlen = xso->so_qlimit = 0;
|
||||||
|
@ -1809,7 +1809,7 @@ unp_pcblist(SYSCTL_HANDLER_ARGS)
|
|||||||
/*
|
/*
|
||||||
* OK, now we're committed to doing something.
|
* OK, now we're committed to doing something.
|
||||||
*/
|
*/
|
||||||
xug = malloc(sizeof(*xug), M_TEMP, M_WAITOK);
|
xug = malloc(sizeof(*xug), M_TEMP, M_WAITOK | M_ZERO);
|
||||||
UNP_LINK_RLOCK();
|
UNP_LINK_RLOCK();
|
||||||
gencnt = unp_gencnt;
|
gencnt = unp_gencnt;
|
||||||
n = unp_count;
|
n = unp_count;
|
||||||
|
@ -2883,11 +2883,10 @@ void
|
|||||||
in_pcbtoxinpcb(const struct inpcb *inp, struct xinpcb *xi)
|
in_pcbtoxinpcb(const struct inpcb *inp, struct xinpcb *xi)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
bzero(xi, sizeof(*xi));
|
||||||
xi->xi_len = sizeof(struct xinpcb);
|
xi->xi_len = sizeof(struct xinpcb);
|
||||||
if (inp->inp_socket)
|
if (inp->inp_socket)
|
||||||
sotoxsocket(inp->inp_socket, &xi->xi_socket);
|
sotoxsocket(inp->inp_socket, &xi->xi_socket);
|
||||||
else
|
|
||||||
bzero(&xi->xi_socket, sizeof(struct xsocket));
|
|
||||||
bcopy(&inp->inp_inc, &xi->inp_inc, sizeof(struct in_conninfo));
|
bcopy(&inp->inp_inc, &xi->inp_inc, sizeof(struct in_conninfo));
|
||||||
xi->inp_gencnt = inp->inp_gencnt;
|
xi->inp_gencnt = inp->inp_gencnt;
|
||||||
xi->inp_ppcb = (uintptr_t)inp->inp_ppcb;
|
xi->inp_ppcb = (uintptr_t)inp->inp_ppcb;
|
||||||
|
@ -664,6 +664,7 @@ div_pcblist(SYSCTL_HANDLER_ARGS)
|
|||||||
if (error != 0)
|
if (error != 0)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
|
bzero(&xig, sizeof(xig));
|
||||||
xig.xig_len = sizeof xig;
|
xig.xig_len = sizeof xig;
|
||||||
xig.xig_count = n;
|
xig.xig_count = n;
|
||||||
xig.xig_gen = gencnt;
|
xig.xig_gen = gencnt;
|
||||||
|
@ -1060,6 +1060,7 @@ rip_pcblist(SYSCTL_HANDLER_ARGS)
|
|||||||
n = V_ripcbinfo.ipi_count;
|
n = V_ripcbinfo.ipi_count;
|
||||||
INP_INFO_WUNLOCK(&V_ripcbinfo);
|
INP_INFO_WUNLOCK(&V_ripcbinfo);
|
||||||
|
|
||||||
|
bzero(&xig, sizeof(xig));
|
||||||
xig.xig_len = sizeof xig;
|
xig.xig_len = sizeof xig;
|
||||||
xig.xig_count = n;
|
xig.xig_count = n;
|
||||||
xig.xig_gen = gencnt;
|
xig.xig_gen = gencnt;
|
||||||
|
@ -395,6 +395,9 @@ sctp_sysctl_handle_assoclist(SYSCTL_HANDLER_ARGS)
|
|||||||
SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_SYSCTL, EPERM);
|
SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_SYSCTL, EPERM);
|
||||||
return (EPERM);
|
return (EPERM);
|
||||||
}
|
}
|
||||||
|
memset(&xinpcb, 0, sizeof(xinpcb));
|
||||||
|
memset(&xstcb, 0, sizeof(xstcb));
|
||||||
|
memset(&xraddr, 0, sizeof(xraddr));
|
||||||
LIST_FOREACH(inp, &SCTP_BASE_INFO(listhead), sctp_list) {
|
LIST_FOREACH(inp, &SCTP_BASE_INFO(listhead), sctp_list) {
|
||||||
SCTP_INP_RLOCK(inp);
|
SCTP_INP_RLOCK(inp);
|
||||||
if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) {
|
if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) {
|
||||||
|
@ -556,6 +556,7 @@ sysctl_net_inet_list_func_info(SYSCTL_HANDLER_ARGS)
|
|||||||
cnt++;
|
cnt++;
|
||||||
#endif
|
#endif
|
||||||
if (req->oldptr != NULL) {
|
if (req->oldptr != NULL) {
|
||||||
|
bzero(&tfi, sizeof(tfi));
|
||||||
tfi.tfi_refcnt = f->tf_fb->tfb_refcnt;
|
tfi.tfi_refcnt = f->tf_fb->tfb_refcnt;
|
||||||
tfi.tfi_id = f->tf_fb->tfb_id;
|
tfi.tfi_id = f->tf_fb->tfb_id;
|
||||||
(void)strncpy(tfi.tfi_alias, f->tf_name,
|
(void)strncpy(tfi.tfi_alias, f->tf_name,
|
||||||
@ -2154,6 +2155,7 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
|
|||||||
if (error != 0)
|
if (error != 0)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
|
bzero(&xig, sizeof(xig));
|
||||||
xig.xig_len = sizeof xig;
|
xig.xig_len = sizeof xig;
|
||||||
xig.xig_count = n + m;
|
xig.xig_count = n + m;
|
||||||
xig.xig_gen = gencnt;
|
xig.xig_gen = gencnt;
|
||||||
@ -3215,8 +3217,8 @@ tcp_inptoxtp(const struct inpcb *inp, struct xtcpcb *xt)
|
|||||||
struct tcpcb *tp = intotcpcb(inp);
|
struct tcpcb *tp = intotcpcb(inp);
|
||||||
sbintime_t now;
|
sbintime_t now;
|
||||||
|
|
||||||
|
bzero(xt, sizeof(*xt));
|
||||||
if (inp->inp_flags & INP_TIMEWAIT) {
|
if (inp->inp_flags & INP_TIMEWAIT) {
|
||||||
bzero(xt, sizeof(struct xtcpcb));
|
|
||||||
xt->t_state = TCPS_TIME_WAIT;
|
xt->t_state = TCPS_TIME_WAIT;
|
||||||
} else {
|
} else {
|
||||||
xt->t_state = tp->t_state;
|
xt->t_state = tp->t_state;
|
||||||
@ -3244,7 +3246,6 @@ tcp_inptoxtp(const struct inpcb *inp, struct xtcpcb *xt)
|
|||||||
|
|
||||||
bcopy(tp->t_fb->tfb_tcp_block_name, xt->xt_stack,
|
bcopy(tp->t_fb->tfb_tcp_block_name, xt->xt_stack,
|
||||||
TCP_FUNCTION_NAME_LEN_MAX);
|
TCP_FUNCTION_NAME_LEN_MAX);
|
||||||
bzero(xt->xt_logid, TCP_LOG_ID_LEN);
|
|
||||||
#ifdef TCP_BLACKBOX
|
#ifdef TCP_BLACKBOX
|
||||||
(void)tcp_log_get_id(tp, xt->xt_logid);
|
(void)tcp_log_get_id(tp, xt->xt_logid);
|
||||||
#endif
|
#endif
|
||||||
|
@ -887,6 +887,7 @@ udp_pcblist(SYSCTL_HANDLER_ARGS)
|
|||||||
if (error != 0)
|
if (error != 0)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
|
bzero(&xig, sizeof(xig));
|
||||||
xig.xig_len = sizeof xig;
|
xig.xig_len = sizeof xig;
|
||||||
xig.xig_count = n;
|
xig.xig_count = n;
|
||||||
xig.xig_gen = gencnt;
|
xig.xig_gen = gencnt;
|
||||||
|
@ -203,7 +203,8 @@ sysctl_mif6table(SYSCTL_HANDLER_ARGS)
|
|||||||
struct mif6_sctl *out;
|
struct mif6_sctl *out;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
out = malloc(sizeof(struct mif6_sctl) * MAXMIFS, M_TEMP, M_WAITOK);
|
out = malloc(sizeof(struct mif6_sctl) * MAXMIFS, M_TEMP,
|
||||||
|
M_WAITOK | M_ZERO);
|
||||||
for (int i = 0; i < MAXMIFS; i++) {
|
for (int i = 0; i < MAXMIFS; i++) {
|
||||||
out[i].m6_flags = mif6table[i].m6_flags;
|
out[i].m6_flags = mif6table[i].m6_flags;
|
||||||
out[i].m6_rate_limit = mif6table[i].m6_rate_limit;
|
out[i].m6_rate_limit = mif6table[i].m6_rate_limit;
|
||||||
|
@ -1810,6 +1810,7 @@ sdp_pcblist(SYSCTL_HANDLER_ARGS)
|
|||||||
if (error != 0)
|
if (error != 0)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
|
bzero(&xig, sizeof(xig));
|
||||||
xig.xig_len = sizeof xig;
|
xig.xig_len = sizeof xig;
|
||||||
xig.xig_count = n;
|
xig.xig_count = n;
|
||||||
xig.xig_gen = 0;
|
xig.xig_gen = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user