Uploaded image for project: 'RHEL'
  1. RHEL
  2. RHEL-3260

ansible-core: Python tarfile extraction needs change to avoid a warning (CVE-2007-4559 mitigation)

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Undefined Undefined
    • None
    • rhel-8.9.0
    • ansible-core
    • sst_system_roles
    • False
    • Hide

      None

      Show
      None
    • If docs needed, set a value

      +++ This bug was initially created as a clone of Bug #2203890 +++

      Hello,
      In RHEL 9.3 and 8.9, we're planning to fix the long-standing CVE-2007-4559: Python's `tarfile` module makes it too easy to extract tarballs in an unsafe way.
      Unfortunately, for the CVE to be considered fixed, this needs a behavior change. (If you don't think this is the case, let's bring it up with the security team.)
      Upstream, Python will emit deprecation warnings for 2 releases, but in RHEL we change the behavior now, emit warnings, and provide ways for customers to restore earlier behavior.
      To avoid the warning, software shipped by Red Hat will need a change.

      For more details see upstream PEP 706: https://peps.python.org/pep-0706
      and the Red Hat knowledge base draft: https://access.redhat.com/articles/7004769

      In /usr/lib/python3.11/site-packages/ansible/galaxy/role.py, ansible-core calls `role_tar_file.extract()`. The call will emit a warning by default, and should be changed to something like:

      if hasattr(tarfile, 'data_filter'):

      1. Python with CVE-2007-4559 mitigation (PEP 706)
        role_tar_file.extract(..., filter='data')
        else:
      2. Fallback to a possibly dangerous extraction (before PEP 706)
        role_tar_file.extract(...)

      The 'data' filter above attempts a "safe" extraction, intended for pure data archives. For example:

      • prevents extracting outside the target directory, and to absolute paths (by raising an exception)
      • prevents symlinks pointing outside the target directory, and to absolute paths
      • adjusts permissions (for the owner, only the executable bit is honored)
        See PEP 706 for details: https://peps.python.org/pep-0706/#filters

      If you trust your validation, use `filter='fully_trusted'` instead. That will preserve the existing behavior.
      (I don't know if you are concerned about this tarball being malicious. At first glance, your validation won't prevent malicious tarballs from extracting outside `self.path`. Happy to elaborate.)

      Let me know if you have any questions!

            dsavinea@redhat.com Dimitri Savineau
            cstratak@redhat.com Charalampos Stratakis
            Dimitri Savineau Dimitri Savineau
            Matt Clay Matt Clay (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated: