Skip to contentSkip to conversation

x86/boot: Warn on future overlapping memcpy() use

PATCH Superseded Kees Cook 2 participants 4 messages Apr 28, 2016 – Apr 29, 2016 x86

v3 of 5 Superseded Latest is v5 →

lore
Share & tools
lore

Kees Cook

author
#0 lore raw

PATCH v3 1/1 x86/boot: Warn on future overlapping memcpy() use

If an overlapping memcpy() is ever attempted, we should report it and gracefully call memmove(). These cases can be found and fixed to use memmove() correctly, but in the meantime, we will not break booting.

---
 arch/x86/boot/compressed/string.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)
arch/x86/boot/compressed/string.c +13 -2
index 2befeca1aada..7402227fdfdb 100644
@@ -8,7 +8,7 @@
 #include "../string.c"
 
 #ifdef CONFIG_X86_32
-void *memcpy(void *dest, const void *src, size_t n)
+static void *__memcpy(void *dest, const void *src, size_t n)
 {
 	int d0, d1, d2;
 	asm volatile(
@@ -22,7 +22,7 @@ void *memcpy(void *dest, const void *src, size_t n)
 	return dest;
 }
 #else
-void *memcpy(void *dest, const void *src, size_t n)
+static void *__memcpy(void *dest, const void *src, size_t n)
 {
 	long d0, d1, d2;
 	asm volatile(
@@ -60,3 +60,14 @@ void *memmove(void *dest, const void *src, size_t n)
 
 	return dest;
 }
+
+/* Detect and warn about potential overlaps, but handle them with memmove. */
+void *memcpy(void *dest, const void *src, size_t n)
+{
+	if (dest > src && dest - src < n) {
+		warn("Avoiding potentially unsafe overlapping memcpy()!");
+		return memmove(dest, src, n);
+	}
+	return __memcpy(dest, src, n);
+}
+
Signature · 6 lines
2.6.3


-- 
Kees Cook
Chrome OS & Brillo Security
author
#1 lore raw

(Sorry, this v3 got sent to an incomplete CC list...)

Quoted 54 lines · Kees Cook

If an overlapping memcpy() is ever attempted, we should report it and gracefully call memmove(). These cases can be found and fixed to use memmove() correctly, but in the meantime, we will not break booting.

---
 arch/x86/boot/compressed/string.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)
arch/x86/boot/compressed/string.c +13 -3
index 2befeca1aada..7402227fdfdb 100644
@@ -8,7 +8,7 @@
 #include "../string.c"
 
 #ifdef CONFIG_X86_32
-void *memcpy(void *dest, const void *src, size_t n)
+static void *__memcpy(void *dest, const void *src, size_t n)
 {
        int d0, d1, d2;
        asm volatile(
@@ -22,7 +22,7 @@ void *memcpy(void *dest, const void *src, size_t n)
        return dest;
 }
 #else
-void *memcpy(void *dest, const void *src, size_t n)
+static void *__memcpy(void *dest, const void *src, size_t n)
 {
        long d0, d1, d2;
        asm volatile(
@@ -60,3 +60,14 @@ void *memmove(void *dest, const void *src, size_t n)
 
        return dest;
 }
+
+/* Detect and warn about potential overlaps, but handle them with memmove. */
+void *memcpy(void *dest, const void *src, size_t n)
+{
+       if (dest > src && dest - src < n) {
+               warn("Avoiding potentially unsafe overlapping memcpy()!");
+               return memmove(dest, src, n);
+       }
+       return __memcpy(dest, src, n);
+}
+
--

2.6.3

--
Kees Cook
Chrome OS & Brillo Security

Signature · 2 lines
Kees Cook
Chrome OS & Brillo Security
#2 lore raw
In reply to Kees Cook
reproduce:

Hi,

[auto build test ERROR on tip/auto-latest]
[cannot apply to tip/x86/core v4.6-rc5 next-20160428]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Kees-Cook/x86-boot-Warn-on-future-overlapping-memcpy-use/20160429-075026
config: i386-tinyconfig (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All error/warnings (new ones prefixed by >>):

arch/x86/boot/compressed/string.c: In function 'memmove':

>> arch/x86/boot/compressed/string.c:56:10: warning: implicit declaration of function 'memcpy' [-Wimplicit-function-declaration]
      return memcpy(dest, src, n);
             ^
>> arch/x86/boot/compressed/string.c:56:10: warning: return makes pointer from integer without a cast [-Wint-conversion]
   arch/x86/boot/compressed/string.c: At top level:
>> arch/x86/boot/compressed/string.c:65:7: error: conflicting types for 'memcpy'
    void *memcpy(void *dest, const void *src, size_t n)
          ^
   arch/x86/boot/compressed/string.c:56:10: note: previous implicit declaration of 'memcpy' was here
      return memcpy(dest, src, n);
             ^
   arch/x86/boot/compressed/string.c: In function 'memcpy':
>> arch/x86/boot/compressed/string.c:68:3: warning: implicit declaration of function 'warn' [-Wimplicit-function-declaration]
      warn("Avoiding potentially unsafe overlapping memcpy()!");
      ^

vim +/memcpy +65 arch/x86/boot/compressed/string.c

    50	void *memmove(void *dest, const void *src, size_t n)
    51	{
    52		unsigned char *d = dest;
    53		const unsigned char *s = src;
    54	
    55		if (d <= s || d - s >= n)
  > 56			return memcpy(dest, src, n);
    57	
    58		while (n-- > 0)
    59			d[n] = s[n];
    60	
    61		return dest;
    62	}
    63	
    64	/* Detect and warn about potential overlaps, but handle them with memmove. */
  > 65	void *memcpy(void *dest, const void *src, size_t n)
    66	{
    67		if (dest > src && dest - src < n) {
  > 68			warn("Avoiding potentially unsafe overlapping memcpy()!");
    69			return memmove(dest, src, n);
    70		}
    71		return __memcpy(dest, src, n);

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation

author
#3 lore raw

Argh. I'm hating this patch. :)

Will fix with v4.

Quoted 59 lines · kbuild test robot

Hi,

[auto build test ERROR on tip/auto-latest]
[cannot apply to tip/x86/core v4.6-rc5 next-20160428]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Kees-Cook/x86-boot-Warn-on-future-overlapping-memcpy-use/20160429-075026
config: i386-tinyconfig (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386

All error/warnings (new ones prefixed by >>):

arch/x86/boot/compressed/string.c: In function 'memmove':

Quoted 1 line
Quoted 1 line

arch/x86/boot/compressed/string.c:56:10: warning: implicit declaration of function 'memcpy' [-Wimplicit-function-declaration]

      return memcpy(dest, src, n);
             ^
Quoted 1 line
Quoted 1 line

arch/x86/boot/compressed/string.c:56:10: warning: return makes pointer from integer without a cast [-Wint-conversion]

arch/x86/boot/compressed/string.c: At top level:

Quoted 1 line
Quoted 1 line

arch/x86/boot/compressed/string.c:65:7: error: conflicting types for 'memcpy'

void *memcpy(void *dest, const void *src, size_t n)
^
arch/x86/boot/compressed/string.c:56:10: note: previous implicit declaration of 'memcpy' was here

      return memcpy(dest, src, n);
             ^

arch/x86/boot/compressed/string.c: In function 'memcpy':

Quoted 1 line
Quoted 1 line

arch/x86/boot/compressed/string.c:68:3: warning: implicit declaration of function 'warn' [-Wimplicit-function-declaration]

      warn("Avoiding potentially unsafe overlapping memcpy()!");
      ^

vim +/memcpy +65 arch/x86/boot/compressed/string.c

    50  void *memmove(void *dest, const void *src, size_t n)
    51  {
    52          unsigned char *d = dest;
    53          const unsigned char *s = src;
    54
    55          if (d <= s || d - s >= n)
Quoted 1 line

56 return memcpy(dest, src, n);

    57
    58          while (n-- > 0)
    59                  d[n] = s[n];
    60
    61          return dest;
    62  }
    63
    64  /* Detect and warn about potential overlaps, but handle them with memmove. */
Quoted 1 line

65 void *memcpy(void *dest, const void *src, size_t n)

    66  {
    67          if (dest > src && dest - src < n) {
Quoted 1 line

68 warn("Avoiding potentially unsafe overlapping memcpy()!");

    69                  return memmove(dest, src, n);
    70          }
    71          return __memcpy(dest, src, n);

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation

Signature · 2 lines
Kees Cook
Chrome OS & Brillo Security