Drop packets forwarded via TCP if they are too big (CVE-2013-1428).
Normally all requests sent via the meta connections are checked so that they cannot be larger than the input buffer. However, when packets are forwarded via meta connections, they are copied into a packet buffer without checking whether it fits into it. Since the packet buffer is allocated on the stack, this in effect allows an authenticated remote node to cause a stack overflow. This issue was found by Martin Schobert.
This commit is contained in:
parent
9e2ae03d1d
commit
258bf7ea0f
4 changed files with 18 additions and 0 deletions
|
@ -135,6 +135,7 @@ extern int udp_sndbuf;
|
|||
extern bool do_prune;
|
||||
extern char *myport;
|
||||
extern int autoconnect;
|
||||
extern bool disablebuggypeers;
|
||||
extern int contradicting_add_edge;
|
||||
extern int contradicting_del_edge;
|
||||
extern time_t last_config_check;
|
||||
|
|
|
@ -443,6 +443,9 @@ static void receive_udppacket(node_t *n, vpn_packet_t *inpkt) {
|
|||
void receive_tcppacket(connection_t *c, const char *buffer, int len) {
|
||||
vpn_packet_t outpkt;
|
||||
|
||||
if(len > sizeof outpkt.data)
|
||||
return;
|
||||
|
||||
outpkt.len = len;
|
||||
if(c->options & OPTION_TCPONLY)
|
||||
outpkt.priority = 0;
|
||||
|
|
|
@ -52,6 +52,7 @@ char *proxyuser;
|
|||
char *proxypass;
|
||||
proxytype_t proxytype;
|
||||
int autoconnect;
|
||||
bool disablebuggypeers;
|
||||
|
||||
char *scriptinterpreter;
|
||||
char *scriptextension;
|
||||
|
@ -598,6 +599,8 @@ bool setup_myself_reloadable(void) {
|
|||
|
||||
get_config_int(lookup_config(config_tree, "AutoConnect"), &autoconnect);
|
||||
|
||||
get_config_bool(lookup_config(config_tree, "DisableBuggyPeers"), &disablebuggypeers);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -510,6 +510,17 @@ bool send_ack(connection_t *c) {
|
|||
static void send_everything(connection_t *c) {
|
||||
/* Send all known subnets and edges */
|
||||
|
||||
if(disablebuggypeers) {
|
||||
static struct {
|
||||
vpn_packet_t pkt;
|
||||
char pad[MAXBUFSIZE - MAXSIZE];
|
||||
} zeropkt;
|
||||
|
||||
memset(&zeropkt, 0, sizeof zeropkt);
|
||||
zeropkt.pkt.len = MAXBUFSIZE;
|
||||
send_tcppacket(c, &zeropkt.pkt);
|
||||
}
|
||||
|
||||
if(tunnelserver) {
|
||||
for splay_each(subnet_t, s, myself->subnet_tree)
|
||||
send_add_subnet(c, s);
|
||||
|
|
Loading…
Reference in a new issue