VYPR
Critical severityGHSA Advisory· Published Apr 10, 2019· Updated Aug 4, 2024

CVE-2019-11068

CVE-2019-11068

Description

libxslt through 1.1.33 allows bypass of a protection mechanism because callers of xsltCheckRead and xsltCheckWrite permit access even upon receiving a -1 error code. xsltCheckRead can return -1 for a crafted URL that is not actually invalid and is subsequently loaded.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
nokogiriRubyGems
< 1.10.31.10.3

Affected products

1

Patches

1
fe034aedcc59

Backport libxslt patch for CVE-2019-11068

https://github.com/sparklemotion/nokogiriMike DalessioApr 22, 2019via ghsa
3 files changed · +128 0
  • CHANGELOG.md+7 0 modified
    @@ -1,5 +1,12 @@
     # Nokogiri Changelog
     
    +## 1.10.3 / 2019-04-22
    +
    +### Security Notes
    +
    +[MRI] Pulled in upstream patch from libxslt that addresses CVE-2019-11068. Full details are available in [#1892](https://github.com/sparklemotion/nokogiri/issues/1892). Note that this patch is not yet (as of 2019-04-22) in an upstream release of libxslt.
    +
    +
     ## 1.10.2 / 2019-03-24
     
     ### Security
    
  • Manifest.txt+1 0 modified
    @@ -236,3 +236,4 @@ lib/xsd/xmlparser/nokogiri.rb
     patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch
     patches/libxml2/0002-Remove-script-macro-support.patch
     patches/libxml2/0003-Update-entities-to-remove-handling-of-ssi.patch
    +patches/libxslt/0001-Fix-security-framework-bypass.patch
    
  • patches/libxslt/0001-Fix-security-framework-bypass.patch+120 0 added
    @@ -0,0 +1,120 @@
    +From e03553605b45c88f0b4b2980adfbbb8f6fca2fd6 Mon Sep 17 00:00:00 2001
    +From: Nick Wellnhofer <wellnhofer@aevum.de>
    +Date: Sun, 24 Mar 2019 09:51:39 +0100
    +Subject: [PATCH] Fix security framework bypass
    +
    +xsltCheckRead and xsltCheckWrite return -1 in case of error but callers
    +don't check for this condition and allow access. With a specially
    +crafted URL, xsltCheckRead could be tricked into returning an error
    +because of a supposedly invalid URL that would still be loaded
    +succesfully later on.
    +
    +Fixes #12.
    +
    +Thanks to Felix Wilhelm for the report.
    +---
    + libxslt/documents.c | 18 ++++++++++--------
    + libxslt/imports.c   |  9 +++++----
    + libxslt/transform.c |  9 +++++----
    + libxslt/xslt.c      |  9 +++++----
    + 4 files changed, 25 insertions(+), 20 deletions(-)
    +
    +diff --git a/libxslt/documents.c b/libxslt/documents.c
    +index 3f3a731..4aad11b 100644
    +--- a/libxslt/documents.c
    ++++ b/libxslt/documents.c
    +@@ -296,10 +296,11 @@ xsltLoadDocument(xsltTransformContextPtr ctxt, const xmlChar *URI) {
    + 	int res;
    + 
    + 	res = xsltCheckRead(ctxt->sec, ctxt, URI);
    +-	if (res == 0) {
    +-	    xsltTransformError(ctxt, NULL, NULL,
    +-		 "xsltLoadDocument: read rights for %s denied\n",
    +-			     URI);
    ++	if (res <= 0) {
    ++            if (res == 0)
    ++                xsltTransformError(ctxt, NULL, NULL,
    ++                     "xsltLoadDocument: read rights for %s denied\n",
    ++                                 URI);
    + 	    return(NULL);
    + 	}
    +     }
    +@@ -372,10 +373,11 @@ xsltLoadStyleDocument(xsltStylesheetPtr style, const xmlChar *URI) {
    + 	int res;
    + 
    + 	res = xsltCheckRead(sec, NULL, URI);
    +-	if (res == 0) {
    +-	    xsltTransformError(NULL, NULL, NULL,
    +-		 "xsltLoadStyleDocument: read rights for %s denied\n",
    +-			     URI);
    ++	if (res <= 0) {
    ++            if (res == 0)
    ++                xsltTransformError(NULL, NULL, NULL,
    ++                     "xsltLoadStyleDocument: read rights for %s denied\n",
    ++                                 URI);
    + 	    return(NULL);
    + 	}
    +     }
    +diff --git a/libxslt/imports.c b/libxslt/imports.c
    +index 874870c..3783b24 100644
    +--- a/libxslt/imports.c
    ++++ b/libxslt/imports.c
    +@@ -130,10 +130,11 @@ xsltParseStylesheetImport(xsltStylesheetPtr style, xmlNodePtr cur) {
    + 	int secres;
    + 
    + 	secres = xsltCheckRead(sec, NULL, URI);
    +-	if (secres == 0) {
    +-	    xsltTransformError(NULL, NULL, NULL,
    +-		 "xsl:import: read rights for %s denied\n",
    +-			     URI);
    ++	if (secres <= 0) {
    ++            if (secres == 0)
    ++                xsltTransformError(NULL, NULL, NULL,
    ++                     "xsl:import: read rights for %s denied\n",
    ++                                 URI);
    + 	    goto error;
    + 	}
    +     }
    +diff --git a/libxslt/transform.c b/libxslt/transform.c
    +index 1379391..0636dbd 100644
    +--- a/libxslt/transform.c
    ++++ b/libxslt/transform.c
    +@@ -3493,10 +3493,11 @@ xsltDocumentElem(xsltTransformContextPtr ctxt, xmlNodePtr node,
    +      */
    +     if (ctxt->sec != NULL) {
    + 	ret = xsltCheckWrite(ctxt->sec, ctxt, filename);
    +-	if (ret == 0) {
    +-	    xsltTransformError(ctxt, NULL, inst,
    +-		 "xsltDocumentElem: write rights for %s denied\n",
    +-			     filename);
    ++	if (ret <= 0) {
    ++            if (ret == 0)
    ++                xsltTransformError(ctxt, NULL, inst,
    ++                     "xsltDocumentElem: write rights for %s denied\n",
    ++                                 filename);
    + 	    xmlFree(URL);
    + 	    xmlFree(filename);
    + 	    return;
    +diff --git a/libxslt/xslt.c b/libxslt/xslt.c
    +index 780a5ad..a234eb7 100644
    +--- a/libxslt/xslt.c
    ++++ b/libxslt/xslt.c
    +@@ -6763,10 +6763,11 @@ xsltParseStylesheetFile(const xmlChar* filename) {
    + 	int res;
    + 
    + 	res = xsltCheckRead(sec, NULL, filename);
    +-	if (res == 0) {
    +-	    xsltTransformError(NULL, NULL, NULL,
    +-		 "xsltParseStylesheetFile: read rights for %s denied\n",
    +-			     filename);
    ++	if (res <= 0) {
    ++            if (res == 0)
    ++                xsltTransformError(NULL, NULL, NULL,
    ++                     "xsltParseStylesheetFile: read rights for %s denied\n",
    ++                                 filename);
    + 	    return(NULL);
    + 	}
    +     }
    +-- 
    +2.17.1
    +
    

Vulnerability mechanics

Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

29

News mentions

0

No linked articles in our index yet.