atom feed82 messages in org.freebsd.freebsd-hackersProtection from the dreaded "rm -fr /"
FromSent OnAttachments
Giorgos KeramidasOct 2, 2004 1:19 am 
Edwin GroothuisOct 2, 2004 1:33 am 
Michael ReifenbergerOct 2, 2004 1:34 am 
Giorgos KeramidasOct 2, 2004 1:39 am 
Giorgos KeramidasOct 2, 2004 1:51 am 
Ryan SommersOct 2, 2004 1:52 am 
Giorgos KeramidasOct 2, 2004 1:53 am 
Giorgos KeramidasOct 2, 2004 2:06 am 
Max LaierOct 2, 2004 2:24 am 
Giorgos KeramidasOct 2, 2004 3:19 am 
Greg BlackOct 2, 2004 3:57 am 
Ceri DaviesOct 2, 2004 4:22 am 
Ceri DaviesOct 2, 2004 4:25 am 
Max LaierOct 2, 2004 4:51 am 
Peter JeremyOct 2, 2004 5:43 am 
Dimitry AndricOct 2, 2004 7:48 am 
Simon L. NielsenOct 2, 2004 8:03 am 
Sean FarleyOct 2, 2004 8:41 am 
SamOct 2, 2004 8:54 am 
Jacques A. VidrineOct 2, 2004 9:46 am 
Tillman HodgsonOct 2, 2004 9:51 am 
Lee HarrOct 2, 2004 9:53 am 
Tillman HodgsonOct 2, 2004 9:55 am 
Giorgos KeramidasOct 2, 2004 10:10 am 
Giorgos KeramidasOct 2, 2004 10:55 am 
Giorgos KeramidasOct 2, 2004 10:56 am 
Tillman HodgsonOct 2, 2004 11:09 am 
Doug RussellOct 2, 2004 11:37 am 
David SchultzOct 2, 2004 11:50 am 
David SchultzOct 2, 2004 12:01 pm 
Michael ReifenbergerOct 2, 2004 12:16 pm 
Doug RussellOct 2, 2004 12:18 pm 
Michael ReifenbergerOct 2, 2004 12:26 pm 
Dmitry FrolovOct 2, 2004 12:37 pm 
Doug RussellOct 2, 2004 12:48 pm 
David SchultzOct 2, 2004 1:11 pm 
Michael ReifenbergerOct 2, 2004 1:49 pm 
Tillman HodgsonOct 2, 2004 2:05 pm 
Garance A DrosihnOct 2, 2004 2:22 pm 
Ceri DaviesOct 2, 2004 3:00 pm 
sor...@cydem.orgOct 2, 2004 3:11 pm 
Giorgos KeramidasOct 2, 2004 4:28 pm 
Giorgos KeramidasOct 2, 2004 4:28 pm 
David SchultzOct 2, 2004 5:19 pm 
M. Warner LoshOct 2, 2004 6:26 pm 
M. Warner LoshOct 2, 2004 6:28 pm 
M. Warner LoshOct 2, 2004 6:29 pm 
Giorgos KeramidasOct 2, 2004 6:53 pm 
Thomas David RiversOct 2, 2004 6:53 pm 
M. Warner LoshOct 2, 2004 7:07 pm 
Doug RussellOct 2, 2004 7:11 pm 
Tillman HodgsonOct 2, 2004 8:09 pm 
Tillman HodgsonOct 2, 2004 8:11 pm 
David SchultzOct 2, 2004 11:31 pm 
Sam LawranceOct 3, 2004 12:35 am 
Chris HowellsOct 3, 2004 5:07 am 
Mike MeyerOct 3, 2004 5:07 am 
Mike MeyerOct 3, 2004 5:07 am 
M. Warner LoshOct 3, 2004 10:37 am 
Greg ShenautOct 3, 2004 11:14 am 
Dmitry MorozovskyOct 3, 2004 11:28 am 
Thomas SparrevohnOct 3, 2004 11:40 am 
Dag-Erling SmørgravOct 3, 2004 1:33 pm 
Roman NeuhauserOct 3, 2004 2:59 pm 
M. Warner LoshOct 3, 2004 6:38 pm 
Mark MurrayOct 4, 2004 1:10 am 
Dmitry KarasikOct 4, 2004 3:15 am 
Dave HorsfallOct 4, 2004 3:27 am 
Giorgos KeramidasOct 4, 2004 3:49 am 
Stijn HoopOct 4, 2004 4:52 am 
Ceri DaviesOct 4, 2004 5:33 am 
Søren SchmidtOct 4, 2004 5:43 am 
Chris HowellsOct 4, 2004 6:16 pm 
Chris DillonOct 5, 2004 8:36 am 
SamOct 5, 2004 9:03 am 
Giorgos KeramidasOct 5, 2004 5:12 pm 
Giorgos KeramidasOct 5, 2004 5:42 pm 
Matthew DillonOct 5, 2004 6:30 pm 
Matthew DillonOct 5, 2004 6:56 pm 
Matthew DillonOct 5, 2004 11:39 pm 
Thomas SparrevohnOct 6, 2004 12:49 pm 
Lyndon NerenbergOct 28, 2004 5:31 am 
Subject:Protection from the dreaded "rm -fr /"
From:Giorgos Keramidas (kera@freebsd.org)
Date:Oct 2, 2004 3:19:26 am
List:org.freebsd.freebsd-hackers

On 2004-10-02 03:52, Ryan Sommers <rya@gamersimpact.com> wrote:

On Sat, Oct 02, 2004 at 11:19:28AM +0300, Giorgos Keramidas wrote:

about "rm -fr /" protection, which I liked a lot: http://blogs.sun.com/roller/page/jbeck/20041001#rm_rf_protection

His idea was remarkably simple, so I went ahead and wrote this patch for rm(1) of FreeBSD:

As for adding this kind of oops-proofing. I'm not sure I like the idea of completely removing the ability to use / as an argument. How about prompting and needing 'yes' as input?

This might break things because the user hasn't specified -i and will suddenly get a prompt. Unexpected prompts might never get an answer.

I liked what Max Laier proposed though, about making this tunable and defaulting to off. See below for the behavior of what I've come up with:

On 2004-10-02 11:23, Max Laier <ma@love2party.net> wrote:

[ Sorry to be so negative ... ]

At very least you should consider to error out silently as POSIX requires "-f" to be silent. Other than that you should really look into the standards and what they way about rm and friends.

Agreed. Thanks for the feedback. Positive replies are not the only sort that are worth a lot :-)

How does the following look instead of forcing stuff to the user?

1. Silently erroring out:

chroot# export RM_PROTECT_ROOT=1 chroot# /bin/rm -fr / chroot# echo $? 1 chroot# /bin/rm -fr .././ chroot# echo $? 1

2. Warning with an error message because RM_PROTECT_ROOT is set:

chroot# export RM_PROTECT_ROOT=1 chroot# /bin/rm -r / rm: recursive rm of / not allowed chroot# /bin/rm -r .././ rm: recursive rm of / not allowed

3. The current behavior as a default when RM_PROTECT_ROOT is unset:

chroot# unset RM_PROTECT_ROOT chroot# /bin/rm -r / override rwxr-xr-x 0/0 for /bin/rm? ^Cchroot# chroot# chroot# chroot# /bin/rm -fr / rm: /libexec/ld-elf.so.1: Operation not permitted rm: /libexec: Directory not empty rm: /lib/libc.so.5: Operation not permitted rm: /lib/libcrypt.so.2: Operation not permitted rm: /lib: Directory not empty rm: /: Is a directory chroot# ls -l ls: not found chroot# echo * lib libexec chroot# cd lib chroot# echo * libc.so.5 libcrypt.so.2 chroot# exit

Here's the updated diff:

%%% Index: rm.c =================================================================== RCS file: /home/ncvs/src/bin/rm/rm.c,v retrieving revision 1.47 diff -u -r1.47 rm.c --- rm.c 6 Apr 2004 20:06:50 -0000 1.47 +++ rm.c 2 Oct 2004 10:06:59 -0000 @@ -57,7 +57,7 @@ #include <sysexits.h> #include <unistd.h>

-int dflag, eval, fflag, iflag, Pflag, vflag, Wflag, stdin_ok; +int dflag, eval, fflag, iflag, Pflag, vflag, Wflag, stdin_ok, protect_root; uid_t uid;

int check(char *, char *, struct stat *); @@ -100,6 +100,10 @@ exit(eval); }

+ protect_root = 0; + if (getenv("RM_PROTECT_ROOT") != NULL) + protect_root = 1; + Pflag = rflag = 0; while ((ch = getopt(argc, argv, "dfiPRrvW")) != -1) switch(ch) { @@ -157,6 +161,8 @@ void rm_tree(char **argv) { + static char *rpath = NULL; + char **argv_tmp; FTS *fts; FTSENT *p; int needstat; @@ -164,6 +170,25 @@ int rval;

/* + * If enabled in the environment with RM_PROTECT_ROOT disable the + * ability to recursively remove the root directory. + */ + if (protect_root) { + if (rpath == NULL && + (rpath = malloc(PATH_MAX * sizeof(char))) == NULL) + err(1, "malloc"); + for (argv_tmp = argv; *argv_tmp != NULL; argv_tmp++) { + if (realpath(*argv_tmp, rpath) == NULL && + strcmp(rpath, "/") != 0) + continue; + if (fflag != 0) + exit (1); + else + errx(1, "recursive rm of / not allowed"); + } + } + + /* * Remove a file hierarchy. If forcing removal (-f), or interactive * (-i) or can't ask anyway (stdin_ok), don't stat the file. */ %%%