Subject: Re: "Secure" harddisk eraser?
To: Florian Stoehr <netbsd@wolfnode.de>
From: Dan LaBell <dan4l-nospam@verizon.net>
List: netbsd-users
Date: 02/08/2005 18:52:43
On Sunday, February 6, 2005, at 07:22 AM, Florian Stoehr wrote:

> Hi all,
>
> I didn't know about any existing eraser tool under NetBSD,
> so I played around and wrote my own, capable of erasing
> single partitions (or whole disks of course). Now I have some 
> questions about this task.
>
> I implemented a 35-pass pattern eraser, like Gutmann requested
> in
>
> http://www.linux-kurser.dk/secure_del_peter_gutmann.html
>
> The goal of this program is not to stop any freak with special
> controller or oscilloscope - 3 times with random data might be
> enough here - but to raise time needed to restore data or
> make it too expensive for government authorities (at least
> if you're not involved in serious crime).
>
I just read that paper recently.  There is gnu shred in gnu diskutils 
btw,
GPL'ed of course.  I don't know about too expensive, or time, I figure
if they're using those techniques, they'll take the time...  At any 
rate, as I
understand it those  bit patterns were designed to clear off-track data.
The magnetic pattern of a sector, is transferred somewhat into the 
space around,
you clear the drive, block by block with dd if=/dev/zero etc, but 
there's still
a ghost image in the gaps between tracks, which is what they read.  The 
longer the data was in place on those tracks, the stronger the ghost 
image, and since you don't write directly to it, some of it still 
there.   I wish the paper and gone into more detail on the scientific 
side of it, as to why, alternating bit patterns (010101,1010101), seem
to affect the surrounding more than random data -- does the produce a 
stronger field? Or was it canceling existing field?  I remember when I 
was writing patterns to a old 10 meg
PC hardisk, and some floppy disks to try to 'revive bad sectors', and 
it worked sometimes,
though half the time it would fade and go bad again in a week.  Are 
these the same patterns?

I did a wipe on 2 drives, a few weeks ago, though I was more concerned 
with what could happen if I  give the drives away, and an enterprising 
hacker reprograms a controller to read what's in the gaps (perhaps by 
using bogus geometry, the article alludes to this, if I remember), 
rather than government stuff.  I figure if they're taking your drive 
apart in the a clean room, its only a question of how many years, you'd 
get, at that point ;-]  So, as shred would take way to long,  I just 
wiped once with dd if=/dev/zero, and then hacked out a program to write 
large blocks of a repeating hex pattern, to pipe to dd.   Then did 4 
passes, each way faster than shred, which I think would have taken 10 - 
12 hours, a pass.  (And, I just blindly assumed 4 passes would be 
enough, a comprise of peace of mind, vs. expediency. ) At any rate, I 
just looked at the bit patterns, in the doc, noticed some were same 
left after drive formating, and picked 4. A655, then 55A6, then 2AC9, 
then 2AC9.

As to how effective any of this, is well, it would seem the only way to 
tell would be to have the equipment needed to grab the data, and see.  
Low-level formatting might be more effective than any of this, as it 
writes to more of the disk.

I think your program should, have an option to skip random data, the 
article made random
sound nearly pointless, as it was all about writing, and having it 
bleeding into the surrounding magnetic substrate on the disk.  Some 
patterns are more likely induce a neighboring  bit' to flip, than 
others.  AND, have user configurable buffer sizes.

Originally, I tried to do it all with 'yes', but the trailing newline, 
was problematic.
My prog, is shorter than this email, so I'll include in case anyone is 
interested.
Its designed to be used from shell, with dd.  My block size isn't 
user-configurable,
either, and I can only use the 2 byte sequences, but I can tune output 
with dd.
I found obs=128k was good for my machine,
ex: repeathex 55A6 | dd of=/dev/rdisk0s15  ibs=64k obs=128k
This was on  macosx, which will try vainly to recover data from zero'ed
hfs partitions, slowing boot time, though won't bother if filled with 
one of the patterns
I used, so one can make a drive look like it was just formatted if one 
knows the
pattern the format program writes.  Its also sometimes useful to know 
that one is looking
at data from unused parts of the disk.

---- repeathex.c -----------------------
#include <sys/types.h>
#include <sys/uio.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
#include <stdio.h>

int main ( int argc, char * argv[] )
{
   const int len= 64 * 1024;
   int  num = (len/sizeof(short));
   int i;
   long l=0;
   unsigned short s;
   unsigned short sbuf[num];

   if ( argc >= 2 ) {
     l=strtol(argv[1],NULL,16);
   };
   s=(unsigned short)l;
   for ( i=0; i < num; i++ ) {
     sbuf[i]=s;
   }
   LOOP:
   if( 0 < (write(1,sbuf,len)))
     goto LOOP;
   perror("write()");
   return 1;
}