]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/commitdiff
img: force common Web formats to be interpreted according to extension
authorSimon McVittie <smcv@debian.org>
Wed, 4 May 2016 07:52:40 +0000 (08:52 +0100)
committerSimon McVittie <smcv@debian.org>
Thu, 5 May 2016 22:43:50 +0000 (23:43 +0100)
A site administrator might unwisely set allowed_attachments to
something like '*.jpg or *.png'; if they do, an attacker could attach,
for example, a SVG file named attachment.jpg.

This mitigates CVE-2016-3714.

IkiWiki/Plugin/img.pm

index 169f5e7137a99739501c170561b164d3c4e8825d..a63e27dd6e5005dac324062fce2aac4bb977afeb 100644 (file)
@@ -64,6 +64,39 @@ sub preprocess (@) {
 
        my $dir = $params{page};
        my $base = IkiWiki::basename($file);
+       my $extension;
+       my $format;
+
+       if ($base =~ m/\.([a-z0-9]+)$/) {
+               $extension = $1;
+       }
+       else {
+               error gettext("Unable to detect image type from extension");
+       }
+
+       # Never interpret well-known file extensions as any other format,
+       # in case the wiki configuration unwisely allows attaching
+       # arbitrary files named *.jpg, etc.
+       if ($extension =~ m/^(jpeg|jpg)$/is) {
+               $format = 'jpeg';
+       }
+       elsif ($extension =~ m/^(png)$/is) {
+               $format = 'png';
+       }
+       elsif ($extension =~ m/^(gif)$/is) {
+               $format = 'gif';
+       }
+       elsif ($extension =~ m/^(svg)$/is) {
+               $format = 'svg';
+       }
+       elsif ($extension =~ m/^(pdf)$/is) {
+               $format = 'pdf';
+       }
+       else {
+               # allow ImageMagick to auto-detect (potentially dangerous)
+               $format = '';
+       }
+
        my $issvg = $base=~s/\.svg$/.png/i;
        my $ispdf = $base=~s/\.pdf$/.png/i;
        my $pagenumber = exists($params{pagenumber}) ? int($params{pagenumber}) : 0;
@@ -76,7 +109,7 @@ sub preprocess (@) {
        my $im = Image::Magick->new();
        my $imglink;
        my $imgdatalink;
-       my $r = $im->Read(":$srcfile\[$pagenumber]");
+       my $r = $im->Read("$format:$srcfile\[$pagenumber]");
        error sprintf(gettext("failed to read %s: %s"), $file, $r) if $r;
 
        if (! defined $im->Get("width") || ! defined $im->Get("height")) {