[ 04/54] gen_init_cpio: avoid stack overflow when expanding

2012-10-29 Thread Greg Kroah-Hartman
3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Kees Cook 

commit 20f1de659b77364d55d4e7fad2ef657e7730323f upstream.

Fix possible overflow of the buffer used for expanding environment
variables when building file list.

In the extremely unlikely case of an attacker having control over the
environment variables visible to gen_init_cpio, control over the
contents of the file gen_init_cpio parses, and gen_init_cpio was built
without compiler hardening, the attacker can gain arbitrary execution
control via a stack buffer overflow.

  $ cat usr/crash.list
  file foo ${BIG}${BIG}${BIG}${BIG}${BIG}${BIG} 0755 0 0
  $ BIG=$(perl -e 'print "A" x 4096;') ./usr/gen_init_cpio usr/crash.list
  *** buffer overflow detected ***: ./usr/gen_init_cpio terminated

This also replaces the space-indenting with tabs.

Patch based on existing fix extracted from grsecurity.

Signed-off-by: Kees Cook 
Cc: Michal Marek 
Cc: Brad Spengler 
Cc: PaX Team 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 usr/gen_init_cpio.c |   41 ++---
 1 file changed, 22 insertions(+), 19 deletions(-)

--- a/usr/gen_init_cpio.c
+++ b/usr/gen_init_cpio.c
@@ -303,7 +303,7 @@ static int cpio_mkfile(const char *name,
int retval;
int rc = -1;
int namesize;
-   int i;
+   unsigned int i;
 
mode |= S_IFREG;
 
@@ -381,25 +381,28 @@ error:
 
 static char *cpio_replace_env(char *new_location)
 {
-   char expanded[PATH_MAX + 1];
-   char env_var[PATH_MAX + 1];
-   char *start;
-   char *end;
-
-   for (start = NULL; (start = strstr(new_location, "${")); ) {
-   end = strchr(start, '}');
-   if (start < end) {
-   *env_var = *expanded = '\0';
-   strncat(env_var, start + 2, end - start - 2);
-   strncat(expanded, new_location, start - new_location);
-   strncat(expanded, getenv(env_var), PATH_MAX);
-   strncat(expanded, end + 1, PATH_MAX);
-   strncpy(new_location, expanded, PATH_MAX);
-   } else
-   break;
-   }
+   char expanded[PATH_MAX + 1];
+   char env_var[PATH_MAX + 1];
+   char *start;
+   char *end;
+
+   for (start = NULL; (start = strstr(new_location, "${")); ) {
+   end = strchr(start, '}');
+   if (start < end) {
+   *env_var = *expanded = '\0';
+   strncat(env_var, start + 2, end - start - 2);
+   strncat(expanded, new_location, start - new_location);
+   strncat(expanded, getenv(env_var),
+   PATH_MAX - strlen(expanded));
+   strncat(expanded, end + 1,
+   PATH_MAX - strlen(expanded));
+   strncpy(new_location, expanded, PATH_MAX);
+   new_location[PATH_MAX] = 0;
+   } else
+   break;
+   }
 
-   return new_location;
+   return new_location;
 }
 
 


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[ 04/54] gen_init_cpio: avoid stack overflow when expanding

2012-10-29 Thread Greg Kroah-Hartman
3.4-stable review patch.  If anyone has any objections, please let me know.

--

From: Kees Cook keesc...@chromium.org

commit 20f1de659b77364d55d4e7fad2ef657e7730323f upstream.

Fix possible overflow of the buffer used for expanding environment
variables when building file list.

In the extremely unlikely case of an attacker having control over the
environment variables visible to gen_init_cpio, control over the
contents of the file gen_init_cpio parses, and gen_init_cpio was built
without compiler hardening, the attacker can gain arbitrary execution
control via a stack buffer overflow.

  $ cat usr/crash.list
  file foo ${BIG}${BIG}${BIG}${BIG}${BIG}${BIG} 0755 0 0
  $ BIG=$(perl -e 'print A x 4096;') ./usr/gen_init_cpio usr/crash.list
  *** buffer overflow detected ***: ./usr/gen_init_cpio terminated

This also replaces the space-indenting with tabs.

Patch based on existing fix extracted from grsecurity.

Signed-off-by: Kees Cook keesc...@chromium.org
Cc: Michal Marek mma...@suse.cz
Cc: Brad Spengler spen...@grsecurity.net
Cc: PaX Team pagee...@freemail.hu
Signed-off-by: Andrew Morton a...@linux-foundation.org
Signed-off-by: Linus Torvalds torva...@linux-foundation.org
Signed-off-by: Greg Kroah-Hartman gre...@linuxfoundation.org

---
 usr/gen_init_cpio.c |   41 ++---
 1 file changed, 22 insertions(+), 19 deletions(-)

--- a/usr/gen_init_cpio.c
+++ b/usr/gen_init_cpio.c
@@ -303,7 +303,7 @@ static int cpio_mkfile(const char *name,
int retval;
int rc = -1;
int namesize;
-   int i;
+   unsigned int i;
 
mode |= S_IFREG;
 
@@ -381,25 +381,28 @@ error:
 
 static char *cpio_replace_env(char *new_location)
 {
-   char expanded[PATH_MAX + 1];
-   char env_var[PATH_MAX + 1];
-   char *start;
-   char *end;
-
-   for (start = NULL; (start = strstr(new_location, ${)); ) {
-   end = strchr(start, '}');
-   if (start  end) {
-   *env_var = *expanded = '\0';
-   strncat(env_var, start + 2, end - start - 2);
-   strncat(expanded, new_location, start - new_location);
-   strncat(expanded, getenv(env_var), PATH_MAX);
-   strncat(expanded, end + 1, PATH_MAX);
-   strncpy(new_location, expanded, PATH_MAX);
-   } else
-   break;
-   }
+   char expanded[PATH_MAX + 1];
+   char env_var[PATH_MAX + 1];
+   char *start;
+   char *end;
+
+   for (start = NULL; (start = strstr(new_location, ${)); ) {
+   end = strchr(start, '}');
+   if (start  end) {
+   *env_var = *expanded = '\0';
+   strncat(env_var, start + 2, end - start - 2);
+   strncat(expanded, new_location, start - new_location);
+   strncat(expanded, getenv(env_var),
+   PATH_MAX - strlen(expanded));
+   strncat(expanded, end + 1,
+   PATH_MAX - strlen(expanded));
+   strncpy(new_location, expanded, PATH_MAX);
+   new_location[PATH_MAX] = 0;
+   } else
+   break;
+   }
 
-   return new_location;
+   return new_location;
 }
 
 


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/