Vulnerabilities in pkg:pypi/invenio-app

PACKAGE
Advisory Identifier: GHSA-94mf-xfg5-r247
Advisory Summary

CVE-2019-1020006 is a MODERATE (CVSS 6.1) invenio-app vulnerable to host header vulnerability (CWE-74: Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection')) affecting Invenio app libraries in the PyPI ecosystem. The issue involves invenio-app vulnerable to host header injection attack. Remediation is available by upgrading affected packages to version 1.0.6, 1.1.1.

1 Known Advisory Record(s)
Package Vulnerability Intelligence

pkg:pypi/invenio-app

1 Known Advisory Record(s)

Vulnerability advisories affecting package pkg:pypi/invenio-app. Select an advisory below to view technical details or fixes.

Advisory ID CVE / NVD Severity Summary
GHSA-94mf-xfg5-r247 CVE-2019-1020006 MODERATE Invenio-App vulnerable to host header injection attack

CVE-2019-1020006 at a Glance

CVE Identifier CVE-2019-1020006
GHSA Identifier GHSA-94mf-xfg5-r247
Severity MODERATE
CVSS v3.1 Base Score 6.1
CWE Classification CWE-74: Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection')
Affected Product Invenio app
Package Ecosystem PyPI
Published Date
Last Updated

Security Impact

CVSS: 6.1

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required None (PR:N)
User Interaction Required (UI:R)
Scope Changed (S:C)
Confidentiality Low (C:L)
Integrity Low (I:L)
Availability None (A:N)

How to Fix CVE-2019-1020006

To remediate this vulnerability, upgrade all affected Invenio app dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

invenio-app fixed: 1.0.6
pip install invenio-app>=1.0.6
invenio-app fixed: 1.1.1
pip install invenio-app>=1.1.1
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

pip show invenio-app

How to Check if You Are Affected

To determine whether your Python environment is affected by CVE-2019-1020006, inspect your installed packages using pip:

pip show invenio-app

Analyze the terminal output to locate any version of Invenio app in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 1.0.6), your application is affected.

Note: The pip show invenio-app command checks currently installed packages in your active Python environment.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-74: Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection'), where the product constructs all or part of a command, data structure, or record using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify how it is parsed or interpreted when it is sent to a downstream component. In Invenio app, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

## APP_ALLOWED_HOSTS not always preventing host header injection ### Impact A possible host header injection attack have been identified in Invenio-App. For an attack to be possible, all conditions below must be met: 1. Your webserver must have been configured to route all requests to your application. 2. You must have relied on ``APP_ALLOWED_HOSTS`` configuration variable to whitelist allowed host headers. 3. Flask's ``request.host`` must not have been evaluated during request handling. An example of a view which does not evalute ``request.host`` is a simple view using just ``url_for`` to generate an external URL (similar is possible when rendering just a Jinja template): ```python @app.route('/') def index(): return url_for('index_url', _external=True) ``` This happens, because Werkzeug's trusted host feature, which ``APP_ALLOWED_HOSTS`` rely on, does not check the the list of trusted hosts in it's routing system that ``url_for`` is relying on. ### Patches Invenio-App v1.0.6 and v1.1.1 fully fix the issue. Note, we strongly recommend (see [Securing your instance](https://invenio.readthedocs.io/en/latest/deployment/securing-your-instance.html#allowed-hosts)) that you never route requests to your application with a wrong host header. The ``APP_ALLOWED_HOSTS`` configuration variable exists as an extra protective measure because it is easy to misconfigure your web server to allow requests with any host header. ### Workaround 1 - Configure your webserver You should ensure that you never route requests with a wrong host header to your application. The workaround depends on which web server you are using to proxy requests to your application. In general it involves ensuring that the web server has two virtual hosts defined: 1. **Default virtual host**: a dummy default virtual host that by default is used unless the webserver can match the host header to another virtual host (i.e. a catch-all). 2. **Application virtual host**: the application virtual host responsible for proxing requests to the application, and configured to only reply to a whitelist of host headers. Note, for instance in Nginx if you only configure the application virtual host, by default, it will also act as the default virtual host despite you having configured a whitelist of host headers. Below is an example for Nginx. Note for clarity we have only included the virtual host for port 443, but this also extends to virtual hosts running on any other port. ``` # etc/nginx/nginx.conf http { # ... include /etc/nginx/conf.d/*.conf; } ``` **Default virtual host** Notice, the ``server_name`` is ``_`` and the ``listen`` directive has it marked as ``default_server``. ``` # etc/nginx/conf.d/default.conf server { listen 443 default_server; listen [::]:443 default_server; server_name _; # ... return 301 https://www.example.com; } ``` **Application virtual host** Notice, the ``server_name`` is set to the host header whitelist. ``` # etc/nginx/conf.d/app.conf server { listen 443; listen [::]:443; server_name www.example.com; # ... } ``` ### Workaround 2 - Include application snippet We strongly recommend that you use the method described in Workaround 1. If you are not able to upgrade to the patched versions of Invenio-App, you can include the following code snippet in your application to force evaluation of ``request.hosts``. ```python @app.before_request def before_request(): request.host ``` ### For more information If you have any questions or comments about this advisory: * Email us at [info@inveniosoftware.org](mailto:info@inveniosoftware.org)

CVE-2019-1020006 Affected Invenio app Versions

2 component(s)
Fixed Versions:
1.0.61.1.1
Product / Package Ecosystem Affected Versions Fixed Version
invenio-app
PyPI
< 1.0.6
1.0.6
invenio-app
PyPI
≥ 1.1.0
< 1.1.1
All 1 versions
1.1.0
1.1.1

References

Frequently Asked Questions

What is CVE-2019-1020006?
CVE-2019-1020006 is a security vulnerability in Invenio app involving Invenio-App vulnerable to host header injection attack under CWE-74: Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection').
Which Invenio app versions are affected?
Affected versions include releases prior to 1.0.6, 1.1.1 across affected packages: invenio-app.
What version fixes CVE-2019-1020006?
Upgrading to 1.0.6, 1.1.1 (or the latest patched release for your respective branch) resolves the vulnerability.
Is invenio-app affected?
Yes, invenio-app is affected in releases prior to 1.0.6, 1.1.1. Upgrade your dependency to 1.0.6, 1.1.1 or later.
What is the CVSS score of CVE-2019-1020006?
CVE-2019-1020006 has a CVSS v3.1 base score of 6.1 (MODERATE) with vector string CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N.
What CWE is associated with CVE-2019-1020006?
CVE-2019-1020006 is classified under CWE-74: Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection') (The product constructs all or part of a command, data structure, or record using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify how it is parsed or interpreted when it is sent to a downstream component.).
How can I check PyPI dependencies for CVE-2019-1020006?
Run the dependency tree command: 'pip show invenio-app'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-94mf-xfg5-r247",
  "modified" : "2024-09-23T16:00:53Z",
  "published" : "2019-07-16T00:52:10Z",
  "aliases" : [ "CVE-2019-1020006" ],
  "summary" : "Invenio-App vulnerable to host header injection attack",
  "details" : "## APP_ALLOWED_HOSTS not always preventing host header injection\n\n### Impact\nA possible host header injection attack have been identified in Invenio-App.  For an attack to be possible, all conditions below must be met:\n\n1. Your webserver must have been configured to route all requests to your application. \n2. You must have relied on ``APP_ALLOWED_HOSTS`` configuration variable to whitelist allowed host headers.\n3. Flask's ``request.host`` must not have been evaluated during request handling.\n\nAn example of a view which does not evalute ``request.host`` is a simple view using just ``url_for`` to generate an external URL (similar is possible when rendering just a Jinja template):\n\n```python\n@app.route('/')\ndef index():\n    return url_for('index_url', _external=True)\n```\n\nThis happens, because Werkzeug's trusted host feature, which ``APP_ALLOWED_HOSTS`` rely on, does not check the the list of trusted hosts in it's routing system that ``url_for`` is relying on.\n\n### Patches\nInvenio-App v1.0.6 and v1.1.1 fully fix the issue. \n\nNote, we strongly recommend (see [Securing your instance](https://invenio.readthedocs.io/en/latest/deployment/securing-your-instance.html#allowed-hosts)) that you never route requests to your application with a wrong host header.  The ``APP_ALLOWED_HOSTS`` configuration variable exists as an extra protective measure because it is easy to misconfigure your web server to allow requests with any host header. \n\n### Workaround 1 - Configure your webserver\n\nYou should ensure that you never route requests with a wrong host header to your application. The workaround depends on which web server you are using to proxy requests to your application. In general it involves ensuring that the web server has two virtual hosts defined:\n\n1. **Default virtual host**: a dummy default virtual host that by default is used unless the webserver can match the host header to another virtual host (i.e. a catch-all).\n2. **Application virtual host**: the application virtual host responsible for proxing requests to the application, and configured to only reply to a whitelist of host headers.\n\nNote, for instance in Nginx if you only configure the application virtual host, by default, it will also act as the default virtual host despite you having configured a whitelist of host headers.\n\nBelow is an example for Nginx. Note for clarity we have only included the virtual host for port 443, but this also extends to virtual hosts running on any other port.\n```\n# etc/nginx/nginx.conf\nhttp {\n  # ...\n  include /etc/nginx/conf.d/*.conf;\n}\n```\n\n**Default virtual host**\n\nNotice, the ``server_name`` is ``_`` and the ``listen`` directive has it marked as ``default_server``.\n\n```\n# etc/nginx/conf.d/default.conf\nserver {\n  listen 443 default_server;\n  listen [::]:443 default_server;\n  server_name _;\n\n  # ... \n\n  return 301 https://www.example.com;\n}\n```\n\n**Application virtual host**\n\nNotice, the ``server_name`` is set to the host header whitelist.\n\n```\n# etc/nginx/conf.d/app.conf\nserver {\n  listen 443;\n  listen [::]:443;\n  server_name www.example.com;\n\n  # ...\n}\n```\n\n### Workaround 2 - Include application snippet\n\nWe strongly recommend that you use the method described in Workaround 1.\n\nIf you are not able to upgrade to the patched versions of Invenio-App, you can include the following code snippet in your application to force evaluation of ``request.hosts``.\n\n```python\n@app.before_request\ndef before_request():\n    request.host\n```\n\n### For more information\nIf you have any questions or comments about this advisory:\n* Email us at [info@inveniosoftware.org](mailto:info@inveniosoftware.org)",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
  }, {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "PyPI",
      "name" : "invenio-app"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "1.0.6"
      } ]
    } ]
  }, {
    "package" : {
      "ecosystem" : "PyPI",
      "name" : "invenio-app"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "1.1.0"
      }, {
        "fixed" : "1.1.1"
      } ]
    } ],
    "versions" : [ "1.1.0" ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/inveniosoftware/invenio-app/security/advisories/GHSA-94mf-xfg5-r247"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2019-1020006"
  }, {
    "type" : "ADVISORY",
    "url" : "https://github.com/advisories/GHSA-94mf-xfg5-r247"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/inveniosoftware/invenio-app"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/pypa/advisory-database/tree/main/vulns/invenio-app/PYSEC-2019-24.yaml"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-74" ],
    "severity" : "MODERATE",
    "github_reviewed" : true,
    "github_reviewed_at" : "2020-06-16T21:27:30Z",
    "nvd_published_at" : null
  }
}