Discussion about option to optionally turn off an overly restrictive security measure
[ikiwiki.git] / doc / forum / Allow_overriding_of_symlink_restriction.mdwn
1 There is currently a restriction in ikiwiki that there cannot be any symlinks in the source path.  This is to deal with a security issue discussed [[here|security#index29h2]].  The issue, as I understand it, is that someone might change a symlink and so cause things on the server to be published when the server admin doesn't want them to be.
2
3 I think there are two issues here:
4
5  - Symlinks with the source dir path itself, and
6  - Symlinks inside the source directory.
7
8 The first appears to me to be less of a security issue.  If there is a way for a malicious person to change where that path points, then you have problems this check isn't going to solve.  The second is quite clearly a security issue - if someone were to commit a symlink into the source dir they could cause lots of stuff to be published that shouldn't be.
9
10 The current code seems to check this constraint at the top of IkiWiki/Render.pm at the start of refresh().  It seems to only check the source dir itself, not the subdirs.  Then it uses File::Find to recuse which doesn't follow symlinks.
11
12 Now my problem:  I have a hosted server where I cannot avoid having a symlink in the source path.  I've made a patch to optionally turn off the symlink checking in the source path itself.  The patch would still not follow symlinks inside the source dir.  This would seem to be ok security-wise for me as I know that path is ok and it isn't going to change on me.
13
14 Is there a huge objection to this patch?
15
16 (note: patch inline - look at the source to get it.  And I didn't re-indent the code when I added the if...)
17
18 index 990fcaa..d7cb37e 100644
19 --- a/IkiWiki/Render.pm
20 +++ b/IkiWiki/Render.pm
21 @@ -260,6 +260,7 @@ sub prune ($) { #{{{
22  
23  sub refresh () { #{{{
24         # security check, avoid following symlinks in the srcdir path
25 +       if (! $config{allowsrcdirlinks}) {
26         my $test=$config{srcdir};
27         while (length $test) {
28                 if (-l $test) {
29 @@ -269,6 +270,7 @@ sub refresh () { #{{{
30                         $test=dirname($test);
31                 }
32         }
33 +       }
34         
35         run_hooks(refresh => sub { shift->() });
36