Gentoo Archives: gentoo-commits

From: Sam James <sam@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] repo/gentoo:master commit in: dev-libs/libxslt/, dev-libs/libxslt/files/
Date: Fri, 29 Oct 2021 15:28:43
Message-Id: 1635521304.76c0287bfb98ed25b63c9ad892fa6a1ee1c87dc0.sam@gentoo
1 commit: 76c0287bfb98ed25b63c9ad892fa6a1ee1c87dc0
2 Author: Sam James <sam <AT> gentoo <DOT> org>
3 AuthorDate: Fri Oct 29 15:26:36 2021 +0000
4 Commit: Sam James <sam <AT> gentoo <DOT> org>
5 CommitDate: Fri Oct 29 15:28:24 2021 +0000
6 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=76c0287b
7
8 dev-libs/libxslt: fix tests with newer libxml2; patch CVE-2021-30560
9
10 Note that we're now depending on >= .11 of libxml2 just to be safe,
11 even though some of the patches seem to have compatibility guards,
12 not all do - and upstream develop these in tandem anyway.
13
14 Closes: https://bugs.gentoo.org/790218
15 Bug: https://bugs.gentoo.org/820722
16 Signed-off-by: Sam James <sam <AT> gentoo.org>
17
18 .../files/libxslt-1.1.34-CVE-2021-30560.patch | 194 +++++++++++++++++++++
19 .../files/libxslt-1.1.34-libxml2-2.9.12.patch | 120 +++++++++++++
20 dev-libs/libxslt/libxslt-1.1.34-r2.ebuild | 72 ++++++++
21 3 files changed, 386 insertions(+)
22
23 diff --git a/dev-libs/libxslt/files/libxslt-1.1.34-CVE-2021-30560.patch b/dev-libs/libxslt/files/libxslt-1.1.34-CVE-2021-30560.patch
24 new file mode 100644
25 index 00000000000..dcda176c513
26 --- /dev/null
27 +++ b/dev-libs/libxslt/files/libxslt-1.1.34-CVE-2021-30560.patch
28 @@ -0,0 +1,194 @@
29 +https://gitlab.gnome.org/GNOME/libxslt/-/issues/56
30 +https://gitlab.gnome.org/GNOME/libxslt/-/commit/50f9c9cd3b7dfe9b3c8c795247752d1fdcadcac8
31 +https://gitlab.gnome.org/GNOME/libxslt/-/issues/51
32 +https://bugs.gentoo.org/790218
33 +
34 +From: Nick Wellnhofer <wellnhofer@×××××.de>
35 +Date: Sat, 12 Jun 2021 20:02:53 +0200
36 +Subject: [PATCH] Fix use-after-free in xsltApplyTemplates
37 +
38 +xsltApplyTemplates without a select expression could delete nodes in
39 +the source document.
40 +
41 +1. Text nodes with strippable whitespace
42 +
43 +Whitespace from input documents is already stripped, so there's no
44 +need to strip it again. Under certain circumstances, xsltApplyTemplates
45 +could be fooled into deleting text nodes that are still referenced,
46 +resulting in a use-after-free.
47 +
48 +2. The DTD
49 +
50 +The DTD was only unlinked, but there's no good reason to do this just
51 +now. Maybe it was meant as a micro-optimization.
52 +
53 +3. Unknown nodes
54 +
55 +Useless and dangerous as well, especially with XInclude nodes.
56 +See https://gitlab.gnome.org/GNOME/libxml2/-/issues/268
57 +
58 +Simply stop trying to uselessly delete nodes when applying a template.
59 +This part of the code is probably a leftover from a time where
60 +xsltApplyStripSpaces wasn't implemented yet. Also note that
61 +xsltApplyTemplates with a select expression never tried to delete
62 +nodes.
63 +
64 +Also stop xsltDefaultProcessOneNode from deleting nodes for the same
65 +reasons.
66 +
67 +This fixes CVE-2021-30560.
68 +--- a/libxslt/transform.c
69 ++++ b/libxslt/transform.c
70 +@@ -1895,7 +1895,7 @@ static void
71 + xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node,
72 + xsltStackElemPtr params) {
73 + xmlNodePtr copy;
74 +- xmlNodePtr delete = NULL, cur;
75 ++ xmlNodePtr cur;
76 + int nbchild = 0, oldSize;
77 + int childno = 0, oldPos;
78 + xsltTemplatePtr template;
79 +@@ -1968,54 +1968,13 @@ xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node,
80 + return;
81 + }
82 + /*
83 +- * Handling of Elements: first pass, cleanup and counting
84 ++ * Handling of Elements: first pass, counting
85 + */
86 + cur = node->children;
87 + while (cur != NULL) {
88 +- switch (cur->type) {
89 +- case XML_TEXT_NODE:
90 +- case XML_CDATA_SECTION_NODE:
91 +- case XML_DOCUMENT_NODE:
92 +- case XML_HTML_DOCUMENT_NODE:
93 +- case XML_ELEMENT_NODE:
94 +- case XML_PI_NODE:
95 +- case XML_COMMENT_NODE:
96 +- nbchild++;
97 +- break;
98 +- case XML_DTD_NODE:
99 +- /* Unlink the DTD, it's still reachable using doc->intSubset */
100 +- if (cur->next != NULL)
101 +- cur->next->prev = cur->prev;
102 +- if (cur->prev != NULL)
103 +- cur->prev->next = cur->next;
104 +- break;
105 +- default:
106 +-#ifdef WITH_XSLT_DEBUG_PROCESS
107 +- XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext,
108 +- "xsltDefaultProcessOneNode: skipping node type %d\n",
109 +- cur->type));
110 +-#endif
111 +- delete = cur;
112 +- }
113 ++ if (IS_XSLT_REAL_NODE(cur))
114 ++ nbchild++;
115 + cur = cur->next;
116 +- if (delete != NULL) {
117 +-#ifdef WITH_XSLT_DEBUG_PROCESS
118 +- XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext,
119 +- "xsltDefaultProcessOneNode: removing ignorable blank node\n"));
120 +-#endif
121 +- xmlUnlinkNode(delete);
122 +- xmlFreeNode(delete);
123 +- delete = NULL;
124 +- }
125 +- }
126 +- if (delete != NULL) {
127 +-#ifdef WITH_XSLT_DEBUG_PROCESS
128 +- XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext,
129 +- "xsltDefaultProcessOneNode: removing ignorable blank node\n"));
130 +-#endif
131 +- xmlUnlinkNode(delete);
132 +- xmlFreeNode(delete);
133 +- delete = NULL;
134 + }
135 +
136 + /*
137 +@@ -4864,7 +4823,7 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node,
138 + xsltStylePreCompPtr comp = (xsltStylePreCompPtr) castedComp;
139 + #endif
140 + int i;
141 +- xmlNodePtr cur, delNode = NULL, oldContextNode;
142 ++ xmlNodePtr cur, oldContextNode;
143 + xmlNodeSetPtr list = NULL, oldList;
144 + xsltStackElemPtr withParams = NULL;
145 + int oldXPProximityPosition, oldXPContextSize;
146 +@@ -4998,73 +4957,9 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node,
147 + else
148 + cur = NULL;
149 + while (cur != NULL) {
150 +- switch (cur->type) {
151 +- case XML_TEXT_NODE:
152 +- if ((IS_BLANK_NODE(cur)) &&
153 +- (cur->parent != NULL) &&
154 +- (cur->parent->type == XML_ELEMENT_NODE) &&
155 +- (ctxt->style->stripSpaces != NULL)) {
156 +- const xmlChar *val;
157 +-
158 +- if (cur->parent->ns != NULL) {
159 +- val = (const xmlChar *)
160 +- xmlHashLookup2(ctxt->style->stripSpaces,
161 +- cur->parent->name,
162 +- cur->parent->ns->href);
163 +- if (val == NULL) {
164 +- val = (const xmlChar *)
165 +- xmlHashLookup2(ctxt->style->stripSpaces,
166 +- BAD_CAST "*",
167 +- cur->parent->ns->href);
168 +- }
169 +- } else {
170 +- val = (const xmlChar *)
171 +- xmlHashLookup2(ctxt->style->stripSpaces,
172 +- cur->parent->name, NULL);
173 +- }
174 +- if ((val != NULL) &&
175 +- (xmlStrEqual(val, (xmlChar *) "strip"))) {
176 +- delNode = cur;
177 +- break;
178 +- }
179 +- }
180 +- /* Intentional fall-through */
181 +- case XML_ELEMENT_NODE:
182 +- case XML_DOCUMENT_NODE:
183 +- case XML_HTML_DOCUMENT_NODE:
184 +- case XML_CDATA_SECTION_NODE:
185 +- case XML_PI_NODE:
186 +- case XML_COMMENT_NODE:
187 +- xmlXPathNodeSetAddUnique(list, cur);
188 +- break;
189 +- case XML_DTD_NODE:
190 +- /* Unlink the DTD, it's still reachable
191 +- * using doc->intSubset */
192 +- if (cur->next != NULL)
193 +- cur->next->prev = cur->prev;
194 +- if (cur->prev != NULL)
195 +- cur->prev->next = cur->next;
196 +- break;
197 +- case XML_NAMESPACE_DECL:
198 +- break;
199 +- default:
200 +-#ifdef WITH_XSLT_DEBUG_PROCESS
201 +- XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext,
202 +- "xsltApplyTemplates: skipping cur type %d\n",
203 +- cur->type));
204 +-#endif
205 +- delNode = cur;
206 +- }
207 ++ if (IS_XSLT_REAL_NODE(cur))
208 ++ xmlXPathNodeSetAddUnique(list, cur);
209 + cur = cur->next;
210 +- if (delNode != NULL) {
211 +-#ifdef WITH_XSLT_DEBUG_PROCESS
212 +- XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext,
213 +- "xsltApplyTemplates: removing ignorable blank cur\n"));
214 +-#endif
215 +- xmlUnlinkNode(delNode);
216 +- xmlFreeNode(delNode);
217 +- delNode = NULL;
218 +- }
219 + }
220 + }
221 +
222 +GitLab
223
224 diff --git a/dev-libs/libxslt/files/libxslt-1.1.34-libxml2-2.9.12.patch b/dev-libs/libxslt/files/libxslt-1.1.34-libxml2-2.9.12.patch
225 new file mode 100644
226 index 00000000000..635fb576d3d
227 --- /dev/null
228 +++ b/dev-libs/libxslt/files/libxslt-1.1.34-libxml2-2.9.12.patch
229 @@ -0,0 +1,120 @@
230 +https://gitlab.gnome.org/GNOME/libxslt/-/commit/9ae2f94df1721e002941b40665efb762aefcea1a
231 +https://gitlab.gnome.org/GNOME/libxslt/-/commit/824657768aea2cce9c23e72ba8085cb5e44350c7
232 +https://gitlab.gnome.org/GNOME/libxslt/-/commit/77c26bad0433541f486b1e7ced44ca9979376908
233 +
234 +From: Nick Wellnhofer <wellnhofer@×××××.de>
235 +Date: Mon, 17 Aug 2020 03:42:11 +0200
236 +Subject: [PATCH] Stop using maxParserDepth XPath limit
237 +
238 +This will be removed again from libxml2.
239 +--- a/tests/fuzz/fuzz.c
240 ++++ b/tests/fuzz/fuzz.c
241 +@@ -183,8 +183,7 @@ xsltFuzzXPathInit(int *argc_p ATTRIBUTE_UNUSED, char ***argv_p,
242 + xpctxt = tctxt->xpathCtxt;
243 +
244 + /* Resource limits to avoid timeouts and call stack overflows */
245 +- xpctxt->maxParserDepth = 15;
246 +- xpctxt->maxDepth = 100;
247 ++ xpctxt->maxDepth = 500;
248 + xpctxt->opLimit = 500000;
249 +
250 + /* Test namespaces used in xpath.xml */
251 +@@ -317,8 +316,7 @@ xsltFuzzXsltInit(int *argc_p ATTRIBUTE_UNUSED, char ***argv_p,
252 +
253 + static void
254 + xsltSetXPathResourceLimits(xmlXPathContextPtr ctxt) {
255 +- ctxt->maxParserDepth = 15;
256 +- ctxt->maxDepth = 100;
257 ++ ctxt->maxDepth = 200;
258 + ctxt->opLimit = 100000;
259 + }
260 +
261 +From: Nick Wellnhofer <wellnhofer@×××××.de>
262 +Date: Mon, 17 Aug 2020 04:27:13 +0200
263 +Subject: [PATCH] Transfer XPath limits to XPtr context
264 +
265 +Expressions like document('doc.xml#xpointer(evil_expr)') ignored the
266 +XPath limits.
267 +--- a/libxslt/functions.c
268 ++++ b/libxslt/functions.c
269 +@@ -178,10 +178,22 @@ xsltDocumentFunctionLoadDocument(xmlXPathParserContextPtr ctxt, xmlChar* URI)
270 + goto out_fragment;
271 + }
272 +
273 ++#if LIBXML_VERSION >= 20911 || \
274 ++ defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
275 ++ xptrctxt->opLimit = ctxt->context->opLimit;
276 ++ xptrctxt->opCount = ctxt->context->opCount;
277 ++ xptrctxt->maxDepth = ctxt->context->maxDepth - ctxt->context->depth;
278 ++
279 ++ resObj = xmlXPtrEval(fragment, xptrctxt);
280 ++
281 ++ ctxt->context->opCount = xptrctxt->opCount;
282 ++#else
283 + resObj = xmlXPtrEval(fragment, xptrctxt);
284 +- xmlXPathFreeContext(xptrctxt);
285 + #endif
286 +
287 ++ xmlXPathFreeContext(xptrctxt);
288 ++#endif /* LIBXML_XPTR_ENABLED */
289 ++
290 + if (resObj == NULL)
291 + goto out_fragment;
292 +
293 +From: Nick Wellnhofer <wellnhofer@×××××.de>
294 +Date: Wed, 26 Aug 2020 00:34:38 +0200
295 +Subject: [PATCH] Don't set maxDepth in XPath contexts
296 +
297 +The maximum recursion depth is hardcoded in libxml2 now.
298 +--- a/libxslt/functions.c
299 ++++ b/libxslt/functions.c
300 +@@ -182,7 +182,7 @@ xsltDocumentFunctionLoadDocument(xmlXPathParserContextPtr ctxt, xmlChar* URI)
301 + defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
302 + xptrctxt->opLimit = ctxt->context->opLimit;
303 + xptrctxt->opCount = ctxt->context->opCount;
304 +- xptrctxt->maxDepth = ctxt->context->maxDepth - ctxt->context->depth;
305 ++ xptrctxt->depth = ctxt->context->depth;
306 +
307 + resObj = xmlXPtrEval(fragment, xptrctxt);
308 +
309 +--- a/tests/fuzz/fuzz.c
310 ++++ b/tests/fuzz/fuzz.c
311 +@@ -183,7 +183,6 @@ xsltFuzzXPathInit(int *argc_p ATTRIBUTE_UNUSED, char ***argv_p,
312 + xpctxt = tctxt->xpathCtxt;
313 +
314 + /* Resource limits to avoid timeouts and call stack overflows */
315 +- xpctxt->maxDepth = 500;
316 + xpctxt->opLimit = 500000;
317 +
318 + /* Test namespaces used in xpath.xml */
319 +@@ -314,12 +313,6 @@ xsltFuzzXsltInit(int *argc_p ATTRIBUTE_UNUSED, char ***argv_p,
320 + return 0;
321 + }
322 +
323 +-static void
324 +-xsltSetXPathResourceLimits(xmlXPathContextPtr ctxt) {
325 +- ctxt->maxDepth = 200;
326 +- ctxt->opLimit = 100000;
327 +-}
328 +-
329 + xmlChar *
330 + xsltFuzzXslt(const char *data, size_t size) {
331 + xmlDocPtr xsltDoc;
332 +@@ -349,7 +342,7 @@ xsltFuzzXslt(const char *data, size_t size) {
333 + xmlFreeDoc(xsltDoc);
334 + return NULL;
335 + }
336 +- xsltSetXPathResourceLimits(sheet->xpathCtxt);
337 ++ sheet->xpathCtxt->opLimit = 100000;
338 + sheet->xpathCtxt->opCount = 0;
339 + if (xsltParseStylesheetUser(sheet, xsltDoc) != 0) {
340 + xsltFreeStylesheet(sheet);
341 +@@ -361,7 +354,7 @@ xsltFuzzXslt(const char *data, size_t size) {
342 + xsltSetCtxtSecurityPrefs(sec, ctxt);
343 + ctxt->maxTemplateDepth = 100;
344 + ctxt->opLimit = 20000;
345 +- xsltSetXPathResourceLimits(ctxt->xpathCtxt);
346 ++ ctxt->xpathCtxt->opLimit = 100000;
347 + ctxt->xpathCtxt->opCount = sheet->xpathCtxt->opCount;
348 +
349 + result = xsltApplyStylesheetUser(sheet, doc, NULL, NULL, NULL, ctxt);
350
351 diff --git a/dev-libs/libxslt/libxslt-1.1.34-r2.ebuild b/dev-libs/libxslt/libxslt-1.1.34-r2.ebuild
352 new file mode 100644
353 index 00000000000..df1a9b5e042
354 --- /dev/null
355 +++ b/dev-libs/libxslt/libxslt-1.1.34-r2.ebuild
356 @@ -0,0 +1,72 @@
357 +# Copyright 1999-2021 Gentoo Authors
358 +# Distributed under the terms of the GNU General Public License v2
359 +
360 +EAPI=7
361 +
362 +VERIFY_SIG_OPENPGP_KEY_PATH=${BROOT}/usr/share/openpgp-keys/danielveillard.asc
363 +inherit libtool multilib-minimal verify-sig
364 +
365 +# Note: Please bump this in sync with dev-libs/libxml2.
366 +DESCRIPTION="XSLT libraries and tools"
367 +HOMEPAGE="http://www.xmlsoft.org/ https://gitlab.gnome.org/GNOME/libxslt"
368 +SRC_URI="ftp://xmlsoft.org/${PN}/${P}.tar.gz"
369 +SRC_URI+=" verify-sig? ( ftp://xmlsoft.org/${PN}/${P}.tar.gz.asc )"
370 +
371 +LICENSE="MIT"
372 +SLOT="0"
373 +KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
374 +IUSE="crypt debug examples static-libs elibc_Darwin"
375 +
376 +BDEPEND=">=virtual/pkgconfig-1
377 + verify-sig? ( app-crypt/openpgp-keys-danielveillard )"
378 +RDEPEND="
379 + >=dev-libs/libxml2-2.9.11:2[${MULTILIB_USEDEP}]
380 + crypt? ( >=dev-libs/libgcrypt-1.5.3:0=[${MULTILIB_USEDEP}] )
381 +"
382 +DEPEND="${RDEPEND}"
383 +
384 +MULTILIB_CHOST_TOOLS=(
385 + /usr/bin/xslt-config
386 +)
387 +
388 +MULTILIB_WRAPPED_HEADERS=(
389 + /usr/include/libxslt/xsltconfig.h
390 +)
391 +
392 +PATCHES=(
393 + "${FILESDIR}"/${P}-libxml2-2.9.12.patch
394 + "${FILESDIR}"/${P}-CVE-2021-30560.patch
395 +)
396 +
397 +src_prepare() {
398 + default
399 +
400 + DOCS=( AUTHORS ChangeLog FEATURES NEWS README TODO )
401 +
402 + # Prefix always needs elibtoolize if not eautoreconf'd.
403 + elibtoolize
404 +}
405 +
406 +multilib_src_configure() {
407 + # Python bindings were dropped as they were Python 2 only at the time
408 + ECONF_SOURCE="${S}" econf \
409 + --with-html-dir="${EPREFIX}"/usr/share/doc/${PF} \
410 + --with-html-subdir=html \
411 + --without-python \
412 + $(use_with crypt crypto) \
413 + $(use_with debug) \
414 + $(use_with debug mem-debug) \
415 + $(use_enable static-libs static) \
416 + "$@"
417 +}
418 +
419 +multilib_src_install() {
420 + # "default" does not work here - docs are installed by multilib_src_install_all
421 + emake DESTDIR="${D}" install
422 +}
423 +
424 +multilib_src_install_all() {
425 + einstalldocs
426 +
427 + find "${ED}" -type f -name "*.la" -delete || die
428 +}