From: http://rt.cpan.org/Public/Bug/Display.html?id=36982 diff -Naur perl-5.10.0.orig/lib/File/CVE-2008-2827.t perl-5.10.0/lib/File/CVE-2008-2827.t --- perl-5.10.0.orig/lib/File/CVE-2008-2827.t 1970-01-01 00:00:00.000000000 +0000 +++ perl-5.10.0/lib/File/CVE-2008-2827.t 2008-10-22 00:15:52.000000000 +0000 @@ -0,0 +1,39 @@ +#!perl -w + +# Test case derived from http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=487319 + +my $foo = "foo-$$"; +my $bar = "bar-$$"; + +die "Not clean [$foo] [$bar]" if -e $foo || -e $bar; + +eval { + symlink($foo, $bar) || die "Can't symlink $foo --> $bar"; +}; +if ($@) { + print "1..0 # Skipped: Only systems that can do symlinks are affected\n"; + print "$@\n"; + exit; +} + +use Test; +plan tests => 5; + +umask(0027); + +# touch foo +open(my $fh, ">", $foo) || die "Can't create $foo\n"; +close($fh); + +my $m = (stat $foo)[2]; +ok(defined $m); + +require File::Path; +ok(File::Path::rmtree($bar)); +ok(!-e $bar); + +# If the mode of $foo changed as a result of removing $bar then we are vulnerable +ok($m, (stat $foo)[2]); + +unlink($foo); +ok(!-e $foo); diff -Naur perl-5.10.0.orig/lib/File/Path.pm perl-5.10.0/lib/File/Path.pm --- perl-5.10.0.orig/lib/File/Path.pm 2007-12-18 10:47:07.000000000 +0000 +++ perl-5.10.0/lib/File/Path.pm 2008-10-22 00:15:52.000000000 +0000 @@ -350,9 +350,9 @@ next ROOT_DIR; } - my $nperm = $perm & 07777 | 0600; - if ($nperm != $perm and not chmod $nperm, $root) { - if ($Force_Writeable) { + if ($Force_Writeable) { + my $nperm = $perm & 07777 | 0600; + if ($nperm != $perm and not chmod $nperm, $root) { _error($arg, "cannot make file writeable", $canon); } }