On Sun, Jan 20, 2013 at 08:49:26PM +0100, Moritz Mühlenhoff wrote:
> On Fri, Jan 11, 2013 at 03:56:25PM +0000, Jonathan Wiltshire wrote:
> > Control: found -1 3.2.1-2
> > 
> > On 2013-01-11 13:50, Moritz Muehlenhoff wrote:
> > >Package: nagios3
> > >Severity: grave
> > >Tags: security
> > >Justification: user security hole
> > >
> > >This was assigned CVE-2012-6096:
> > >
> > >http://archives.neohapsis.com/archives/fulldisclosure/2012-12/0108.html
> > >
> > >Fix:
> > >
> > >http://nagios.svn.sourceforge.net/viewvc/nagios?view=revision&revision=2547
> > 
> > I tested against squeeze and reproduced the problem. We use nagios
> > at work so I'm happy to prepare DSA packages if required.
> 
> Jonathan, can you prepare packages for stable-security now that we have
> a final patch?

Ok, I now have tested packages for stable-security for nagios3, debdiff
and DSA text attached.

-- 
Jonathan Wiltshire                                      j...@debian.org
Debian Developer                         http://people.debian.org/~jmw

4096R: 0xD3524C51 / 0A55 B7C5 1223 3942 86EC  74C3 5394 479D D352 4C51

<directhex> i have six years of solaris sysadmin experience, from
            8->10. i am well qualified to say it is made from bonghits
                        layered on top of bonghits
diff -u nagios3-3.2.1/debian/changelog nagios3-3.2.1/debian/changelog
--- nagios3-3.2.1/debian/changelog
+++ nagios3-3.2.1/debian/changelog
@@ -1,3 +1,11 @@
+nagios3 (3.2.1-2+squeeze1) squeeze-security; urgency=low
+
+  * Non-maintainer upload.
+  * Backport 99_security_cve_2012_6096.dpatch for Squeeze, fixes
+    a buffer overflow crasher (Closes: #697930) CVE-2012-6096
+
+ -- Jonathan Wiltshire <j...@debian.org>  Fri, 01 Feb 2013 18:35:55 +0000
+
 nagios3 (3.2.1-2) unstable; urgency=low
 
   * Fix "Missing conflict with nagios3 v3.0.6-4~lenny2 (/usr/lib/cgi-
diff -u nagios3-3.2.1/debian/patches/00list nagios3-3.2.1/debian/patches/00list
--- nagios3-3.2.1/debian/patches/00list
+++ nagios3-3.2.1/debian/patches/00list
@@ -8,0 +9 @@
+99_security_cve_2012_6096.dpatch
only in patch2:
unchanged:
--- nagios3-3.2.1.orig/debian/patches/99_security_cve_2012_6096.dpatch
+++ nagios3-3.2.1/debian/patches/99_security_cve_2012_6096.dpatch
@@ -0,0 +1,128 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 99_securit_cve_2012_6096.dpatch by Alexander Wirt <formo...@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Fix overflows in getcgi.c and history.cgi (CVE 2012-6096)
+## DP: Debian Bug #697930
+## DP: 
http://nagios.svn.sourceforge.net/viewvc/nagios?view=revision&revision=2547
+
+@DPATCH@
+diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' 
'--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' 
nagios3-3.2.1~/cgi/getcgi.c nagios3-3.2.1/cgi/getcgi.c
+--- nagios3-3.2.1~/cgi/getcgi.c        2013-02-01 20:30:08.000000000 +0000
++++ nagios3-3.2.1/cgi/getcgi.c 2013-02-01 20:31:07.000000000 +0000
+@@ -137,14 +137,15 @@
+               /* check for NULL query string environment variable - 04/28/00 
(Ludo Bosmans) */
+               if(getenv("QUERY_STRING")==NULL){
+                       cgiinput=(char *)malloc(1);
+-                      if(cgiinput==NULL){
+-                              printf("getcgivars(): Could not allocate memory 
for CGI input.\n");
+-                              exit(1);
+-                              }
+-                      cgiinput[0]='\x0';
++                      if(cgiinput != NULL)
++                              cgiinput[0]='\x0';
+                       }
+               else
+                       cgiinput=strdup(getenv("QUERY_STRING"));
++              if(cgiinput==NULL){
++                      printf("getcgivars(): Could not allocate memory for CGI 
input.\n");
++                      exit(1);
++                      }
+               }
+ 
+       else if(!strcmp(request_method,"POST") || 
!strcmp(request_method,"PUT")){
+@@ -220,7 +221,12 @@
+       paircount=0;
+       nvpair=strtok(cgiinput,"&");
+       while(nvpair){
+-              pairlist[paircount++]=strdup(nvpair);
++              pairlist[paircount] = strdup(nvpair);
++              if( NULL == pairlist[paircount]) {
++                      printf("getcgivars(): Could not allocate memory for 
name-value pair #%d.\n", paircount);
++                      exit(1);
++                      }
++              paircount++;
+               if(!(paircount%256)){
+                       pairlist=(char 
**)realloc(pairlist,(paircount+256)*sizeof(char **));
+                       if(pairlist==NULL){
+@@ -245,13 +251,29 @@
+               /* get the variable name preceding the equal (=) sign */
+               if((eqpos=strchr(pairlist[i],'='))!=NULL){
+                       *eqpos='\0';
+-                      unescape_cgi_input(cgivars[i*2+1]=strdup(eqpos+1));
++                      cgivars[i * 2 + 1] = strdup(eqpos + 1);
++                      if( NULL == cgivars[ i * 2 + 1]) {
++                              printf("getcgivars(): Could not allocate memory 
for cgi value #%d.\n", i);
++                              exit(1);
++                              }
++                      unescape_cgi_input(cgivars[i * 2 + 1]);
++                      }
++              else {
++                      cgivars[i * 2 + 1] = strdup("");
++                      if( NULL == cgivars[ i * 2 + 1]) {
++                              printf("getcgivars(): Could not allocate memory 
for empty stringfor variable value #%d.\n", i);
++                              exit(1);
++                              }
++                      unescape_cgi_input(cgivars[i * 2 + 1]);
+                       } 
+-              else
+-                      unescape_cgi_input(cgivars[i*2+1]=strdup(""));
+ 
+               /* get the variable value (or name/value of there was no real 
"pair" in the first place) */
+-              unescape_cgi_input(cgivars[i*2]=strdup(pairlist[i]));
++              cgivars[i * 2] = strdup(pairlist[i]);
++              if( NULL == cgivars[ i * 2]) {
++                      printf("getcgivars(): Could not allocate memory for cgi 
name #%d.\n", i);
++                      exit(1);
++                      }
++              unescape_cgi_input(cgivars[i * 2]);
+               }
+ 
+       /* terminate the name-value list */
+diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' 
'--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' 
nagios3-3.2.1~/cgi/history.c nagios3-3.2.1/cgi/history.c
+--- nagios3-3.2.1~/cgi/history.c       2013-02-01 20:30:08.000000000 +0000
++++ nagios3-3.2.1/cgi/history.c        2013-02-01 20:31:07.000000000 +0000
+@@ -805,16 +805,22 @@
+                       else if(display_type==DISPLAY_HOSTS){
+ 
+                               if(history_type==HOST_HISTORY || 
history_type==SERVICE_HISTORY){
+-                                      sprintf(match1," HOST ALERT: 
%s;",host_name);
+-                                      sprintf(match2," SERVICE ALERT: 
%s;",host_name);
++                                      snprintf(match1, sizeof( match1), 
++                                                      " HOST ALERT: %s;", 
host_name);
++                                      snprintf(match2, sizeof( match2), 
++                                                      " SERVICE ALERT: %s;", 
host_name);
+                                       }
+                               else if(history_type==HOST_FLAPPING_HISTORY || 
history_type==SERVICE_FLAPPING_HISTORY){
+-                                      sprintf(match1," HOST FLAPPING ALERT: 
%s;",host_name);
+-                                      sprintf(match2," SERVICE FLAPPING 
ALERT: %s;",host_name);
++                                      snprintf(match1, sizeof( match1), 
++                                                      " HOST FLAPPING ALERT: 
%s;", host_name);
++                                      snprintf(match2, sizeof( match2), 
++                                                      " SERVICE FLAPPING 
ALERT: %s;", host_name);
+                                       }
+                               else if(history_type==HOST_DOWNTIME_HISTORY || 
history_type==SERVICE_DOWNTIME_HISTORY){
+-                                      sprintf(match1," HOST DOWNTIME ALERT: 
%s;",host_name);
+-                                      sprintf(match2," SERVICE DOWNTIME 
ALERT: %s;",host_name);
++                                      snprintf(match1, sizeof( match1), 
++                                                      " HOST DOWNTIME ALERT: 
%s;", host_name);
++                                      snprintf(match2, sizeof( match2), 
++                                                      " SERVICE DOWNTIME 
ALERT: %s;", host_name);
+                                       }
+ 
+                               if(show_all_hosts==TRUE)
+@@ -853,11 +859,11 @@
+                       else if(display_type==DISPLAY_SERVICES){
+ 
+                               if(history_type==SERVICE_HISTORY)
+-                                      sprintf(match1," SERVICE ALERT: 
%s;%s;",host_name,svc_description);
++                                      snprintf(match1, sizeof( match1), " 
SERVICE ALERT: %s;%s;", host_name, svc_description);
+                               else if(history_type==SERVICE_FLAPPING_HISTORY)
+-                                      sprintf(match1," SERVICE FLAPPING 
ALERT: %s;%s;",host_name,svc_description);
++                                      snprintf(match1, sizeof( match1), " 
SERVICE FLAPPING ALERT: %s;%s;", host_name, svc_description);
+                               else if(history_type==SERVICE_DOWNTIME_HISTORY)
+-                                      sprintf(match1," SERVICE DOWNTIME 
ALERT: %s;%s;",host_name,svc_description);
++                                      snprintf(match1, sizeof( match1), " 
SERVICE DOWNTIME ALERT: %s;%s;", host_name, svc_description);
+ 
+                               if(strstr(temp_buffer,match1) && 
(history_type==SERVICE_HISTORY || history_type==SERVICE_FLAPPING_HISTORY || 
history_type==SERVICE_DOWNTIME_HISTORY))
+                                       display_line=TRUE;
From: Jonathan Wiltshire <j...@debian.org>
To: debian-security-annou...@lists.debian.org
Subject: [DSA 2616-1] nagios3 security update

-------------------------------------------------------------------------
Debian Security Advisory DSA-2616-1                   secur...@debian.org
http://www.debian.org/security/                        Jonathan Wiltshire
February 01, 2013                      http://www.debian.org/security/faq
-------------------------------------------------------------------------

Package        : nagios3
Vulnerability  : buffer overflow in CGI scripts
Problem type   : remote
Debian-specific: no
CVE ID         : CVE-2012-6096
Debian Bug     : 697930

A buffer overflow problem has been found in nagios3, a host/service/network
monitoring and management system. A mailicious client could craft a
request to history.cgi and cause application crashes.

For the stable distribution (squeeze), this problem has been fixed in
version 3.2.1-2+squeeze1.

For the testing distribution (wheezy), this problem will be fixed soon.

For the unstable distribution (sid), this problem has been fixed in
version 3.4.1-3.

We recommend that you upgrade your nagios3 packages.

Further information about Debian Security Advisories, how to apply
these updates to your system and frequently asked questions can be
found at: http://www.debian.org/security/

Mailing list: debian-security-annou...@lists.debian.org

Attachment: signature.asc
Description: Digital signature

Reply via email to