Package: davical
Version: 1.1.1-1
Severity: grave
Tags: security upstream

Hi.

Tagging this as security relevant and important... as someone might
even be able to find a tricky way to use this to read arbitrary
files (well at least I can't think of one).
Again... marking this as grave to notify the security team... if you agree
that this is not critical (due to (a) - see below) than please lower the 
severity
to important - Thanks.)

In caldav.php there is the following code in the very beginning:
if ( isset($_SERVER['PATH_INFO']) && preg_match( 
'{^(/favicon.ico|davical.css|(images|js|css)/.+)$}', $_SERVER['PATH_INFO'], 
$matches ) ) {
  $filename = $_SERVER['DOCUMENT_ROOT'] . preg_replace('{(\.\.|\\\\)}', '', 
$matches[1]);
  $fh = @fopen($matches[1],'r');
  if ( ! $fh ) {
    @header( sprintf("HTTP/1.1 %d %s", 404, 'Not found') );
  }
  else {
    fpassthru($fh);
  }
  @ob_flush(); exit(0);
}

It seems the intention is to pass through some special files even though I 
can't think
why... this is CalDAV and no one should need icons, css and images.


Nevertheless... looking at the code this sounds quite problematic,... and it 
never
could have worked anyway.
Let's go through it:

>if ( isset($_SERVER['PATH_INFO']) && preg_match( 
>'{^(/favicon.ico|davical.css|(images|js|css)/.+)$}', $_SERVER['PATH_INFO'], 
>$matches ) ) {
The regexp is already problematic
a) "/" is inside the "(...)" so only a "...caldav.php/favicon.ico" could have 
ever been matched
   (this is why I say it could have never worked so far).
   PATH_INFO is AFAIK _always_ prefixed by "/" so the other patterns i.e. 
   "davical.css|(images|js|css)/.+" never matched.
b) The pattern contains unescaped "."... so this means "any character" and e.g.
   also a "faviconXico" would be matched.

>$filename = $_SERVER['DOCUMENT_ROOT'] . preg_replace('{(\.\.|\\\\)}', '', 
>$matches[1]);
I strongly doubt this replacement will do away with any evil tricks of escaping
an attacker would do to manipulate the paths.
c) Actually I think it even makes attacks possible.... (if there wouldn't be 
the above matching bug (a).
   There's only one pass of preg_replace... and not so many until nothing 
changes.
   Wouldn't (a) be a bug.. then one could probably send an url like
   "/images/.\\./.\\./.\\./etc/shadow)
   The  pattern wouldn't see th \.\. but it would see and remove the \\\\
   thereby creating the filename "whatever/images/../../../etc/shadow".
   A good way to start an attack.

> $fh = @fopen($matches[1],'r');
d) What you probably want is opening $filename.


e) Last but not least.
The whole think will break anyway, when the user has set PHP's
open_basedir...
So if the whole code is really needed (in a correct for)...
then
- the code should handle it when open_basedir is set, and e.g.
log it or what ever.
- the davical documentation need to be updaded, to inform the users
  that DOCUMENT_ROOT must be added to open_basedir.



My suggestion... if you don't really need this pass throughing...
Remove this section alltogether... anything is always likely to be security 
prone.

These kind of redirects to file content should anyway be done by the webserver.
Especially when "PATH_INFO URLs" are used... it's quite problematic to serve
file content via them... this is not intented... and likely to cause security 
trouble...
even if it's on the webserver end.


-- 
To UNSUBSCRIBE, email to debian-bugs-rc-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to