summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-08-26 14:39:20 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-08-26 14:39:20 +0000
commit2df40ad22e49d68d217e932515bc780ab7f8096e (patch)
tree6d1d097c7d0a38bf2a37c5b2eeda72e65d7d14d5
parentfc9b097611b0bde6fede8c8f884acd091a464e87 (diff)
downloadgitlab-ce-2df40ad22e49d68d217e932515bc780ab7f8096e.tar.gz
Add latest changes from gitlab-org/security/gitlab@15-2-stable-ee
-rw-r--r--app/assets/javascripts/notebook/cells/output/html.vue9
-rw-r--r--app/helpers/labels_helper.rb2
-rw-r--r--config/initializers/rack_VULNDB-255039_patch.rb35
-rw-r--r--spec/frontend/notebook/cells/output/html_sanitize_fixtures.js4
-rw-r--r--spec/frontend/notebook/cells/output/index_spec.js14
-rw-r--r--spec/helpers/labels_helper_spec.rb8
-rw-r--r--spec/initializers/rack_VULNDB-255039_patch_spec.rb17
7 files changed, 81 insertions, 8 deletions
diff --git a/app/assets/javascripts/notebook/cells/output/html.vue b/app/assets/javascripts/notebook/cells/output/html.vue
index 2d1d8845e41..fdcea300388 100644
--- a/app/assets/javascripts/notebook/cells/output/html.vue
+++ b/app/assets/javascripts/notebook/cells/output/html.vue
@@ -40,6 +40,13 @@ export default {
<template>
<div class="output">
<prompt type="Out" :count="count" :show-output="showOutput" />
- <div v-safe-html:[$options.safeHtmlConfig]="rawCode" class="gl-overflow-auto"></div>
+ <iframe
+ sandbox
+ :srcdoc="rawCode"
+ frameborder="0"
+ scrolling="no"
+ width="100%"
+ class="gl-overflow-auto"
+ ></iframe>
</div>
</template>
diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb
index 877785c9eaf..54d0b45b794 100644
--- a/app/helpers/labels_helper.rb
+++ b/app/helpers/labels_helper.rb
@@ -247,7 +247,7 @@ module LabelsHelper
class="#{css_class}"
data-container="body"
data-html="true"
- #{"style=\"background-color: #{bg_color}\"" if bg_color}
+ #{"style=\"background-color: #{h bg_color}\"" if bg_color}
>#{ERB::Util.html_escape_once(name)}#{suffix}</span>
HTML
end
diff --git a/config/initializers/rack_VULNDB-255039_patch.rb b/config/initializers/rack_VULNDB-255039_patch.rb
new file mode 100644
index 00000000000..b613ed9bdb1
--- /dev/null
+++ b/config/initializers/rack_VULNDB-255039_patch.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+if Gem.loaded_specs['rack'].version >= Gem::Version.new("3.0.0")
+ raise <<~ERR
+ This patch is unnecessary in Rack versions 3.0.0 or newer.
+ Please remove this file and the associated spec.
+
+ See https://github.com/rack/rack/blob/main/CHANGELOG.md#security (issue #1733)
+ ERR
+end
+
+# Patches a cache poisoning attack vector in Rack by not allowing semicolons
+# to delimit query parameters.
+# See https://github.com/rack/rack/issues/1732.
+#
+# Solution is taken from the same issue.
+#
+# The actual patch is due for release in Rack 3.0.0.
+module Rack
+ class Request
+ Helpers.module_eval do
+ # rubocop: disable Naming/MethodName
+ def GET
+ if get_header(RACK_REQUEST_QUERY_STRING) == query_string
+ get_header(RACK_REQUEST_QUERY_HASH)
+ else
+ query_hash = parse_query(query_string, '&') # only allow ampersand here
+ set_header(RACK_REQUEST_QUERY_STRING, query_string)
+ set_header(RACK_REQUEST_QUERY_HASH, query_hash)
+ end
+ end
+ # rubocop: enable Naming/MethodName
+ end
+ end
+end
diff --git a/spec/frontend/notebook/cells/output/html_sanitize_fixtures.js b/spec/frontend/notebook/cells/output/html_sanitize_fixtures.js
index 70c7f56b62f..296d01ddd99 100644
--- a/spec/frontend/notebook/cells/output/html_sanitize_fixtures.js
+++ b/spec/frontend/notebook/cells/output/html_sanitize_fixtures.js
@@ -38,7 +38,7 @@ export default [
'</tr>\n',
'</table>',
].join(''),
- output: '<table>',
+ output: '<table data-myattr=&quot;XSS&quot;>',
},
],
// Note: style is sanitized out
@@ -98,7 +98,7 @@ export default [
'</svg>',
].join(),
output:
- '<svg xmlns="http://www.w3.org/2000/svg" width="388.84pt" version="1.0" id="svg2" height="115.02pt">',
+ '<svg height=&quot;115.02pt&quot; id=&quot;svg2&quot; version=&quot;1.0&quot; width=&quot;388.84pt&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;>',
},
],
];
diff --git a/spec/frontend/notebook/cells/output/index_spec.js b/spec/frontend/notebook/cells/output/index_spec.js
index 4d1d03e5e34..97a7e22be60 100644
--- a/spec/frontend/notebook/cells/output/index_spec.js
+++ b/spec/frontend/notebook/cells/output/index_spec.js
@@ -49,15 +49,17 @@ describe('Output component', () => {
const htmlType = json.cells[4];
createComponent(htmlType.outputs[0]);
- expect(wrapper.findAll('p')).toHaveLength(1);
- expect(wrapper.text()).toContain('test');
+ const iframe = wrapper.find('iframe');
+ expect(iframe.exists()).toBe(true);
+ expect(iframe.element.getAttribute('sandbox')).toBe('');
+ expect(iframe.element.getAttribute('srcdoc')).toBe('<p>test</p>');
});
it('renders multiple raw HTML outputs', () => {
const htmlType = json.cells[4];
createComponent([htmlType.outputs[0], htmlType.outputs[0]]);
- expect(wrapper.findAll('p')).toHaveLength(2);
+ expect(wrapper.findAll('iframe')).toHaveLength(2);
});
});
@@ -84,7 +86,11 @@ describe('Output component', () => {
});
it('renders as an svg', () => {
- expect(wrapper.find('svg').exists()).toBe(true);
+ const iframe = wrapper.find('iframe');
+
+ expect(iframe.exists()).toBe(true);
+ expect(iframe.element.getAttribute('sandbox')).toBe('');
+ expect(iframe.element.getAttribute('srcdoc')).toBe('<svg></svg>');
});
});
diff --git a/spec/helpers/labels_helper_spec.rb b/spec/helpers/labels_helper_spec.rb
index 5efa88a2a7d..90366d7772c 100644
--- a/spec/helpers/labels_helper_spec.rb
+++ b/spec/helpers/labels_helper_spec.rb
@@ -112,6 +112,14 @@ RSpec.describe LabelsHelper do
end
end
+ describe 'render_label_text' do
+ it 'html escapes the bg_color correctly' do
+ xss_payload = '"><img src=x onerror=prompt(1)>'
+ label_text = render_label_text('xss', bg_color: xss_payload)
+ expect(label_text).to include(html_escape(xss_payload))
+ end
+ end
+
describe 'text_color_for_bg' do
it 'uses light text on dark backgrounds' do
expect(text_color_for_bg('#222E2E')).to be_color('#FFFFFF')
diff --git a/spec/initializers/rack_VULNDB-255039_patch_spec.rb b/spec/initializers/rack_VULNDB-255039_patch_spec.rb
new file mode 100644
index 00000000000..754ff2f10e0
--- /dev/null
+++ b/spec/initializers/rack_VULNDB-255039_patch_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Rack VULNDB-255039' do
+ context 'when handling query params in GET requests' do
+ it 'does not treat semicolons as query delimiters' do
+ env = ::Rack::MockRequest.env_for('http://gitlab.com?a=b;c=1')
+
+ query_hash = ::Rack::Request.new(env).GET
+
+ # Prior to this patch, this was splitting around the semicolon, which
+ # would return {"a"=>"b", "c"=>"1"}
+ expect(query_hash).to eq({ "a" => "b;c=1" })
+ end
+ end
+end