Positive Development Community
3.14K subscribers
1.56K photos
268 videos
4 files
490 links
Download Telegram
Несправедливо конечно, что мемы публикуются тогда, когда неправильная часть пятницы заканчивается у админа, а не у всех остальных. С другой стороны, жизнь вообще несправедлива, а посмотреть мемы никогда не поздно 🙂

Всем чудесного завершения пятницы и классных выходных 🤗
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8💔43😁1
🔍 Наиболее интересные уязвимости

🐛 CVE-2026-28291, обнаруженная в simple-git (версии до 3.31.1 включительно), приводит к OS Command Injection. Проблема заключалась в обходе блокировки опасных опций через манипуляцию параметрами, что позволяло выполнять произвольные команды. В исправлении разработчики отказались от проверки только точного шаблона -u и добавили более общую проверку clone-опций через CLONE_OPTIONS и isCloneSwitch(), чтобы блокировать разные варианты передачи опасного параметра.

🐛 CVE-2026-30232, обнаруженная в Chartbrew (до версии 4.8.5), приводит к Server-side Request Forgery (SSRF). Уязвимость обусловлена тем, что аутентифицированный пользователь мог создать API connection с URL без проверки, что позволяло выполнять запросы к произвольным ресурсам. В исправлении был добавлен введён флаг allowPrivateHost, чтобы обращения к внутренним адресам больше не проходили по умолчанию и разрешались только явно.

🐛 CVE-2026-40351, обнаруженная в FastGPT (версии до 4.14.9.5), приводит к NoSQL injection. Проблема заключалась в использовании TypeScript type assertion без проверки на этапе выполнения, что позволяло передать оператор запроса MongoDB в поле пароля и обойти проверку. В исправлении была добавлена runtime-валидация тела запроса через zod, и поля username и password теперь принимаются только как строки.

🐛 CVE-2026-40491, обнаруженная в gdown (версии до 5.2.2), приводит к Path Traversal. Проблема заключалась в отсутствии проверки имен файлов в архивах ZIP или TAR, что позволяло записывать файлы за пределами целевой директории. В исправлении была добавлена санитизация с помощью _sanitize_filename(), проверка путей через realpath() и _is_within_directory().

🐛 CVE-2026-41242, обнаруженная в protobuf.js до версий 8.0.1 и 7.5.5, приводит к Remote Code Execution (RCE). Проблема заключалась в том, что злоумышленник мог внедрить произвольный код в поле type protobuf-определения, после чего этот код выполнялся во время декодирования объекта с использованием такого определения. В исправлении разработчики добавили фильтрацию имени типа через name.replace(/\W/g, ""), чтобы удалять все неалфавитно-цифровые символы перед дальнейшей обработкой.
👍3
🧩 Принципы и паттерны безопасной разработки: LSP

Часть 2.

Продолжаем разбор SOLID... на очереди — принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP). Формально он гласит: объекты подклассов должны быть способны заменить объекты базовых классов без нарушения корректности программы. Проще говоря, наследник не должен «ломать» контракт, установленный родителем — ни в предусловиях (не требовать большего), ни в постусловиях (не гарантировать меньшего), ни в инвариантах (не нарушать постоянных условий).

Что неочевидно для многих, благодаря дядюшке Мартину, так это то, что LSP является поведенческим принципом, а не структурным. Иными словами, чтобы нарушить его, наследование (да и ООП в целом) — вообще не нужно. Если у нас есть одна сущность, переопределяющая поведение другой, и при этом к ней можно обратиться, как к исходной — этого достаточно. Даже, если сущности — результат функциональной композиции, без каких-либо объектов в терминах ООП в целом. Пример того, как LSP выглядит в языках, не имеющих наследования, можно посмотреть тут.

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

Как правило, нарушения LSP могут повлечь за собой примерно любые уязвимости, так или иначе связанные с логикой работы приложения. «В природе», однако, чаще всего они относятся ко следующим категориям:

CWE-264: Permissions, Privileges, and Access Controls
CWE-284: Improper Access Control
CWE-290: Authentication Bypass by Spoofing
CWE-703: Improper Check or Handling of Exceptional Conditions

🐛 Жизненное

CVE-2025-22223 — Spring Security (Authentication Bypass by Spoofing).

Когда аннотация безопасности (@PreAuthorize) размещена на методе обобщённого суперкласса или интерфейса, и конкретный подкласс переопределяет этот метод, механизм UniqueSecurityAnnotationScanner не находит аннотацию на переопределённом методе. Причина -- использование targetClass.getDeclaredMethod(method.getName(), method.getParameterTypes()) для поиска, что не работает после стирания типов (type erasure): сигнатура родительского метода Object mutate(Object) не совпадает с сигнатурой конкретной реализации AccountSecret mutate(AccountSecret).

public abstract class BaseService<T> {
@PreAuthorize("hasRole('ADMIN')")
public abstract T getResource(Long id);
}

// Подкласс -- Spring Security не видит аннотацию
public class UserService extends BaseService<User> {
@Override
public User getResource(Long id) {
return userRepo.findById(id);
}
}

Нарушение LSP здесь в том, что родительский тип объявляет контракт «этот метод требует роли ADMIN». Подкласс переопределяет метод, и контракт безопасности молча пропадает. При подстановке подкласса вместо родителя предусловие (авторизация) ослабляется.

Патч (коммит dc2e1af). Наивный поиск getDeclaredMethod заменен на итерацию по всем методам класса с разрешением обобщённых типов.

❗️Что делать?

• Помечайте security-critical классы как final|sealed или явно контролируйте наследование.

• Аннотации безопасности дублируйте на каждом переопределяющем методе.

• Фильтруйте и определяйте сущности по их типу, а не по имени.

• Соблюдайте явным образом все поведенческие контракты переопределяемых методов.

• Обеспечивайте инварианты объекта даже при аварийном завершении конструктора или инициализации.

TL;DR: В целом, общий принцип один: если ваш код принимает сущность по ссылке на базовую реализацию, он неявно доверяет поведенческому контракту этой сущности. Убедитесь, что это обосновано — особенно на границах доверия между компонентами системы.
Please open Telegram to view this post
VIEW IN TELEGRAM
Есть особый челлендж в том, чтобы поймать тот скоротечный момент, когда неправильная часть пятницы уже закончилась, а правильная ещё не началась.

...и успеть в нём запостить мемы.

Всем приятного вечера и хорошенько отдохнуть на выходных! 🥳
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13👍83