Public bug reported: This is valid for iproute2-ss111117 which is default on Ubuntu 12.04 (LTS).
The crash appends when supplying enc, auth, comp, auth-trunc or aead and the following key argumentis given as a string (as opposed to hexadecimal). When trying to copy the key, it generates a segfault: ------------------------------------------------------------ *** buffer overflow detected ***: /sbin/ip terminated ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7ffff7921807] /lib/x86_64-linux-gnu/libc.so.6(+0x109700)[0x7ffff7920700] /lib/x86_64-linux-gnu/libc.so.6(+0x1089e6)[0x7ffff791f9e6] /sbin/ip[0x420d84] /sbin/ip(do_xfrm_state+0x7a1)[0x421951] /sbin/ip[0x405ad5] /sbin/ip(main+0x2b4)[0x4056d4] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7ffff783876d] /sbin/ip[0x405959] ------------------------------------------------------------ This buffer overflow is actually preposterous since __strncpy_chk is called with 0 as its last argument: 0x0000000000420d72: mov 0x68(%rsp),%rsi 0x0000000000420d77: movslq %r12d,%rdx 0x0000000000420d7a: xor %ecx,%ecx 0x0000000000420d7c: mov %r9,%rdi => 0x0000000000420d7f: callq 0x404a10 <__strncpy_chk@plt> ("xor %ecx,%ecx" set the fourth argument to 0) Which is equivalent to: __strncpy_chk(buf, key, len, 0); When obtaining the source package, the corresponding code looks like that (from ip/xfrm_state.c, line 113): static int xfrm_algo_parse(struct xfrm_algo *alg, enum xfrm_attr_type_t type, char *name, char *key, char *buf, int max) { int len; int slen = strlen(key); #if 0 /* XXX: verifying both name and key is required! */ fprintf(stderr, "warning: ALGO-NAME/ALGO-KEY will send to kernel promiscuously! (verifying them isn't implemented yet)\n"); #endif strncpy(alg->alg_name, name, sizeof(alg->alg_name)); if (slen > 2 && strncmp(key, "0x", 2) == 0) { <snip> } else { len = slen; if (len > 0) { if (len > max) invarg("\"ALGO-KEY\" makes buffer overflow\n", key); strncpy(buf, key, len); <----- correct line which is faulty in the assembly } } alg->alg_key_len = len * 8; return 0; } This code is actually valid but doesn't match the assembly from the binary package. This is quite annoying since it prevents from setting keys in a string form, thus forcing the user to derivates itself the hexadecimal value for the key when trying to setup an IPsec tunnel for example. ** Affects: iproute2 (Ubuntu) Importance: Undecided Status: New -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1220782 Title: ip xfrm state add crashes when supplied an algo To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/iproute2/+bug/1220782/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs