img: force common Web formats to be interpreted according to extension
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.master
parent
32ef584dc5
commit
54a9f8d07d
|
@ -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")) {
|
||||
|
|
Loading…
Reference in New Issue