We recently had two files corrupted on Debian Wheezy (the current “stable” release). The first one had some garbage, instead of the real data, the other had only zero characters. Only a small part of the files of about 3K was corrupted. This affects both “ext3” and “ext4” file-systems.
It turns out to be a free-memory read bug in cp from coreutils-[8.11..8.19] reported to GNU in Oct/2012. Almost a year ago it was also reported to Debian in Apr/2014 with severity “grave“.
Today we test if the bug is fixed using the PoC given in the original GNU bug report:
$ perl -e 'for (1..3333) { sysseek (*STDOUT, 4096, 1)' -e '&& syswrite (*STDOUT, "a" x 1024) or die "$!"}' > j $ valgrind cp j j2 ==13175== Memcheck, a memory error detector ==13175== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. ==13175== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==13175== Command: cp j j2 ==13175== ==13175== Invalid read of size 4 ==13175== at 0x8051229: ??? (in /bin/cp) ==13175== by 0x153FFF: ??? ==13175== Address 0x424ed0c is 1,356 bytes inside a block of size 1,440 free'd ==13175== at 0x40283EE: realloc (vg_replace_malloc.c:632) ==13175== by 0x805820B: ??? (in /bin/cp) ==13175== by 0x153FFF: ??? ... ==15843== ERROR SUMMARY: 15 errors from 9 contexts (suppressed: 25 from 6)
It turns out that the bug is not fixed in Debian. Unfortunately, upgrade of the “coreutils” package from Jessie is not an option, where this bug is not present. The “coreutils” package from Jessie depends on a newer “libc6” and futhermore would introduce too many (untested) changes to the core utils.
Here is how to rebuild the “coreutils” package by applying the “cp” data corruption patch:
root@machine1:~# cowbuilder --login COW-machine1:~# apt-get update COW-machine1:~# apt-get upgrade COW-machine1:~# mkdir /root/coreutils COW-machine1:~# cd /root/coreutils COW-machine1:~/coreutils# apt-get source coreutils COW-machine1:~/coreutils# apt-get build-dep coreutils COW-machine1:~/coreutils# cd coreutils-8.13 COW-machine1:~/coreutils/coreutils-8.13# wget 'http://git.savannah.gnu.org/cgit/coreutils.git/patch/?id=64aef5fb9afecc023a6e719da161dbbf450908b8' -O cp-avoid_data_corrupting_free_memory_read.patch COW-machine1:~/coreutils/coreutils-8.13# patch -p1 < cp-avoid_data_corrupting_free_memory_read.patch COW-machine1:~/coreutils/coreutils-8.13# DEBFULLNAME='Admin Team' DEBEMAIL='box@example.com' dch --local '~patched' 'Local build with cp data corruption patch' COW-machine1:~/coreutils/coreutils-8.13# dpkg-buildpackage -b -rfakeroot root@machine1:~# cp /var/cache/pbuilder/build/cow.1385/root/coreutils/coreutils_8.13-3.5~patched1_i386.deb /root/tmp/
Finally, you need to install the “.deb” file on your system and prevent APT from auto-upgrading it. You’d need to recompile it every time Debian “stable” releases a mainstream update for “cureutils”. This doesn’t happen that often. Furthermore, we hope that Debian will react to the bug report and will fix the bug in their source tree for Wheezy “stable”.