CVE-2019-11068
Critical · 9.8CVSS
9.8
EPSS
5.2%
Published
Apr 10, 2019
CISA due date
—
Cloudanix analysis
A flaw in a common library for handling document stylesheets lets attackers reach files or systems they should not be able to access.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Full Compromise
- Component
- Library
- Class
- Authorization Bypass
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Bypass of xsltCheckRead and xsltCheckWrite protection checks in libxslt, where a -1 error return from xsltCheckRead for a crafted but valid URL still permits subsequent loading, enabling unauthorized file or resource access.
Why it matters to the business
Applications relying on libxslt for XML stylesheet processing face elevated risk of data exposure or remote compromise; the library's widespread use in document handling pipelines amplifies exposure across many systems despite the flaw's age.
How an attack unfolds
An attacker supplies a crafted XSLT stylesheet or input document containing a specially formed URL to an application using the vulnerable libxslt; the check functions return -1 yet the URL is still fetched, bypassing intended access controls and allowing arbitrary reads or writes that can lead to full system compromise.
How to fix it
Update libxslt to the commit e03553605b45c88f0b4b2980adfbbb8f6fca2fd6 or later; rebuild and redeploy all dependent applications; where immediate update is impossible, restrict untrusted XSLT processing and apply network-level controls on outbound fetches during transformation.
How to confirm the fix worked
Confirm the installed libxslt source or binary matches or exceeds commit e03553605b45c88f0b4b2980adfbbb8f6fca2fd6; recompile test cases that previously exercised xsltCheckRead on crafted URLs and verify they now correctly deny access; scan dependency manifests for the updated library version.
Typical attack path
- Identify an application processing untrusted XSLT or XML inputs with libxslt <= 1.1.33
- Craft a stylesheet containing a URL that triggers xsltCheckRead to erroneously return -1 while remaining loadable
- Deliver the malicious stylesheet or input to the target application
- Trigger stylesheet processing to bypass checks and access restricted resources
- Escalate obtained access to read sensitive data or execute further attacks
How to detect it
Review application logs for XSLT transformation activity involving external or unusual URLs; examine process execution and file access around libxslt usage for unexpected resource loads; correlate with web server or application error logs showing malformed URL handling.
What your security team should do
- Prioritize upgrade of libxslt across all environments given the high CVSS and multi-year exposure window
- Inventory applications that invoke XSLT processing and schedule emergency patching
- Implement compensating controls such as input sanitization and outbound network restrictions until patches are applied
- Monitor EPSS and threat intelligence feeds for any late-stage exploit emergence
The record
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
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| RubyGems | nokogiri | 0 | 1.10.3 |
| Alpine:v3.10 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.11 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.12 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.13 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.14 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.15 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.16 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.17 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.18 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.19 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.20 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.21 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.22 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.6 | libxslt | 0 | 1.1.29-r4 |
| Alpine:v3.7 | libxslt | 0 | 1.1.31-r1 |
| Alpine:v3.8 | libxslt | 0 | 1.1.33-r1 |
| Alpine:v3.9 | libxslt | 0 | 1.1.33-r1 |
| Debian:11 | libxslt | 0 | 1.1.32-2.1 |
| Debian:12 | libxslt | 0 | 1.1.32-2.1 |
| Debian:13 | libxslt | 0 | 1.1.32-2.1 |
| Debian:8 | libxslt | 0 | 1.1.28-2+deb8u4 |
| Mageia:6 | libxslt | 0 | 1.1.29-6.1.mga6 |
| Red Hat:enterprise_linux:7::client | libxslt | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::client | libxslt-debuginfo | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::client | libxslt-devel | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::client | libxslt-python | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::computenode | libxslt | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::computenode | libxslt-debuginfo | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::computenode | libxslt-devel | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::computenode | libxslt-python | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::server | libxslt | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::server | libxslt-debuginfo | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::server | libxslt-devel | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::server | libxslt-python | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::workstation | libxslt | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::workstation | libxslt-debuginfo | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::workstation | libxslt-devel | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:7::workstation | libxslt-python | 0 | 0:1.1.28-6.el7 |
| Red Hat:enterprise_linux:8::appstream | libxslt | 0 | 0:1.1.32-5.el8 |
| Red Hat:enterprise_linux:8::appstream | libxslt-debuginfo | 0 | 0:1.1.32-5.el8 |
| Red Hat:enterprise_linux:8::appstream | libxslt-debugsource | 0 | 0:1.1.32-5.el8 |
| Red Hat:enterprise_linux:8::appstream | libxslt-devel | 0 | 0:1.1.32-5.el8 |
| Red Hat:enterprise_linux:8::baseos | libxslt | 0 | 0:1.1.32-5.el8 |
| Red Hat:enterprise_linux:8::baseos | libxslt-debuginfo | 0 | 0:1.1.32-5.el8 |
| Red Hat:enterprise_linux:8::baseos | libxslt-debugsource | 0 | 0:1.1.32-5.el8 |
| Red Hat:enterprise_linux:8::baseos | libxslt-devel | 0 | 0:1.1.32-5.el8 |
| SUSE:Linux Enterprise Desktop 12 SP3 | libxslt | 0 | 1.1.28-17.3.1 |
| SUSE:Linux Enterprise Desktop 12 SP4 | libxslt | 0 | 1.1.28-17.3.1 |
| SUSE:Linux Enterprise Module for Basesystem 15 | libxslt | 0 | 1.1.32-3.3.1 |
| SUSE:Linux Enterprise Module for Basesystem 15 SP1 | libxslt | 0 | 1.1.32-3.3.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP1 | rmt-server | 0 | 2.3.1-3.3.3 |
| SUSE:Linux Enterprise Module for Server Applications 15 | rmt-server | 0 | 2.1.4-3.17.1 |
| SUSE:Linux Enterprise Module for Server Applications 15 SP1 | rmt-server | 0 | 2.3.1-3.3.3 |
| SUSE:Linux Enterprise Server 12 SP3 | libxslt | 0 | 1.1.28-17.3.1 |
| SUSE:Linux Enterprise Server 12 SP4 | libxslt | 0 | 1.1.28-17.3.1 |
| SUSE:Linux Enterprise Server for SAP Applications 12 SP3 | libxslt | 0 | 1.1.28-17.3.1 |
| SUSE:Linux Enterprise Server for SAP Applications 12 SP4 | libxslt | 0 | 1.1.28-17.3.1 |
| SUSE:Linux Enterprise Software Development Kit 12 SP3 | libxslt | 0 | 1.1.28-17.3.1 |
| SUSE:Linux Enterprise Software Development Kit 12 SP4 | libxslt | 0 | 1.1.28-17.3.1 |
| Ubuntu:14.04:LTS | libxslt | 0 | 1.1.28-2ubuntu0.2 |
| Ubuntu:16.04:LTS | libxslt | 0 | 1.1.28-2.1ubuntu0.2 |
| Ubuntu:18.04:LTS | libxslt | 0 | 1.1.29-5ubuntu0.1 |
| openSUSE:Leap 15.0 | libxslt | 0 | 1.1.32-lp150.2.3.1 |
| openSUSE:Leap 15.0 | libxslt-python | 0 | 1.1.32-lp150.2.3.1 |
| openSUSE:Leap 15.0 | rmt-server | 0 | 2.1.4-lp150.2.16.1 |
| openSUSE:Leap 15.1 | libxslt | 0 | 1.1.32-lp151.3.3.1 |
| openSUSE:Leap 15.1 | libxslt-python | 0 | 1.1.32-lp151.3.3.1 |
| openSUSE:Leap 15.1 | rmt-server | 0 | 2.3.1-lp151.2.3.1 |
| openSUSE:Tumbleweed | libxslt | 0 | 1.1.34-3.2 |
| openSUSE:Tumbleweed | rmt-server | 0 | 2.6.13-1.1 |
| openSUSE:Tumbleweed | ruby3.2-rubygem-nokogiri | 0 | 1.13.9-1.7 |
| openSUSE:Tumbleweed | rubygem-nokogiri | 0 | 1.13.3-1.1 |
| openSUSE:Tumbleweed | rubygem-nokogiri | 0 | 1.15.5-1.5 |
| openSUSE:Tumbleweed | rubygem-nokogiri | 0 | 1.18.2-1.1 |
| openSUSE:Tumbleweed | rubygem-nokogiri | 0 | 1.18.9-1.4 |
Related vulnerabilities
- GHSA-vcc3-rw6f-jv97 Duplicate Advisory: Use-after-free in libxml2 via Nokogiri::XML::Reader Also affects nokogiri
- GHSA-pxvg-2qj5-37jq Nokogiri updates packaged libxml2 to v2.10.4 to resolve multiple CVEs Also affects nokogiri
- GHSA-2qc6-mcvw-92cw Update bundled libxml2 to v2.10.3 to resolve multiple CVEs Also affects nokogiri
- GHSA-cgx6-hpwq-fhv5 Integer Overflow or Wraparound in libxml2 affects Nokogiri Also affects nokogiri
- GHSA-gx8x-g87m-h5q6 Denial of Service (DoS) in Nokogiri on JRuby Also affects nokogiri
- GHSA-xxx9-3xcr-gjj3 XML Injection in Xerces Java affects Nokogiri Also affects nokogiri
- GHSA-v6gp-9mmm-c6p5 Out-of-bounds Write in zlib affects Nokogiri Also affects nokogiri
- GHSA-fq42-c5rg-92c2 Vulnerable dependencies in Nokogiri Also affects nokogiri