|
| 1 | +From c5565ff926fde19da10b7b4b1b9768d5dadb67e1 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Harshit Gupta <guptaharshit@microsoft.com> |
| 3 | +Date: Thu, 19 Sep 2024 06:30:45 -0700 |
| 4 | +Subject: [PATCH] Apply patch for CVE-2024-41946 |
| 5 | + |
| 6 | +--- |
| 7 | + .../lib/rexml/parsers/baseparser.rb | 19 ++++++++++++++++++- |
| 8 | + .../lib/rexml/parsers/pullparser.rb | 4 ++++ |
| 9 | + .../lib/rexml/parsers/sax2parser.rb | 4 ++++ |
| 10 | + 3 files changed, 26 insertions(+), 1 deletion(-) |
| 11 | + |
| 12 | +Based on upstream commit |
| 13 | +https://github.com/ruby/rexml/commit/033d1909a8f259d5a7c53681bcaf14f13bcf0368 |
| 14 | + |
| 15 | +diff --git a/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/baseparser.rb b/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/baseparser.rb |
| 16 | +index ee30e17..30e8d65 100644 |
| 17 | +--- a/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/baseparser.rb |
| 18 | ++++ b/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/baseparser.rb |
| 19 | +@@ -115,6 +115,7 @@ module REXML |
| 20 | + def initialize( source ) |
| 21 | + self.stream = source |
| 22 | + @listeners = [] |
| 23 | ++ @entity_expansion_count = 0 |
| 24 | + end |
| 25 | + |
| 26 | + def add_listener( listener ) |
| 27 | +@@ -122,6 +123,7 @@ module REXML |
| 28 | + end |
| 29 | + |
| 30 | + attr_reader :source |
| 31 | ++ attr_reader :entity_expansion_count |
| 32 | + |
| 33 | + def stream=( source ) |
| 34 | + @source = SourceFactory.create_from( source ) |
| 35 | +@@ -438,7 +440,9 @@ module REXML |
| 36 | + def entity( reference, entities ) |
| 37 | + value = nil |
| 38 | + value = entities[ reference ] if entities |
| 39 | +- if not value |
| 40 | ++ if value |
| 41 | ++ record_entity_expansion |
| 42 | ++ else |
| 43 | + value = DEFAULT_ENTITIES[ reference ] |
| 44 | + value = value[2] if value |
| 45 | + end |
| 46 | +@@ -474,12 +478,17 @@ module REXML |
| 47 | + } |
| 48 | + matches.collect!{|x|x[0]}.compact! |
| 49 | + if matches.size > 0 |
| 50 | ++ sum = 0 |
| 51 | + matches.each do |entity_reference| |
| 52 | + unless filter and filter.include?(entity_reference) |
| 53 | + entity_value = entity( entity_reference, entities ) |
| 54 | + if entity_value |
| 55 | + re = /&#{entity_reference};/ |
| 56 | + rv.gsub!( re, entity_value ) |
| 57 | ++ sum += rv.bytesize |
| 58 | ++ if sum > Security.entity_expansion_text_limit |
| 59 | ++ raise "entity expansion has grown too large" |
| 60 | ++ end |
| 61 | + else |
| 62 | + er = DEFAULT_ENTITIES[entity_reference] |
| 63 | + rv.gsub!( er[0], er[2] ) if er |
| 64 | +@@ -492,6 +501,14 @@ module REXML |
| 65 | + end |
| 66 | + |
| 67 | + private |
| 68 | ++ |
| 69 | ++ def record_entity_expansion |
| 70 | ++ @entity_expansion_count += 1 |
| 71 | ++ if @entity_expansion_count > Security.entity_expansion_limit |
| 72 | ++ raise "number of entity expansions exceeded, processing aborted." |
| 73 | ++ end |
| 74 | ++ end |
| 75 | ++ |
| 76 | + def need_source_encoding_update?(xml_declaration_encoding) |
| 77 | + return false if xml_declaration_encoding.nil? |
| 78 | + return false if /\AUTF-16\z/i =~ xml_declaration_encoding |
| 79 | +diff --git a/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/pullparser.rb b/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/pullparser.rb |
| 80 | +index f8b232a..36b4595 100644 |
| 81 | +--- a/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/pullparser.rb |
| 82 | ++++ b/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/pullparser.rb |
| 83 | +@@ -47,6 +47,10 @@ module REXML |
| 84 | + @listeners << listener |
| 85 | + end |
| 86 | + |
| 87 | ++ def entity_expansion_count |
| 88 | ++ @parser.entity_expansion_count |
| 89 | ++ end |
| 90 | ++ |
| 91 | + def each |
| 92 | + while has_next? |
| 93 | + yield self.pull |
| 94 | +diff --git a/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/sax2parser.rb b/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/sax2parser.rb |
| 95 | +index 6a24ce2..01cb469 100644 |
| 96 | +--- a/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/sax2parser.rb |
| 97 | ++++ b/.bundle/gems/rexml-3.2.5/lib/rexml/parsers/sax2parser.rb |
| 98 | +@@ -22,6 +22,10 @@ module REXML |
| 99 | + @parser.source |
| 100 | + end |
| 101 | + |
| 102 | ++ def entity_expansion_count |
| 103 | ++ @parser.entity_expansion_count |
| 104 | ++ end |
| 105 | ++ |
| 106 | + def add_listener( listener ) |
| 107 | + @parser.add_listener( listener ) |
| 108 | + end |
| 109 | +-- |
| 110 | +2.34.1 |
| 111 | + |
0 commit comments