* CVE-2017-2295 * https://puppet.com/security/cve/cve-2017-2295 * https://github.com/puppetlabs/puppet/commit/06d8c51 Fixes BZ#1452654epel9
parent
6d30d07d32
commit
a3757312cb
@ -0,0 +1,99 @@
|
|||||||
|
From 06d8c51367ca932b9da5d9b01958cfc0adf0f2ea Mon Sep 17 00:00:00 2001
|
||||||
|
From: Josh Cooper <josh@puppet.com>
|
||||||
|
Date: Fri, 28 Apr 2017 12:09:11 -0700
|
||||||
|
Subject: [PATCH] (PUP-7483) Reject all fact formats except PSON
|
||||||
|
|
||||||
|
Previously, an authenticated user could cause the master to execute
|
||||||
|
YAML.load on user-specified input, as well as MessagePack.unpack if the
|
||||||
|
msgpack gem was installed.
|
||||||
|
|
||||||
|
Since 3.2.2, agents have always sent facts as PSON. There is no reason
|
||||||
|
to support other formats, so reject all fact formats except PSON.
|
||||||
|
---
|
||||||
|
lib/puppet/indirector/catalog/compiler.rb | 6 +++--
|
||||||
|
spec/unit/indirector/catalog/compiler_spec.rb | 36 ++++++++++++++++++++++++---
|
||||||
|
2 files changed, 36 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/puppet/indirector/catalog/compiler.rb b/lib/puppet/indirector/catalog/compiler.rb
|
||||||
|
index e4e60ce..16c8353 100644
|
||||||
|
--- a/lib/puppet/indirector/catalog/compiler.rb
|
||||||
|
+++ b/lib/puppet/indirector/catalog/compiler.rb
|
||||||
|
@@ -25,9 +25,11 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
|
||||||
|
# in Network::HTTP::Handler will automagically deserialize the value.
|
||||||
|
if text_facts.is_a?(Puppet::Node::Facts)
|
||||||
|
facts = text_facts
|
||||||
|
- else
|
||||||
|
+ elsif format == 'pson'
|
||||||
|
# We unescape here because the corresponding code in Puppet::Configurer::FactHandler escapes
|
||||||
|
- facts = Puppet::Node::Facts.convert_from(format, CGI.unescape(text_facts))
|
||||||
|
+ facts = Puppet::Node::Facts.convert_from('pson', CGI.unescape(text_facts))
|
||||||
|
+ else
|
||||||
|
+ raise ArgumentError, "Unsupported facts format"
|
||||||
|
end
|
||||||
|
|
||||||
|
unless facts.name == request.key
|
||||||
|
diff --git a/spec/unit/indirector/catalog/compiler_spec.rb b/spec/unit/indirector/catalog/compiler_spec.rb
|
||||||
|
index b134c90..d31eaee 100644
|
||||||
|
--- a/spec/unit/indirector/catalog/compiler_spec.rb
|
||||||
|
+++ b/spec/unit/indirector/catalog/compiler_spec.rb
|
||||||
|
@@ -255,10 +255,10 @@ describe Puppet::Resource::Catalog::Compiler do
|
||||||
|
@facts = Puppet::Node::Facts.new('hostname', "fact" => "value", "architecture" => "i386")
|
||||||
|
end
|
||||||
|
|
||||||
|
- def a_request_that_contains(facts)
|
||||||
|
+ def a_request_that_contains(facts, format = :pson)
|
||||||
|
request = Puppet::Indirector::Request.new(:catalog, :find, "hostname", nil)
|
||||||
|
- request.options[:facts_format] = "pson"
|
||||||
|
- request.options[:facts] = CGI.escape(facts.render(:pson))
|
||||||
|
+ request.options[:facts_format] = format.to_s
|
||||||
|
+ request.options[:facts] = CGI.escape(facts.render(format))
|
||||||
|
request
|
||||||
|
end
|
||||||
|
|
||||||
|
@@ -277,7 +277,7 @@ describe Puppet::Resource::Catalog::Compiler do
|
||||||
|
expect(facts.timestamp).to eq(time)
|
||||||
|
end
|
||||||
|
|
||||||
|
- it "should convert the facts into a fact instance and save it" do
|
||||||
|
+ it "accepts PSON facts" do
|
||||||
|
request = a_request_that_contains(@facts)
|
||||||
|
|
||||||
|
options = {
|
||||||
|
@@ -289,6 +289,34 @@ describe Puppet::Resource::Catalog::Compiler do
|
||||||
|
|
||||||
|
@compiler.extract_facts_from_request(request)
|
||||||
|
end
|
||||||
|
+
|
||||||
|
+ it "rejects YAML facts" do
|
||||||
|
+ request = a_request_that_contains(@facts, :yaml)
|
||||||
|
+
|
||||||
|
+ options = {
|
||||||
|
+ :environment => request.environment,
|
||||||
|
+ :transaction_uuid => request.options[:transaction_uuid],
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ expect {
|
||||||
|
+ @compiler.extract_facts_from_request(request)
|
||||||
|
+ }.to raise_error(ArgumentError, /Unsupported facts format/)
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ it "rejects unknown fact formats" do
|
||||||
|
+ request = a_request_that_contains(@facts)
|
||||||
|
+ request.options[:facts_format] = 'unknown-format'
|
||||||
|
+
|
||||||
|
+ options = {
|
||||||
|
+ :environment => request.environment,
|
||||||
|
+ :transaction_uuid => request.options[:transaction_uuid],
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ expect {
|
||||||
|
+ @compiler.extract_facts_from_request(request)
|
||||||
|
+ }.to raise_error(ArgumentError, /Unsupported facts format/)
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "when finding nodes" do
|
||||||
|
--
|
||||||
|
2.7.4
|
||||||
|
|
Loading…
Reference in new issue