File CVE-2018-8048.patch of Package rubygem-loofah.12342

--- loofah-2.0.2/lib/loofah.orig.rb	2018-11-06 10:06:09.775147887 +0100
+++ loofah-2.0.2/lib/loofah.rb	2018-11-06 10:06:22.895069326 +0100
@@ -6,6 +6,7 @@
 require 'loofah/elements'
 
 require 'loofah/html5/whitelist'
+require 'loofah/html5/libxml2_workarounds'
 require 'loofah/html5/scrub'
 
 require 'loofah/scrubber'
--- /dev/null	2018-10-08 13:41:49.034376627 +0200
+++ loofah-2.0.2/lib/loofah/html5/libxml2_workarounds.rb	2018-11-06 08:56:11.700332872 +0100
@@ -0,0 +1,26 @@
+# coding: utf-8
+require 'set'
+
+module Loofah
+  #
+  #  constants related to working around unhelpful libxml2 behavior
+  #
+  #  ಠ_ಠ
+  #
+  module LibxmlWorkarounds
+    #
+    #  these attributes and qualifying parent tags are determined by the code at:
+    #
+    #    https://git.gnome.org/browse/libxml2/tree/HTMLtree.c?h=v2.9.2#n714
+    #
+    #  see comments about CVE-2018-8048 within the tests for more information
+    #
+    BROKEN_ESCAPING_ATTRIBUTES = Set.new %w[
+        href
+        action
+        src
+        name
+      ]
+    BROKEN_ESCAPING_ATTRIBUTES_QUALIFYING_TAG = {"name" => "a"}
+  end
+end
--- loofah-2.0.2/lib/loofah/html5/scrub.rb.orig	2019-08-22 08:18:37.360925203 +0200
+++ loofah-2.0.2/lib/loofah/html5/scrub.rb	2019-08-22 08:18:45.220927905 +0200
@@ -54,6 +54,8 @@
           node.attribute_nodes.each do |attr_node|
             node.remove_attribute(attr_node.name) if attr_node.value !~ /[^[:space:]]/
           end
+
+          force_correct_attribute_escaping! node
         end

         def scrub_css_attribute node
@@ -89,6 +91,32 @@
           style = clean.join(' ')
         end

+        #
+        #  libxml2 >= 2.9.2 fails to escape comments within some attributes.
+        #
+        #  see comments about CVE-2018-8048 within the tests for more information
+        #
+        def force_correct_attribute_escaping! node
+          return unless Nokogiri::VersionInfo.instance.libxml2?
+
+          node.attribute_nodes.each do |attr_node|
+            next unless LibxmlWorkarounds::BROKEN_ESCAPING_ATTRIBUTES.include?(attr_node.name)
+
+            tag_name = LibxmlWorkarounds::BROKEN_ESCAPING_ATTRIBUTES_QUALIFYING_TAG[attr_node.name]
+            next unless tag_name.nil? || tag_name == node.name
+
+            #
+            #  this block is just like CGI.escape in Ruby 2.4, but
+            #  only encodes space and double-quote, to mimic
+            #  pre-2.9.2 behavior
+            #
+            encoding = attr_node.value.encoding
+            attr_node.value = attr_node.value.gsub(/[ "]/) do |m|
+              '%' + m.unpack('H2' * m.bytesize).join('%').upcase
+            end.force_encoding(encoding)
+          end
+        end
+
       end

     end
--- loofah-2.0.2/loofah-2.0.2.orig.gemspec	2018-11-26 13:56:18.246596949 +0100
+++ loofah-2.0.2/loofah-2.0.2.gemspec	2018-11-26 13:57:41.894185408 +0100
@@ -60,5 +60,7 @@
     s.add_dependency(%q<hoe-git>, [">= 0"])
     s.add_dependency(%q<hoe>, ["~> 3.13"])
   end
+
+  s.files << 'lib/loofah/html5/libxml2_workarounds.rb'
 end

openSUSE Build Service is sponsored by