flawopen.com/Incidents/log4shell-jndi-injection-december-2021
Log4Shell (CVE-2021-44228): penyebab dan perbaikan
CVE-2021-44228 membuat data log memicu lookup Log4j 2 dan pemuatan kelas melalui JNDI. Perbarui Log4j dan inventarisasi salinan tertanam.[1], [2], [4]
Sebuah kantor punya juru tulis yang tugasnya hanya mencatat apa yang dikatakan tamu. Seseorang menemukan bahwa jika tamu mengucapkan kalimat tertentu, juru tulis berhenti menulis, pergi ke alamat yang disebut dalam kalimat itu, mengambil amplop tersegel dari orang asing, lalu mengikuti instruksi di dalamnya. Padahal juru tulis itu hanya seharusnya mencatat.[1]
Konsep Kunci & Istilah
Lookup pesan- Fitur Log4j 2 yang mengganti ekspresi ${...} di dalam pesan log dengan nilai saat pencatatan. Sebelum 2.15.0, fitur ini juga berlaku pada data di dalam pesan, bukan hanya pada pola yang dikonfigurasi.[1]
JNDI- Java Naming and Directory Interface, API untuk mencari objek di layanan direktori seperti LDAP. Lookup JNDI ke server jarak jauh bisa mengembalikan kelas untuk dimuat JVM.[1]
Injeksi ekspresi (CWE-917)- Data tak tepercaya mencapai pengevaluasi ekspresi, sehingga teks yang diberikan sebagai data dijalankan sebagai instruksi.[1]
Dependensi transitif- Pustaka yang ada di aplikasi Anda hanya karena pustaka lain membutuhkannya. Banyak paparan Log4Shell berasal dari salinan Log4j yang tidak pernah dicatat siapa pun.[4]
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-20 CWE-502 CWE-917
- D3-OTF Penyaringan Lalu Lintas Keluar — Pembatasan jaringan keluar dalam panduan ini membatasi tujuan yang dapat dijangkau layanan atau host.
- CISA KEV — ditambahkan 2021-12-10 — CVE-2021-44228
Kronologi Insiden
Chen Zhaojun dari Alibaba Cloud Security melaporkan celah ini secara privat kepada Apache.[1]
CISA mengeluarkan Emergency Directive 22-02 yang mewajibkan lembaga federal AS menemukan dan memitigasi Log4j.[3]
Log4j 2.17.1 memperbaiki CVE-2021-44832, yang terakhir dari tiga CVE lanjutan setelah 2.15.0 (bersama CVE-2021-45046 dan CVE-2021-45105).[1]
Alur Serangan Langkah demi Langkah
Teks penyerang mencapai panggilan log
Nilai apa pun yang dicatat aplikasi, seperti nama pengguna, header, atau kata pencarian, bisa membawa ekspresi lookup pilihan penyerang.[1]
Kode Sumber: Rentan vs Aman
Konfigurasi Maven ilustratif. Mengimpor log4j-bom membuat semua modul Log4j, termasuk salinan yang dibawa pustaka lain, diselesaikan ke satu versi terkini. Aturan enforcer lalu menggagalkan build jika masih ada log4j-core yang lebih lama dari 2.17.1 yang terjangkau, termasuk secara transitif, sehingga dependensi baru tidak bisa diam-diam membawa kembali kode yang rentan. Pembaruan adalah perbaikan sebenarnya; memblokir LDAP dan RMI keluar dari server aplikasi adalah pertahanan berlapis yang memutus eksploitasi bahkan di tempat patch terlambat.
<!-- pom.xml: a direct dependency pinned to a vulnerable release -->
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
<!-- Nothing stops another library from pulling in an older log4j-core transitively. -->
<!-- pom.xml: one version for every Log4j module, and a build that fails on old ones -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-bom</artifactId>
<version>2.24.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<id>ban-vulnerable-log4j</id>
<goals><goal>enforce</goal></goals>
<configuration>
<rules>
<bannedDependencies>
<searchTransitive>true</searchTransitive>
<excludes>
<exclude>org.apache.logging.log4j:log4j-core:[2.0-beta9,2.17.1)</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Perbarui log4j-core ke 2.17.1 atau lebih baru (2.12.4 di Java 7, 2.3.2 di Java 6), dan gagalkan build yang menyelesaikan versi lebih lama di mana pun dalam pohon dependensi.[1]
- ✓Buat SBOM di setiap build dan simpan bersama artefaknya, agar imbauan di masa depan dapat dicocokkan dengan layanan terdampak dalam hitungan menit.[4], [3]
- ✓Pindai artefak yang diterapkan, bukan hanya repositori kode: JAR yang di-shade dan dibundel menyembunyikan Log4j dari manifes dependensi di banyak produk.[4]
- ✓Terapkan penolakan lalu lintas keluar secara bawaan pada server aplikasi; eksploitasi membutuhkan LDAP, RMI, dan DNS keluar ke host sembarang.[4], [3]
- ✓Setelah cacat struktural diperbaiki, antisipasi CVE lanjutan dan biarkan insiden tetap terbuka sampai perbaikan vendor stabil.[1]
Sumber
- Apache Log4j — kerentanan keamanan (CVE-2021-44228 dan lanjutannya)
- CVE-2021-44228 — catatan CVE
- CISA — Emergency Directive 22-02: memitigasi kerentanan Apache Log4j
- CISA — panduan kerentanan Apache Log4j
- Apakah ObjectInputStream di Java aman untuk data tak tepercaya?
- Injeksi perintah — referensi lengkap kelas