From a43dffaab0f1e419d5be84e2e7356b86ffac3cf1 Mon Sep 17 00:00:00 2001 From: Alasdair Date: Mon, 6 Jun 2022 11:45:30 +0100 Subject: [PATCH] Remove all disallowed SVG element attributes In a further attempt to reduce remote code injection attack vectors, all attributes except for a set of allowed standard attributes are removed from the SVG element before being converted. Deprecated attributes are included by default, however, these can also be removed by disabling the new `allowDeprecatedAttributes` option. --- package.json | 3 + packages/convert-svg-core/README.md | 12 +-- packages/convert-svg-core/src/Converter.js | 102 ++++++++++++++++-- .../src/fixtures/input/data-url-font.svg | 2 +- .../src/fixtures/input/viewbox-only-2.svg | 2 +- .../fixtures/input/width-height-viewbox-2.svg | 2 +- .../fixtures/input/width-height-viewbox-3.svg | 2 +- .../fixtures/input/width-height-viewbox.svg | 2 +- packages/convert-svg-to-jpeg/README.md | 33 +++--- .../test/fixtures/expected/20.jpeg | Bin 32387 -> 17580 bytes packages/convert-svg-to-png/README.md | 31 ++++-- .../test/fixtures/expected/20.png | Bin 17257 -> 9509 bytes packages/convert-svg-to-webp/README.md | 31 ++++-- .../test/fixtures/expected/20.webp | Bin 8506 -> 5020 bytes 14 files changed, 171 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index 4b1ca03..9d23df4 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,9 @@ "outdated:packages": "lerna exec --stream --no-bail \"npm outdated\"", "publish:packages": "lerna publish from-package", "test": "mocha -O maxDiffSize=32 -R list \"packages/*/test/**/*.spec.js\"", + "test:jpeg": "npm test -- --grep convert-svg-to-jpeg", + "test:png": "npm test -- --grep convert-svg-to-png", + "test:webp": "npm test -- --grep convert-svg-to-webp", "verify": "npm run bootstrap && npm run lint && npm test", "version:packages": "lerna version --no-git-tag-version --no-push" }, diff --git a/packages/convert-svg-core/README.md b/packages/convert-svg-core/README.md index 064f492..2fa108a 100644 --- a/packages/convert-svg-core/README.md +++ b/packages/convert-svg-core/README.md @@ -35,13 +35,13 @@ you can contribute. ## Implementation -In order to create a new SVG converter that uses `convert-svg-core`, you'll need to create a new sub-directory for your +In order to create a new SVG converter that uses `convert-svg-core`, you'll need to create a new subdirectory for your package under the [packages](https://github.com/neocotic/convert-svg/tree/main/packages) directory. Try to follow the `convert-svg-to-` naming convention for the converter package name. -Take a look at the other packages in this directory to setup the new package directory. They are all very similar, by -design, as the you should just need to provide the minimal amount of information required to support your intended -output format. +Take a look at the other packages in this directory to set up the new package directory. They are all very similar, by +design, as you should just need to provide the minimal amount of information required to support your intended output +format. The most important thing that's needed is a implementation of [convert-svg-core/src/Provider](https://github.com/neocotic/convert-svg/blob/main/packages/convert-svg-core/src/Provider.js). @@ -63,7 +63,7 @@ const MyFormatProvider = require('./MyFormatProvider'); module.exports = new API(new MyFormatProvider()); ``` -Configure this in your `package.json` file and you're API is ready! +Configure this in your `package.json` file and your API is ready! ### CLI @@ -95,7 +95,7 @@ Make sure that your file is executable. For example; $ chmod a+x bin/ ``` -Configure this in your `package.json` file and you're CLI is ready! +Configure this in your `package.json` file and your CLI is ready! ## Testing diff --git a/packages/convert-svg-core/src/Converter.js b/packages/convert-svg-core/src/Converter.js index 12653ba..05bd327 100644 --- a/packages/convert-svg-core/src/Converter.js +++ b/packages/convert-svg-core/src/Converter.js @@ -35,12 +35,15 @@ const util = require('util'); const readFile = util.promisify(fs.readFile); const writeFile = util.promisify(fs.writeFile); +const _allowedAttributeNames = Symbol('allowedAttributeNames'); +const _allowedDeprecatedAttributeNames = Symbol('allowedDeprecatedAttributeNames'); const _browser = Symbol('browser'); const _convert = Symbol('convert'); const _destroyed = Symbol('destroyed'); const _getDimensions = Symbol('getDimensions'); const _getPage = Symbol('getPage'); const _getTempFile = Symbol('getTempFile'); +const _isAttributeAllowed = Symbol('isAttributeAllowed'); const _options = Symbol('options'); const _page = Symbol('page'); const _parseOptions = Symbol('parseOptions'); @@ -63,8 +66,8 @@ const _validate = Symbol('validate'); * it to convert a collection of SVG files to files in another format and then destroy it afterwards. It's not * recommended to keep an instance around for too long, as it will use up resources. * - * Due constraints within Chromium, the SVG input is first written to a temporary HTML file and then navigated to. This - * is because the default page for Chromium is using the chrome protocol so cannot load externally + * Due to constraints within Chromium, the SVG input is first written to a temporary HTML file and then navigated to. + * This is because the default page for Chromium is using the chrome protocol so cannot load externally * referenced files (e.g. that use the file protocol). This temporary file is reused for the lifespan of * each {@link Converter} instance and will be deleted when it is destroyed. * @@ -86,18 +89,82 @@ class Converter { constructor(provider, options) { this[_provider] = provider; this[_options] = Object.assign({}, options); + this[_allowedAttributeNames] = new Set([ + // Core + 'height', + 'preserveAspectRatio', + 'viewBox', + 'width', + 'x', + 'xmlns', + 'y', + // Conditional Processing + 'requiredExtensions', + 'systemLanguage', + // Presentation + 'clip-path', + 'clip-rule', + 'color', + 'color-interpolation', + 'cursor', + 'display', + 'fill', + 'fill-opacity', + 'fill-rule', + 'filter', + 'mask', + 'opacity', + 'overflow', + 'pointer-events', + 'shape-rendering', + 'stroke', + 'stroke-dasharray', + 'stroke-dashoffset', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-miterlimit', + 'stroke-opacity', + 'stroke-width', + 'style', + 'transform', + 'vector-effect', + 'visibility', + // XML + 'xml:lang', + 'xmlns', + 'xmlns:xlink' + ]); + this[_allowedDeprecatedAttributeNames] = new Set([ + // Core + 'baseProfile', + 'version', + 'zoomAndPan', + // Conditional Processing + 'requiredFeatures', + // Presentation + 'clip', + 'color-rendering', + 'enable-background', + // XML + 'xml:base', + 'xml:space' + ]); this[_destroyed] = false; } /** * Converts the specified input SVG into another format using the options provided. * - * input can either be a SVG buffer or string. + * input can either be an SVG buffer or string. * * If the width and/or height cannot be derived from input then they must be provided via their * corresponding options. This method attempts to derive the dimensions from input via any * width/height attributes or its calculated viewBox attribute. * + * Only standard SVG element attributes (excl. event attributes) are allowed and others are stripped from the SVG + * before being converted. This includes deprecated attributes unless the allowDeprecatedAttributes + * option is disabled. This is primarily for security purposes to ensure that malicious code cannot be injected. + * * This method is resolved with the converted output buffer. * * An error will occur if this {@link Converter} has been destroyed, both the baseFile and @@ -129,6 +196,10 @@ class Converter { * options. This method attempts to derive the dimensions from the input file via any * width/height attributes or its calculated viewBox attribute. * + * Only standard SVG element attributes (excl. event attributes) are allowed and others are stripped from the SVG + * before being converted. This includes deprecated attributes unless the allowDeprecatedAttributes + * option is disabled. This is primarily for security purposes to ensure that malicious code cannot be injected. + * * This method is resolved with the path of the converted output file for reference. * * An error will occur if this {@link Converter} has been destroyed, both the baseFile and @@ -190,7 +261,7 @@ class Converter { input = Buffer.isBuffer(input) ? input.toString('utf8') : input; const { provider } = this; - const svg = cheerio.default.html(this[_sanitize](cheerio.load(input, null, false)('svg'))); + const svg = cheerio.default.html(this[_sanitize](cheerio.load(input, null, false)('svg'), options)); if (!svg) { throw new Error('SVG element not found in input. Check the SVG input'); @@ -321,6 +392,11 @@ html { background-color: ${provider.getBackgroundColor(options)}; } }); } + [_isAttributeAllowed](attributeName, options) { + return this[_allowedAttributeNames].has(attributeName) || + (options.allowDeprecatedAttributes && this[_allowedDeprecatedAttributeNames].has(attributeName)); + } + [_parseOptions](options, inputFilePath) { options = Object.assign({}, options); @@ -334,6 +410,10 @@ html { background-color: ${provider.getBackgroundColor(options)}; } options.outputFilePath = path.join(outputDirPath, outputFileName); } + if (typeof options.allowDeprecatedAttributes !== 'boolean') { + options.allowDeprecatedAttributes = true; + } + if (options.baseFile != null && options.baseUrl != null) { throw new Error('Both baseFile and baseUrl options specified. Use only one'); } @@ -385,8 +465,16 @@ html { background-color: ${provider.getBackgroundColor(options)}; } }; } - [_sanitize](svg) { - return svg.removeAttr('onload'); + [_sanitize](svg, options) { + const attributeNames = Object.keys(svg.attr() || {}); + + for (const attributeName of attributeNames) { + if (!this[_isAttributeAllowed](attributeName, options)) { + svg.removeAttr(attributeName); + } + } + + return svg; } async [_setDimensions](page, dimensions) { @@ -457,6 +545,8 @@ module.exports = Converter; * The options that can be passed to {@link Converter#convert}. * * @typedef {Object} Converter~ConvertOptions + * @property {boolean} [allowDeprecatedAttributes=true] - Whether deprecated SVG element attributes should be retained + * in the SVG during conversion. * @property {string} [background] - The background color to be used to fill transparent regions within the SVG. If * omitted, the {@link Provider} will determine the default background color. * @property {string} [baseFile] - The path of the file to be converted into a file URL to use for all relative URLs diff --git a/packages/convert-svg-test-helper/src/fixtures/input/data-url-font.svg b/packages/convert-svg-test-helper/src/fixtures/input/data-url-font.svg index f7c9fb4..a47251d 100644 --- a/packages/convert-svg-test-helper/src/fixtures/input/data-url-font.svg +++ b/packages/convert-svg-test-helper/src/fixtures/input/data-url-font.svg @@ -1,4 +1,4 @@ - + X diff --git a/packages/convert-svg-test-helper/src/fixtures/input/viewbox-only-2.svg b/packages/convert-svg-test-helper/src/fixtures/input/viewbox-only-2.svg index b317841..994ed69 100644 --- a/packages/convert-svg-test-helper/src/fixtures/input/viewbox-only-2.svg +++ b/packages/convert-svg-test-helper/src/fixtures/input/viewbox-only-2.svg @@ -1,6 +1,6 @@ - + diff --git a/packages/convert-svg-test-helper/src/fixtures/input/width-height-viewbox-2.svg b/packages/convert-svg-test-helper/src/fixtures/input/width-height-viewbox-2.svg index faa779f..9898bed 100644 --- a/packages/convert-svg-test-helper/src/fixtures/input/width-height-viewbox-2.svg +++ b/packages/convert-svg-test-helper/src/fixtures/input/width-height-viewbox-2.svg @@ -2,7 +2,7 @@ + width="100px" height="100px" viewBox="206 206 100 100" style="enable-background: new 206 206 100 100" xml:space="preserve"> diff --git a/packages/convert-svg-test-helper/src/fixtures/input/width-height-viewbox-3.svg b/packages/convert-svg-test-helper/src/fixtures/input/width-height-viewbox-3.svg index c37d0b7..e3d1388 100644 --- a/packages/convert-svg-test-helper/src/fixtures/input/width-height-viewbox-3.svg +++ b/packages/convert-svg-test-helper/src/fixtures/input/width-height-viewbox-3.svg @@ -2,7 +2,7 @@ + width="148px" height="35px" viewBox="0.3 0 148 35" style="enable-background: new 0.3 0 148 35" xml:space="preserve"> + width="505px" height="505px" viewBox="0 0 505 505" style="enable-background: new 0 0 505 505" xml:space="preserve"> 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 literal 32387 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 diff --git a/packages/convert-svg-to-png/README.md b/packages/convert-svg-to-png/README.md index 649bbff..1fb267e 100644 --- a/packages/convert-svg-to-png/README.md +++ b/packages/convert-svg-to-png/README.md @@ -66,12 +66,16 @@ The CLI can be used in the following ways: Converts the specified `input` SVG into a PNG using the `options` provided via a headless Chromium instance. -`input` can either be a SVG buffer or string. +`input` can either be an SVG buffer or string. If the width and/or height cannot be derived from `input` then they must be provided via their corresponding options. This method attempts to derive the dimensions from `input` via any `width`/`height` attributes or its calculated `viewBox` attribute. +Only standard SVG element attributes (excl. event attributes) are allowed and others are stripped from the SVG before +being converted. This includes deprecated attributes unless the `allowDeprecatedAttributes` option is disabled. This is +primarily for security purposes to ensure that malicious code cannot be injected. + This method is resolved with the PNG output buffer. An error will occur if both the `baseFile` and `baseUrl` options have been provided, `input` does not contain an SVG @@ -79,16 +83,17 @@ element or no `width` and/or `height` options were provided and this information #### Options -| Option | Type | Default | Description | -|--------------|------------------------|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `background` | String | N/A | Background color to be used to fill transparent regions within the SVG. Will remain transparent if omitted. | -| `baseFile` | String | N/A | Path of the file to be converted into a file URL to use for all relative URLs contained within the SVG. Cannot be used in conjunction with the `baseUrl` option. | -| `baseUrl` | String | `"file:///path/to/cwd"` | Base URL to use for all relative URLs contained within the SVG. Cannot be used in conjunction with the `baseFile` option. | -| `height` | Number/String | N/A | Height of the output to be generated. Derived from SVG input if omitted. | -| `puppeteer` | Object | N/A | Options that are to be passed directly to `puppeteer.launch` when creating the `Browser` instance. | -| `rounding` | `ceil`/`floor`/`round` | `"round"` | Type of rounding to be applied to the width and height. | -| `scale` | Number | `1` | Scale to be applied to the width and height (specified as options or derived). | -| `width` | Number/String | N/A | Width of the output to be generated. Derived from SVG input if omitted. | +| Option | Type | Default | Description | +|-----------------------------|------------------------|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `allowDeprecatedAttributes` | Boolean | `true` | Whether deprecated SVG element attributes should be retained in the SVG during conversion. | +| `background` | String | N/A | Background color to be used to fill transparent regions within the SVG. Will remain transparent if omitted. | +| `baseFile` | String | N/A | Path of the file to be converted into a file URL to use for all relative URLs contained within the SVG. Cannot be used in conjunction with the `baseUrl` option. | +| `baseUrl` | String | `"file:///path/to/cwd"` | Base URL to use for all relative URLs contained within the SVG. Cannot be used in conjunction with the `baseFile` option. | +| `height` | Number/String | N/A | Height of the output to be generated. Derived from SVG input if omitted. | +| `puppeteer` | Object | N/A | Options that are to be passed directly to `puppeteer.launch` when creating the `Browser` instance. | +| `rounding` | `ceil`/`floor`/`round` | `"round"` | Type of rounding to be applied to the width and height. | +| `scale` | Number | `1` | Scale to be applied to the width and height (specified as options or derived). | +| `width` | Number/String | N/A | Width of the output to be generated. Derived from SVG input if omitted. | The `puppeteer` option is not available when calling this method on a `Converter` instance created using `createConverter`. @@ -121,6 +126,10 @@ If the width and/or height cannot be derived from the input file then they must options. This method attempts to derive the dimensions from the input file via any `width`/`height` attributes or its calculated `viewBox` attribute. +Only standard SVG element attributes (excl. event attributes) are allowed and others are stripped from the SVG before +being converted. This includes deprecated attributes unless the `allowDeprecatedAttributes` option is disabled. This is +primarily for security purposes to ensure that malicious code cannot be injected. + This method is resolved with the path of the PNG output file for reference. An error will occur if both the `baseFile` and `baseUrl` options have been provided, the input file does not contain an diff --git a/packages/convert-svg-to-png/test/fixtures/expected/20.png b/packages/convert-svg-to-png/test/fixtures/expected/20.png index 28ae6e69a0f09c68b5882b7f5b41b568d053c4ac..c1e6bb60d070b03b55a266213f2da08dc151abc9 100644 GIT binary patch literal 9509 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 D8bhYN literal 17257 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 diff --git a/packages/convert-svg-to-webp/README.md b/packages/convert-svg-to-webp/README.md index 83ed1a6..67cedfd 100644 --- a/packages/convert-svg-to-webp/README.md +++ b/packages/convert-svg-to-webp/README.md @@ -66,12 +66,16 @@ The CLI can be used in the following ways: Converts the specified `input` SVG into a WEBP using the `options` provided via a headless Chromium instance. -`input` can either be a SVG buffer or string. +`input` can either be an SVG buffer or string. If the width and/or height cannot be derived from `input` then they must be provided via their corresponding options. This method attempts to derive the dimensions from `input` via any `width`/`height` attributes or its calculated `viewBox` attribute. +Only standard SVG element attributes (excl. event attributes) are allowed and others are stripped from the SVG before +being converted. This includes deprecated attributes unless the `allowDeprecatedAttributes` option is disabled. This is +primarily for security purposes to ensure that malicious code cannot be injected. + This method is resolved with the WEBP output buffer. An error will occur if both the `baseFile` and `baseUrl` options have been provided, `input` does not contain an SVG @@ -79,16 +83,17 @@ element or no `width` and/or `height` options were provided and this information #### Options -| Option | Type | Default | Description | -|--------------|------------------------|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `background` | String | N/A | Background color to be used to fill transparent regions within the SVG. Will remain transparent if omitted. | -| `baseFile` | String | N/A | Path of the file to be converted into a file URL to use for all relative URLs contained within the SVG. Cannot be used in conjunction with the `baseUrl` option. | -| `baseUrl` | String | `"file:///path/to/cwd"` | Base URL to use for all relative URLs contained within the SVG. Cannot be used in conjunction with the `baseFile` option. | -| `height` | Number/String | N/A | Height of the output to be generated. Derived from SVG input if omitted. | -| `puppeteer` | Object | N/A | Options that are to be passed directly to `puppeteer.launch` when creating the `Browser` instance. | -| `rounding` | `ceil`/`floor`/`round` | `"round"` | Type of rounding to be applied to the width and height. | -| `scale` | Number | `1` | Scale to be applied to the width and height (specified as options or derived). | -| `width` | Number/String | N/A | Width of the output to be generated. Derived from SVG input if omitted. | +| Option | Type | Default | Description | +|-----------------------------|------------------------|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `allowDeprecatedAttributes` | Boolean | `true` | Whether deprecated SVG element attributes should be retained in the SVG during conversion. | +| `background` | String | N/A | Background color to be used to fill transparent regions within the SVG. Will remain transparent if omitted. | +| `baseFile` | String | N/A | Path of the file to be converted into a file URL to use for all relative URLs contained within the SVG. Cannot be used in conjunction with the `baseUrl` option. | +| `baseUrl` | String | `"file:///path/to/cwd"` | Base URL to use for all relative URLs contained within the SVG. Cannot be used in conjunction with the `baseFile` option. | +| `height` | Number/String | N/A | Height of the output to be generated. Derived from SVG input if omitted. | +| `puppeteer` | Object | N/A | Options that are to be passed directly to `puppeteer.launch` when creating the `Browser` instance. | +| `rounding` | `ceil`/`floor`/`round` | `"round"` | Type of rounding to be applied to the width and height. | +| `scale` | Number | `1` | Scale to be applied to the width and height (specified as options or derived). | +| `width` | Number/String | N/A | Width of the output to be generated. Derived from SVG input if omitted. | The `puppeteer` option is not available when calling this method on a `Converter` instance created using `createConverter`. @@ -121,6 +126,10 @@ If the width and/or height cannot be derived from the input file then they must options. This method attempts to derive the dimensions from the input file via any `width`/`height` attributes or its calculated `viewBox` attribute. +Only standard SVG element attributes (excl. event attributes) are allowed and others are stripped from the SVG before +being converted. This includes deprecated attributes unless the `allowDeprecatedAttributes` option is disabled. This is +primarily for security purposes to ensure that malicious code cannot be injected. + This method is resolved with the path of the WEBP output file for reference. An error will occur if both the `baseFile` and `baseUrl` options have been provided, the input file does not contain an diff --git a/packages/convert-svg-to-webp/test/fixtures/expected/20.webp b/packages/convert-svg-to-webp/test/fixtures/expected/20.webp index 841dd85a60d05323034dc66745cc8a3d3382e270..077c8de8aef1f90be635dd3f8290d703df926c24 100644 GIT binary patch delta 4473 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